Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: maximized state calculation for non-resizable windows #31041

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/api/browser-window.md
Expand Up @@ -988,7 +988,7 @@ the player itself we would call this function with arguments of 16/9 and
are within the content view--only that they exist. Sum any extra width and
height areas you have within the overall content view.

The aspect ratio is not respected when window is resized programmingly with
The aspect ratio is not respected when window is resized programmatically with
APIs like `win.setSize`.

#### `win.setBackgroundColor(backgroundColor)`
Expand Down
14 changes: 14 additions & 0 deletions shell/browser/native_window_mac.h
Expand Up @@ -188,6 +188,19 @@ class NativeWindowMac : public NativeWindow,
bool zoom_to_page_width() const { return zoom_to_page_width_; }
bool always_simple_fullscreen() const { return always_simple_fullscreen_; }

// We need to save the result of windowWillUseStandardFrame:defaultFrame
// because macOS calls it with what it refers to as the "best fit" frame for a
// zoom. This means that even if an aspect ratio is set, macOS might adjust it
// to better fit the screen.
//
// Thus, we can't just calculate the maximized aspect ratio'd sizing from
// the current visible screen and compare that to the current window's frame
// to determine whether a window is maximized.
NSRect default_frame_for_zoom() const { return default_frame_for_zoom_; }
void set_default_frame_for_zoom(NSRect frame) {
default_frame_for_zoom_ = frame;
}

protected:
// views::WidgetDelegate:
views::View* GetContentsView() override;
Expand Down Expand Up @@ -263,6 +276,7 @@ class NativeWindowMac : public NativeWindow,
NSRect original_frame_;
NSInteger original_level_;
NSUInteger simple_fullscreen_mask_;
NSRect default_frame_for_zoom_;

std::string vibrancy_type_;

Expand Down
16 changes: 7 additions & 9 deletions shell/browser/native_window_mac.mm
Expand Up @@ -609,16 +609,14 @@ void ViewDidMoveToSuperview(NSView* self, SEL _cmd) {
}

bool NativeWindowMac::IsMaximized() {
if (([window_ styleMask] & NSWindowStyleMaskResizable) != 0) {
if (([window_ styleMask] & NSWindowStyleMaskResizable) != 0)
return [window_ isZoomed];
} else {
NSRect rectScreen = [[NSScreen mainScreen] visibleFrame];
NSRect rectWindow = [window_ frame];
return (rectScreen.origin.x == rectWindow.origin.x &&
rectScreen.origin.y == rectWindow.origin.y &&
rectScreen.size.width == rectWindow.size.width &&
rectScreen.size.height == rectWindow.size.height);
}

NSRect rectScreen = GetAspectRatio() > 0.0
? default_frame_for_zoom()
: [[NSScreen mainScreen] visibleFrame];

return NSEqualRects([window_ frame], rectScreen);
}

void NativeWindowMac::Minimize() {
Expand Down
8 changes: 7 additions & 1 deletion shell/browser/ui/cocoa/electron_ns_window_delegate.mm
Expand Up @@ -63,8 +63,11 @@ - (void)windowDidChangeOcclusionState:(NSNotification*)notification {
// menu to determine the "standard size" of the window.
- (NSRect)windowWillUseStandardFrame:(NSWindow*)window
defaultFrame:(NSRect)frame {
if (!shell_->zoom_to_page_width())
if (!shell_->zoom_to_page_width()) {
if (shell_->GetAspectRatio() > 0.0)
shell_->set_default_frame_for_zoom(frame);
return frame;
}

// If the shift key is down, maximize.
if ([[NSApp currentEvent] modifierFlags] & NSShiftKeyMask)
Expand All @@ -89,6 +92,9 @@ - (NSRect)windowWillUseStandardFrame:(NSWindow*)window
// Set the width. Don't touch y or height.
frame.size.width = zoomed_width;

if (shell_->GetAspectRatio() > 0.0)
shell_->set_default_frame_for_zoom(frame);

return frame;
}

Expand Down
18 changes: 18 additions & 0 deletions spec-main/api-browser-window-spec.ts
Expand Up @@ -1113,6 +1113,24 @@ describe('BrowserWindow module', () => {
await unmaximize;
expect(w.isMaximized()).to.equal(false);
});
it('returns the correct value for windows with an aspect ratio', async () => {
w.destroy();
w = new BrowserWindow({
show: false,
fullscreenable: false
});

w.setAspectRatio(16 / 11);

const maximize = emittedOnce(w, 'resize');
w.show();
w.maximize();
await maximize;

expect(w.isMaximized()).to.equal(true);
w.resizable = false;
expect(w.isMaximized()).to.equal(true);
});
});

ifdescribe(process.platform !== 'linux')('Minimized state', () => {
Expand Down