From 7f51178371e9a3f4c098436ec3ef8a18316fad73 Mon Sep 17 00:00:00 2001 From: Mitchell Cohen Date: Fri, 1 May 2026 17:06:40 -0400 Subject: [PATCH] fix: ensure stable bounds on Windows when toggling setResizable for frameless windows (#51427) --- shell/browser/ui/views/win_frame_view.cc | 3 +-- .../win/electron_desktop_window_tree_host_win.cc | 7 ++++--- spec/api-browser-window-spec.ts | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/shell/browser/ui/views/win_frame_view.cc b/shell/browser/ui/views/win_frame_view.cc index 2193492b3c..0ff50e3046 100644 --- a/shell/browser/ui/views/win_frame_view.cc +++ b/shell/browser/ui/views/win_frame_view.cc @@ -295,8 +295,7 @@ gfx::Size WinFrameView::GetMaximumSize() const { } gfx::Insets WinFrameView::RestoredFrameBorderInsets() const { - if (window_->has_frame() || !window_->has_thick_frame() || - !window_->IsResizable()) + if (window_->has_frame() || !window_->has_thick_frame()) return {}; const int thickness = diff --git a/shell/browser/ui/win/electron_desktop_window_tree_host_win.cc b/shell/browser/ui/win/electron_desktop_window_tree_host_win.cc index fbd5b2a45e..ba68f7c117 100644 --- a/shell/browser/ui/win/electron_desktop_window_tree_host_win.cc +++ b/shell/browser/ui/win/electron_desktop_window_tree_host_win.cc @@ -124,10 +124,11 @@ bool ElectronDesktopWindowTreeHostWin::GetClientAreaInsets( // monitors with different DPIs before changing this code. *insets = gfx::Insets::TLBR(thickness, thickness, thickness, thickness); return true; - } else if (native_window_view_->has_thick_frame() && - native_window_view_->IsResizable()) { + } else if (native_window_view_->has_thick_frame()) { // Grow the insets to support resize targets past the frame edge like in - // windows with standard frames. + // windows with standard frames. Non-resizable windows still get input + // insets for stable bounds and so they can be dragged from outer edges, + // also like in windows with standard frames. *insets = gfx::Insets::TLBR(0, thickness, thickness, thickness); return true; } diff --git a/spec/api-browser-window-spec.ts b/spec/api-browser-window-spec.ts index 7a231f1744..3a1019456b 100755 --- a/spec/api-browser-window-spec.ts +++ b/spec/api-browser-window-spec.ts @@ -5564,6 +5564,20 @@ describe('BrowserWindow module', () => { expectBoundsEqual(w.getContentSize(), [10, 10]); }); + it('does not change window size when disabled and enabled for frameless window', () => { + const w = new BrowserWindow({ + show: false, + width: 400, + height: 300, + frame: false + }); + + w.setResizable(false); + expectBoundsEqual(w.getSize(), [400, 300]); + w.setResizable(true); + expectBoundsEqual(w.getSize(), [400, 300]); + }); + ifit(process.platform === 'win32')('do not change window with frame bounds when maximized', () => { const w = new BrowserWindow({ show: true,