diff --git a/patches/chromium/.patches b/patches/chromium/.patches index a67d5fc1e0..3d3006285a 100644 --- a/patches/chromium/.patches +++ b/patches/chromium/.patches @@ -125,7 +125,6 @@ feat_separate_content_settings_callback_for_sync_and_async_clipboard.patch fix_win32_synchronous_spellcheck.patch chore_grandfather_in_electron_views_and_delegates.patch refactor_patch_electron_permissiontypes_into_blink.patch -revert_views_remove_desktopwindowtreehostwin_window_enlargement.patch fix_add_macos_memory_query_fallback_to_avoid_crash.patch fix_resolve_dynamic_background_material_update_issue_on_windows_11.patch feat_add_support_for_embedder_snapshot_validation.patch diff --git a/patches/chromium/fix_resolve_dynamic_background_material_update_issue_on_windows_11.patch b/patches/chromium/fix_resolve_dynamic_background_material_update_issue_on_windows_11.patch index ec4809e051..edc2b45146 100644 --- a/patches/chromium/fix_resolve_dynamic_background_material_update_issue_on_windows_11.patch +++ b/patches/chromium/fix_resolve_dynamic_background_material_update_issue_on_windows_11.patch @@ -8,10 +8,10 @@ such as the background turning black when maximizing the window and dynamic background material settings not taking effect. diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc -index d1e06b675b19226cf3b78e1aada8d8f2d684fada..ce810555b8501797643987916a728cad8f5adaa5 100644 +index e4da40256ce94d6a0896792a8ef2faa18e1fa5d2..3a5833fcc018f32e86c0a95a42937fb9ac6c5a40 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc -@@ -184,6 +184,10 @@ void DesktopWindowTreeHostWin::FinishTouchDrag(gfx::Point screen_point) { +@@ -167,6 +167,10 @@ void DesktopWindowTreeHostWin::FinishTouchDrag(gfx::Point screen_point) { } } @@ -23,7 +23,7 @@ index d1e06b675b19226cf3b78e1aada8d8f2d684fada..ce810555b8501797643987916a728cad void DesktopWindowTreeHostWin::Init(const Widget::InitParams& params) { diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h -index a40bd9f25fa07a553c011cf19f155f8158f4ae5f..ae2baec731b5fcd8be97f2177d23b860d67ab8bc 100644 +index 27322ef34edf3fa8bfbd20b1baddcaf3b7555618..b8d1fa863fd05ebc3ab8ac5ef8c4d81361ce45fe 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h @@ -93,6 +93,8 @@ class VIEWS_EXPORT DesktopWindowTreeHostWin diff --git a/patches/chromium/revert_views_remove_desktopwindowtreehostwin_window_enlargement.patch b/patches/chromium/revert_views_remove_desktopwindowtreehostwin_window_enlargement.patch deleted file mode 100644 index 85b8eea012..0000000000 --- a/patches/chromium/revert_views_remove_desktopwindowtreehostwin_window_enlargement.patch +++ /dev/null @@ -1,285 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: John Kleinschmidt -Date: Sat, 14 Jun 2025 16:21:07 -0400 -Subject: Revert "[views] Remove DesktopWindowTreeHostWin::window_enlargement_" - -This reverts commit 1771dbae6961e7bb7c22bbc6c77f84d90ef2be46. - -Electron needs this patch to allow windows smaller than 64x64 -on Windows. We should refactor our code so that this patch isn't -necessary. - -diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json -index 988866d79a5d1dbd366ebdbff0e8eb2c0c498168..5761ac48be0a64618be0a94606149dd944e46e27 100644 ---- a/testing/variations/fieldtrial_testing_config.json -+++ b/testing/variations/fieldtrial_testing_config.json -@@ -22626,6 +22626,21 @@ - ] - } - ], -+ "TransparentHwndEnlargement": [ -+ { -+ "platforms": [ -+ "windows" -+ ], -+ "experiments": [ -+ { -+ "name": "DisableTransparentHwndEnlargement", -+ "disable_features": [ -+ "EnableTransparentHwndEnlargement" -+ ] -+ } -+ ] -+ } -+ ], - "TransportSecurityFileWriterScheduleAndroid": [ - { - "platforms": [ -diff --git a/ui/views/views_features.cc b/ui/views/views_features.cc -index 47077e16870889ef8f8c8b2adf58015bd5aff7fa..ba59e6e1609e61579bf49aca095490b083d72051 100644 ---- a/ui/views/views_features.cc -+++ b/ui/views/views_features.cc -@@ -30,6 +30,14 @@ BASE_FEATURE(kEnableInputProtection, base::FEATURE_DISABLED_BY_DEFAULT); - // crbug.com/370856871. - BASE_FEATURE(kEnableTouchDragCursorSync, base::FEATURE_ENABLED_BY_DEFAULT); - -+// Enables enlargement of HWNDs to a minimum size of 64x64 to handle reported -+// graphical glitches on certain hardware. -+// TODO(crbug.com/401996981): Remove this once enlargement is confirmed to no -+// longer be needed. -+BASE_FEATURE(kEnableTransparentHwndEnlargement, -+ "EnableTransparentHwndEnlargement", -+ base::FEATURE_DISABLED_BY_DEFAULT); -+ - // Used to enable keyboard-accessible tooltips in Views UI, as opposed - // to kKeyboardAccessibleTooltip in //ui/base/ui_base_features.cc. - BASE_FEATURE(kKeyboardAccessibleTooltipInViews, -diff --git a/ui/views/views_features.h b/ui/views/views_features.h -index 888a16fb6213eceb131ae636dc643d7f2d5bcad9..6077412165081cd4abeaf0b061feb2f795ee8131 100644 ---- a/ui/views/views_features.h -+++ b/ui/views/views_features.h -@@ -15,6 +15,7 @@ namespace views::features { - VIEWS_EXPORT BASE_DECLARE_FEATURE(kApplyInitialUrlToWebContents); - VIEWS_EXPORT BASE_DECLARE_FEATURE(kEnableInputProtection); - VIEWS_EXPORT BASE_DECLARE_FEATURE(kEnableTouchDragCursorSync); -+VIEWS_EXPORT BASE_DECLARE_FEATURE(kEnableTransparentHwndEnlargement); - VIEWS_EXPORT BASE_DECLARE_FEATURE(kKeyboardAccessibleTooltipInViews); - - } // namespace views::features -diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc -index e4da40256ce94d6a0896792a8ef2faa18e1fa5d2..d1e06b675b19226cf3b78e1aada8d8f2d684fada 100644 ---- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc -+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc -@@ -85,6 +85,23 @@ namespace { - // This constant controls how many pixels wide that border is. - const int kMouseCaptureRegionBorder = 5; - -+gfx::Size GetExpandedWindowSize(bool is_translucent, gfx::Size size) { -+ if (!base::FeatureList::IsEnabled( -+ features::kEnableTransparentHwndEnlargement) || -+ !is_translucent) { -+ return size; -+ } -+ -+ // Some AMD drivers can't display windows that are less than 64x64 pixels, -+ // so expand them to be at least that size. http://crbug.com/286609 -+ gfx::Size expanded(std::max(size.width(), 64), std::max(size.height(), 64)); -+ return expanded; -+} -+ -+void InsetBottomRight(gfx::Rect* rect, const gfx::Vector2d& vector) { -+ rect->Inset(gfx::Insets::TLBR(0, 0, vector.y(), vector.x())); -+} -+ - // Updates the cursor clip region. Used for mouse locking. - void UpdateMouseLockRegion(aura::Window* window, bool locked) { - if (!locked) { -@@ -342,9 +359,14 @@ bool DesktopWindowTreeHostWin::IsVisible() const { - } - - void DesktopWindowTreeHostWin::SetSize(const gfx::Size& size) { -- const gfx::Size size_in_pixels = -+ gfx::Size size_in_pixels = - display::win::GetScreenWin()->DIPToScreenSize(GetHWND(), size); -- message_handler_->SetSize(size_in_pixels); -+ gfx::Size expanded = -+ GetExpandedWindowSize(message_handler_->is_translucent(), size_in_pixels); -+ window_enlargement_ = -+ gfx::Vector2d(expanded.width() - size_in_pixels.width(), -+ expanded.height() - size_in_pixels.height()); -+ message_handler_->SetSize(expanded); - } - - void DesktopWindowTreeHostWin::StackAbove(aura::Window* window) { -@@ -359,30 +381,40 @@ void DesktopWindowTreeHostWin::StackAtTop() { - } - - void DesktopWindowTreeHostWin::CenterWindow(const gfx::Size& size) { -- const gfx::Size size_in_pixels = -+ gfx::Size size_in_pixels = - display::win::GetScreenWin()->DIPToScreenSize(GetHWND(), size); -- message_handler_->CenterWindow(size_in_pixels); -+ gfx::Size expanded_size; -+ expanded_size = -+ GetExpandedWindowSize(message_handler_->is_translucent(), size_in_pixels); -+ window_enlargement_ = -+ gfx::Vector2d(expanded_size.width() - size_in_pixels.width(), -+ expanded_size.height() - size_in_pixels.height()); -+ message_handler_->CenterWindow(expanded_size); - } - - void DesktopWindowTreeHostWin::GetWindowPlacement( - gfx::Rect* bounds, - ui::mojom::WindowShowState* show_state) const { - message_handler_->GetWindowPlacement(bounds, show_state); -+ InsetBottomRight(bounds, window_enlargement_); - *bounds = display::win::GetScreenWin()->ScreenToDIPRect(GetHWND(), *bounds); - } - - gfx::Rect DesktopWindowTreeHostWin::GetWindowBoundsInScreen() const { - gfx::Rect pixel_bounds = message_handler_->GetWindowBoundsInScreen(); -+ InsetBottomRight(&pixel_bounds, window_enlargement_); - return display::win::GetScreenWin()->ScreenToDIPRect(GetHWND(), pixel_bounds); - } - - gfx::Rect DesktopWindowTreeHostWin::GetClientAreaBoundsInScreen() const { - gfx::Rect pixel_bounds = message_handler_->GetClientAreaBoundsInScreen(); -+ InsetBottomRight(&pixel_bounds, window_enlargement_); - return display::win::GetScreenWin()->ScreenToDIPRect(GetHWND(), pixel_bounds); - } - - gfx::Rect DesktopWindowTreeHostWin::GetRestoredBounds() const { - gfx::Rect pixel_bounds = message_handler_->GetRestoredBounds(); -+ InsetBottomRight(&pixel_bounds, window_enlargement_); - return display::win::GetScreenWin()->ScreenToDIPRect(GetHWND(), pixel_bounds); - } - -@@ -701,37 +733,44 @@ void DesktopWindowTreeHostWin::HideImpl() { - // other get/set methods work in DIP. - - gfx::Rect DesktopWindowTreeHostWin::GetBoundsInPixels() const { -- const gfx::Rect bounds_px(message_handler_->GetClientAreaBounds()); -+ gfx::Rect bounds(message_handler_->GetClientAreaBounds()); - // If the window bounds were expanded we need to return the original bounds - // To achieve this we do the reverse of the expansion, i.e. add the - // window_expansion_top_left_delta_ to the origin and subtract the - // window_expansion_bottom_right_delta_ from the width and height. -- const gfx::Rect without_expansion_bounds_px( -- bounds_px.x() + window_expansion_top_left_delta_.x(), -- bounds_px.y() + window_expansion_top_left_delta_.y(), -- bounds_px.width() - window_expansion_bottom_right_delta_.x(), -- bounds_px.height() - window_expansion_bottom_right_delta_.y()); -- return without_expansion_bounds_px; -+ gfx::Rect without_expansion( -+ bounds.x() + window_expansion_top_left_delta_.x(), -+ bounds.y() + window_expansion_top_left_delta_.y(), -+ bounds.width() - window_expansion_bottom_right_delta_.x() - -+ window_enlargement_.x(), -+ bounds.height() - window_expansion_bottom_right_delta_.y() - -+ window_enlargement_.y()); -+ return without_expansion; - } - --void DesktopWindowTreeHostWin::SetBoundsInPixels( -- const gfx::Rect& bounds_in_pixels) { -+void DesktopWindowTreeHostWin::SetBoundsInPixels(const gfx::Rect& bounds) { - // If the window bounds have to be expanded we need to subtract the - // window_expansion_top_left_delta_ from the origin and add the - // window_expansion_bottom_right_delta_ to the width and height -- const gfx::Size old_content_size_px = GetBoundsInPixels().size(); -- -- const gfx::Rect expanded_bounds_px( -- bounds_in_pixels.x() - window_expansion_top_left_delta_.x(), -- bounds_in_pixels.y() - window_expansion_top_left_delta_.y(), -- bounds_in_pixels.width() + window_expansion_bottom_right_delta_.x(), -- bounds_in_pixels.height() + window_expansion_bottom_right_delta_.y()); -- -- // When `expanded_bounds_px` causes the window to be moved to a display with a -+ gfx::Size old_content_size = GetBoundsInPixels().size(); -+ -+ gfx::Rect expanded( -+ bounds.x() - window_expansion_top_left_delta_.x(), -+ bounds.y() - window_expansion_top_left_delta_.y(), -+ bounds.width() + window_expansion_bottom_right_delta_.x(), -+ bounds.height() + window_expansion_bottom_right_delta_.y()); -+ -+ gfx::Rect new_expanded( -+ expanded.origin(), -+ GetExpandedWindowSize(message_handler_->is_translucent(), -+ expanded.size())); -+ window_enlargement_ = -+ gfx::Vector2d(new_expanded.width() - expanded.width(), -+ new_expanded.height() - expanded.height()); -+ // When |new_expanded| causes the window to be moved to a display with a - // different DSF, HWNDMessageHandler::OnDpiChanged() will be called and the - // window size will be scaled automatically. -- message_handler_->SetBounds(expanded_bounds_px, -- old_content_size_px != bounds_in_pixels.size()); -+ message_handler_->SetBounds(new_expanded, old_content_size != bounds.size()); - } - - gfx::Rect -@@ -943,18 +982,26 @@ int DesktopWindowTreeHostWin::GetNonClientComponent( - - void DesktopWindowTreeHostWin::GetWindowMask(const gfx::Size& size_px, - SkPath* path) { -- Widget* widget = GetWidget(); -- if (!widget || !widget->non_client_view()) { -- return; -- } -+ // Request the window mask for hwnd of `size_px`. The hwnd size must be -+ // adjusted by `window_enlargement` to return to the client-expected window -+ // size (see crbug.com/41047830). -+ const gfx::Size adjusted_size_in_px = -+ size_px - gfx::Size(window_enlargement_.x(), window_enlargement_.y()); - -- widget->non_client_view()->GetWindowMask( -- display::win::GetScreenWin()->ScreenToDIPSize(GetHWND(), size_px), path); -- // Convert path in DIPs to pixels. -- if (!path->isEmpty()) { -- const float scale = -- display::win::GetScreenWin()->GetScaleFactorForHWND(GetHWND()); -- *path = path->makeTransform(SkMatrix::Scale(scale, scale)); -+ if (Widget* widget = GetWidget(); widget && widget->non_client_view()) { -+ widget->non_client_view()->GetWindowMask( -+ display::win::GetScreenWin()->ScreenToDIPSize(GetHWND(), -+ adjusted_size_in_px), -+ path); -+ // Convert path in DIPs to pixels. -+ if (!path->isEmpty()) { -+ const float scale = -+ display::win::GetScreenWin()->GetScaleFactorForHWND(GetHWND()); -+ *path = path->makeTransform(SkMatrix::Scale(scale, scale)); -+ } -+ } else if (!window_enlargement_.IsZero()) { -+ *path = SkPath::Rect(SkRect::MakeXYWH(0, 0, adjusted_size_in_px.width(), -+ adjusted_size_in_px.height())); - } - } - -diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h -index 27322ef34edf3fa8bfbd20b1baddcaf3b7555618..a40bd9f25fa07a553c011cf19f155f8158f4ae5f 100644 ---- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h -+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h -@@ -175,7 +175,7 @@ class VIEWS_EXPORT DesktopWindowTreeHostWin - void ShowImpl() override; - void HideImpl() override; - gfx::Rect GetBoundsInPixels() const override; -- void SetBoundsInPixels(const gfx::Rect& bounds_in_pixels) override; -+ void SetBoundsInPixels(const gfx::Rect& bounds) override; - gfx::Rect GetBoundsInAcceleratedWidgetPixelCoordinates() override; - gfx::Point GetLocationOnScreenInPixels() const override; - void SetCapture() override; -@@ -330,6 +330,12 @@ class VIEWS_EXPORT DesktopWindowTreeHostWin - gfx::Vector2d window_expansion_top_left_delta_; - gfx::Vector2d window_expansion_bottom_right_delta_; - -+ // Windows are enlarged to be at least 64x64 pixels, so keep track of the -+ // extra added here. -+ // TODO(crbug.com/401996981): This is likely no longer necessary and should be -+ // removed. -+ gfx::Vector2d window_enlargement_; -+ - // Whether the window close should be converted to a hide, and then actually - // closed on the completion of the hide animation. This is cached because - // the property is set on the contained window which has a shorter lifetime. diff --git a/shell/browser/feature_list.cc b/shell/browser/feature_list.cc index 4e100e0285..a0ad450af8 100644 --- a/shell/browser/feature_list.cc +++ b/shell/browser/feature_list.cc @@ -34,10 +34,6 @@ #include "printing/printing_features.h" #endif -#if BUILDFLAG(IS_WIN) -#include "ui/views/views_features.h" -#endif - namespace electron { void InitializeFeatureList() { @@ -71,13 +67,6 @@ void InitializeFeatureList() { blink::features::kDropInputEventsWhilePaintHolding.name; #if BUILDFLAG(IS_WIN) - // Refs https://issues.chromium.org/issues/401996981 - // TODO(deepak1556): Remove this once test added in - // https://github.com/electron/electron/pull/12904 - // can work without this feature. - enable_features += std::string(",") + - views::features::kEnableTransparentHwndEnlargement.name; - // See https://chromium-review.googlesource.com/c/chromium/src/+/7204292 // This feature causes the following sandbox failure on Windows: // sandbox\policy\win\sandbox_win.cc:777 Sandbox cannot access executable diff --git a/shell/browser/native_window.cc b/shell/browser/native_window.cc index af34bd5d87..fbb0974558 100644 --- a/shell/browser/native_window.cc +++ b/shell/browser/native_window.cc @@ -31,11 +31,6 @@ #include "shell/browser/ui/views/frameless_view.h" #endif -#if BUILDFLAG(IS_WIN) -#include "ui/display/win/screen_win.h" -#include "ui/views/views_features.h" -#endif - #if defined(USE_OZONE) #include "ui/base/ui_base_features.h" #include "ui/ozone/public/ozone_platform.h" @@ -71,31 +66,6 @@ struct Converter { namespace electron { -namespace { - -#if BUILDFLAG(IS_WIN) -gfx::Size GetExpandedWindowSize(const NativeWindow* window, - bool transparent, - gfx::Size size) { - if (!base::FeatureList::IsEnabled( - views::features::kEnableTransparentHwndEnlargement) || - !transparent) { - return size; - } - - gfx::Size min_size = display::win::GetScreenWin()->ScreenToDIPSize( - window->GetAcceleratedWidget(), gfx::Size{64, 64}); - - // Some AMD drivers can't display windows that are less than 64x64 pixels, - // so expand them to be at least that size. http://crbug.com/286609 - gfx::Size expanded(std::max(size.width(), min_size.width()), - std::max(size.height(), min_size.height())); - return expanded; -} -#endif - -} // namespace - NativeWindow::NativeWindow(const int32_t base_window_id, const gin_helper::Dictionary& options, NativeWindow* parent) @@ -398,15 +368,7 @@ gfx::Size NativeWindow::GetContentMinimumSize() const { } gfx::Size NativeWindow::GetContentMaximumSize() const { - const auto size_constraints = GetContentSizeConstraints(); - gfx::Size maximum_size = size_constraints.GetMaximumSize(); - -#if BUILDFLAG(IS_WIN) - if (size_constraints.HasMaximumSize()) - maximum_size = GetExpandedWindowSize(this, transparent(), maximum_size); -#endif - - return maximum_size; + return GetContentSizeConstraints().GetMaximumSize(); } void NativeWindow::SetSheetOffset(const double offsetX, const double offsetY) { diff --git a/spec/api-browser-window-spec.ts b/spec/api-browser-window-spec.ts index 397a960686..2e562ab6c7 100755 --- a/spec/api-browser-window-spec.ts +++ b/spec/api-browser-window-spec.ts @@ -5641,21 +5641,6 @@ describe('BrowserWindow module', () => { expectBoundsEqual(w.getSize(), [400, 300]); }); - ifit(process.platform !== 'darwin')('works for a window smaller than 64x64', () => { - const w = new BrowserWindow({ - show: false, - frame: false, - resizable: false, - transparent: true - }); - w.setContentSize(60, 60); - expectBoundsEqual(w.getContentSize(), [60, 60]); - w.setContentSize(30, 30); - expectBoundsEqual(w.getContentSize(), [30, 30]); - w.setContentSize(10, 10); - expectBoundsEqual(w.getContentSize(), [10, 10]); - }); - ifit(process.platform === 'win32')('do not change window with frame bounds when maximized', () => { const w = new BrowserWindow({ show: true,