diff --git a/shell/browser/native_window_mac.mm b/shell/browser/native_window_mac.mm index 99f8c561f3a5e..7be4dfb888303 100644 --- a/shell/browser/native_window_mac.mm +++ b/shell/browser/native_window_mac.mm @@ -836,23 +836,19 @@ void ReorderChildWindowAbove(NSWindow* child_window, NSWindow* other_window) { ScopedDisableResize disable_resize; SetStyleMask(resizable, NSWindowStyleMaskResizable); + bool was_fullscreenable = IsFullScreenable(); + // Right now, resizable and fullscreenable are decoupled in // documentation and on Windows/Linux. Chromium disables - // fullscreenability if resizability is false on macOS as well - // as disabling the maximize traffic light unless the window - // is both resizable and maximizable. To work around this, we want - // to match behavior on other platforms by disabiliting the maximize - // button but keeping fullscreenability enabled. - // TODO(codebytere): refactor this once we have a better solution. + // fullscreen collection behavior as well as the maximize traffic + // light in SetCanResize if resizability is false on macOS unless + // the window is both resizable and maximizable. We want consistent + // cross-platform behavior, so if resizability is disabled we disable + // the maximize button and ensure fullscreenability matches user setting. SetCanResize(resizable); - if (!resizable) { - SetFullScreenable(true); - [[window_ standardWindowButton:NSWindowZoomButton] setEnabled:false]; - } else { - SetFullScreenable(true); - [[window_ standardWindowButton:NSWindowZoomButton] - setEnabled:IsFullScreenable()]; - } + SetFullScreenable(was_fullscreenable); + [[window_ standardWindowButton:NSWindowZoomButton] + setEnabled:resizable ? was_fullscreenable : false]; } bool NativeWindowMac::IsResizable() { diff --git a/spec/api-browser-window-spec.ts b/spec/api-browser-window-spec.ts index 58b04a341eb8f..237f03cf979aa 100644 --- a/spec/api-browser-window-spec.ts +++ b/spec/api-browser-window-spec.ts @@ -5449,6 +5449,42 @@ describe('BrowserWindow module', () => { expect(w.isFullScreenable()).to.be.true('isFullScreenable'); }); }); + + it('does not open non-fullscreenable child windows in fullscreen if parent is fullscreen', async () => { + const w = new BrowserWindow(); + + const enterFS = once(w, 'enter-full-screen'); + w.setFullScreen(true); + await enterFS; + + const child = new BrowserWindow({ parent: w, resizable: false, fullscreenable: false }); + const shown = once(child, 'show'); + await shown; + + expect(child.resizable).to.be.false('resizable'); + expect(child.fullScreen).to.be.false('fullscreen'); + expect(child.fullScreenable).to.be.false('fullscreenable'); + }); + + it('is set correctly with different resizable values', async () => { + const w1 = new BrowserWindow({ + resizable: false, + fullscreenable: false + }); + + const w2 = new BrowserWindow({ + resizable: true, + fullscreenable: false + }); + + const w3 = new BrowserWindow({ + fullscreenable: false + }); + + expect(w1.isFullScreenable()).to.be.false('isFullScreenable'); + expect(w2.isFullScreenable()).to.be.false('isFullScreenable'); + expect(w3.isFullScreenable()).to.be.false('isFullScreenable'); + }); }); ifdescribe(process.platform === 'darwin')('isHiddenInMissionControl state', () => {