fix: display id order validation on certain versions of Windows 10 (#46873)

* fix: display id order validation on certain versions of Windows 10

* chore:clean up monitor patch

---------

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>
This commit is contained in:
Robo 2025-05-01 09:21:29 +09:00 committed by GitHub
parent b27a5f1cde
commit 8275aa98ca
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 110 additions and 0 deletions

View file

@ -147,3 +147,5 @@ chore_remove_conflicting_allow_unsafe_libc_calls.patch
fix_take_snapped_status_into_account_when_showing_a_window.patch
chore_modify_chromium_handling_of_mouse_events.patch
mac_fix_check_on_ime_reconversion_due_to_invalid_replacement_range.patch
windows_retrieve_primary_monitor_information_early.patch
do_not_check_the_order_of_display_id_order_on_windows.patch

View file

@ -0,0 +1,68 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Mitsuru Oshima <oshima@chromium.org>
Date: Thu, 17 Apr 2025 16:49:21 -0700
Subject: Do not check the order of Display ID order on Windows
Id is generated by Windows side logic so this rule isn't applicable.
Bug: 394622418
Change-Id: I79c7f91103c6b752b6a7a123aacd3573a9ab815f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6471333
Reviewed-by: Vincent Chiang <vincentchiang@chromium.org>
Commit-Queue: Mitsuru Oshima <oshima@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1448671}
diff --git a/ui/display/display_layout.cc b/ui/display/display_layout.cc
index 0d3746d8174868b743990b5ab10b3506819ef0ea..85d5c06851148576ab4dd272918215335292b4aa 100644
--- a/ui/display/display_layout.cc
+++ b/ui/display/display_layout.cc
@@ -500,6 +500,7 @@ void DisplayLayout::ApplyToDisplayList(Displays* display_list,
if (!DisplayLayout::Validate(DisplayListToDisplayIdList(*display_list),
*this)) {
// Prevent invalid and non-relevant display layouts.
+ LOG(ERROR) << "Invalid Display Layout";
return;
}
@@ -549,15 +550,19 @@ bool DisplayLayout::Validate(const DisplayIdList& list,
bool has_primary_as_parent = false;
// The placement list must be sorted by the first 8 bits of the display IDs.
+#if BUILDFLAG(IS_CHROMEOS)
int64_t prev_id = std::numeric_limits<int8_t>::min();
+#endif // BUILDFLAG(IS_CHROMEOS)
for (const auto& placement : layout.placement_list) {
- // Placements are sorted by display_id.
+#if BUILDFLAG(IS_CHROMEOS)
+ // Placements are sorted by display_id on ChromeOS.
if (prev_id >= (placement.display_id & 0xFF)) {
DISPLAY_LOG(ERROR) << "PlacementList must be sorted by first 8 bits of"
<< " display_id ";
return false;
}
prev_id = (placement.display_id & 0xFF);
+#endif // BUILDFLAG(IS_CHROMEOS)
if (placement.display_id == kInvalidDisplayId) {
DISPLAY_LOG(ERROR) << "display_id is not initialized";
return false;
diff --git a/ui/display/display_layout_unittest.cc b/ui/display/display_layout_unittest.cc
index 68327c8a6b71853a0f1bf3c0351e38865bcbe054..4ea830ef086eb009c692a0b90b100eaaed303fd0 100644
--- a/ui/display/display_layout_unittest.cc
+++ b/ui/display/display_layout_unittest.cc
@@ -122,6 +122,7 @@ TEST(DisplayLayoutTest, SwapPrimaryDisplayThreeDisplays) {
EXPECT_EQ(Position::RIGHT, layout->placement_list[1].position);
}
+#if BUILDFLAG(IS_CHROMEOS)
// Makes sure that only the least significant 8 bits of the display IDs in the
// placement lists are used to validate their sort order.
TEST(DisplayLayoutTest, PlacementSortOrder) {
@@ -148,6 +149,8 @@ TEST(DisplayLayoutTest, PlacementSortOrder) {
EXPECT_TRUE(DisplayLayout::Validate({456, 0x0504, 0x0605, 0x0406}, *layout));
}
+#endif // BUILDFLAG(IS_CHROMEOS)
+
namespace {
class TwoDisplays

View file

@ -0,0 +1,40 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Mitsuru Oshima <oshima@chromium.org>
Date: Tue, 4 Mar 2025 12:58:08 -0800
Subject: Retrieve primary monitor information early
This is a speculative workaround for the issue observed on the older
version of Windows 10.
Bug: 394622418
Change-Id: Ibda160b1a10e0619bbc837a8a50206db8faab361
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6321426
Commit-Queue: Mitsuru Oshima <oshima@chromium.org>
Reviewed-by: Robert Liao <robliao@chromium.org>
Reviewed-by: Mitsuru Oshima <oshima@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1427929}
diff --git a/ui/display/win/screen_win.cc b/ui/display/win/screen_win.cc
index 0d277625e3b827f4cf7dfb693bd518d46fc5f377..5cc792faaa062aa18c4dbb194958ab3648c12c6d 100644
--- a/ui/display/win/screen_win.cc
+++ b/ui/display/win/screen_win.cc
@@ -899,6 +899,10 @@ gfx::Rect ScreenWin::DIPToScreenRectInWindow(gfx::NativeWindow window,
void ScreenWin::UpdateFromDisplayInfos(
const std::vector<internal::DisplayInfo>& display_infos) {
+ // Retrieve the primary monitor info here, instead of later below. This is a
+ // speculative workaround for the issue observed on older version of Windows
+ // 10. See crbug.com/394622418 for more detail.
+ auto primary_monitor = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY);
auto new_screen_win_displays = DisplayInfosToScreenWinDisplays(
display_infos, color_profile_reader_.get(), dxgi_info_.get());
@@ -932,7 +936,7 @@ void ScreenWin::UpdateFromDisplayInfos(
// This primary information is used only to detect if another monitor has
// became the primary monitor.
- primary_monitor_ = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY);
+ primary_monitor_ = primary_monitor;
const std::optional<MONITORINFOEX> primary_monitor_info =
MonitorInfoFromHMONITOR(primary_monitor_);