Skip to content

Commit

Permalink
fix: ensure windows respect fullscreenability with different resizabi…
Browse files Browse the repository at this point in the history
…lity values (#39643)

* fix: ensure child windows respect fullscreenability/resizability when parent is fullscreen

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

* test: add an extra resize test

Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
  • Loading branch information
trop[bot] and codebytere committed Aug 28, 2023
1 parent b3912c6 commit 2c07dab
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 14 deletions.
24 changes: 10 additions & 14 deletions shell/browser/native_window_mac.mm
Expand Up @@ -837,23 +837,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() {
Expand Down
36 changes: 36 additions & 0 deletions spec/api-browser-window-spec.ts
Expand Up @@ -5038,6 +5038,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 = emittedOnce(w, 'enter-full-screen');
w.setFullScreen(true);
await enterFS;

const child = new BrowserWindow({ parent: w, resizable: false, fullscreenable: false });
const shown = emittedOnce(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', () => {
Expand Down

0 comments on commit 2c07dab

Please sign in to comment.