diff --git a/shell/browser/native_window_mac.h b/shell/browser/native_window_mac.h index 2728414379237..ae1e845c8a182 100644 --- a/shell/browser/native_window_mac.h +++ b/shell/browser/native_window_mac.h @@ -267,6 +267,8 @@ class NativeWindowMac : public NativeWindow, // Maximizable window state; necessary for persistence through redraws. bool maximizable_ = true; + bool user_set_bounds_maximized_ = false; + // Simple (pre-Lion) Fullscreen Settings bool always_simple_fullscreen_ = false; bool is_simple_fullscreen_ = false; diff --git a/shell/browser/native_window_mac.mm b/shell/browser/native_window_mac.mm index 04cca2461f5bc..7ed794206322e 100644 --- a/shell/browser/native_window_mac.mm +++ b/shell/browser/native_window_mac.mm @@ -622,7 +622,18 @@ void ViewDidMoveToSuperview(NSView* self, SEL _cmd) { } void NativeWindowMac::Unmaximize() { - if (!IsMaximized()) + // Bail if the last user set bounds were the same size as the window + // screen (e.g. the user set the window to maximized via setBounds) + // + // Per docs during zoom: + // > If there’s no saved user state because there has been no previous + // > zoom,the size and location of the window don’t change. + // + // However, in classic Apple fashion, this is not the case in practice, + // and the frame inexplicably becomes very tiny. We should prevent + // zoom from being called if the window is being unmaximized and its + // unmaximized window bounds are themselves functionally maximized. + if (!IsMaximized() || user_set_bounds_maximized_) return; [window_ zoom:nil]; @@ -724,6 +735,7 @@ void ViewDidMoveToSuperview(NSView* self, SEL _cmd) { cocoa_bounds.origin.y = NSHeight([screen frame]) - size.height() - bounds.y(); [window_ setFrame:cocoa_bounds display:YES animate:animate]; + user_set_bounds_maximized_ = IsMaximized() ? true : false; } gfx::Rect NativeWindowMac::GetBounds() { diff --git a/spec-main/api-browser-window-spec.ts b/spec-main/api-browser-window-spec.ts index 4c9f451a5952d..d783cde6b8883 100644 --- a/spec-main/api-browser-window-spec.ts +++ b/spec-main/api-browser-window-spec.ts @@ -3634,6 +3634,22 @@ describe('BrowserWindow module', () => { expectBoundsEqual(w.getSize(), initialSize); expectBoundsEqual(w.getPosition(), initialPosition); }); + + ifit(process.platform === 'darwin')('should not change size or position of a window which is functionally maximized', async () => { + const { workArea } = screen.getPrimaryDisplay(); + + const bounds = { + x: workArea.x, + y: workArea.y, + width: workArea.width, + height: workArea.height + }; + + const w = new BrowserWindow(bounds); + w.unmaximize(); + await delay(1000); + expectBoundsEqual(w.getBounds(), bounds); + }); }); describe('setFullScreen(false)', () => {