From 63d2c9c9d12cff0c858ceacbf7055132829c2a87 Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 14:12:04 -0400 Subject: [PATCH] fix: account for extraSize in aspect ratio min/max clamping on macOS (#50836) Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: clavin --- .../ui/cocoa/electron_ns_window_delegate.mm | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/shell/browser/ui/cocoa/electron_ns_window_delegate.mm b/shell/browser/ui/cocoa/electron_ns_window_delegate.mm index 888946b3d0..a69cdde687 100644 --- a/shell/browser/ui/cocoa/electron_ns_window_delegate.mm +++ b/shell/browser/ui/cocoa/electron_ns_window_delegate.mm @@ -158,45 +158,43 @@ using TitleBarStyle = electron::NativeWindowMac::TitleBarStyle; windowSize.width() - contentSize.width() + extraSize.width(); double extraHeightPlusFrame = titleBarHeight + extraSize.height(); - newSize.width = - roundf((frameSize.height - extraHeightPlusFrame) * aspectRatio + - extraWidthPlusFrame); - newSize.height = - roundf((newSize.width - extraWidthPlusFrame) / aspectRatio + - extraHeightPlusFrame); + auto widthForHeight = [&](double h) { + return (h - extraHeightPlusFrame) * aspectRatio + extraWidthPlusFrame; + }; + auto heightForWidth = [&](double w) { + return (w - extraWidthPlusFrame) / aspectRatio + extraHeightPlusFrame; + }; + + newSize.width = roundf(widthForHeight(frameSize.height)); + newSize.height = roundf(heightForWidth(newSize.width)); // Clamp to minimum width/height while ensuring aspect ratio remains. NSSize minSize = [window minSize]; NSSize zeroSize = shell_->has_frame() ? NSMakeSize(0, titleBarHeight) : NSZeroSize; if (!NSEqualSizes(minSize, zeroSize)) { - double minWidthForAspectRatio = - (minSize.height - titleBarHeight) * aspectRatio; bool atMinHeight = minSize.height > zeroSize.height && newSize.height <= minSize.height; - newSize.width = atMinHeight ? minWidthForAspectRatio + newSize.width = atMinHeight ? widthForHeight(minSize.height) : std::max(newSize.width, minSize.width); - double minHeightForAspectRatio = minSize.width / aspectRatio; bool atMinWidth = minSize.width > zeroSize.width && newSize.width <= minSize.width; - newSize.height = atMinWidth ? minHeightForAspectRatio + newSize.height = atMinWidth ? heightForWidth(minSize.width) : std::max(newSize.height, minSize.height); } // Clamp to maximum width/height while ensuring aspect ratio remains. NSSize maxSize = [window maxSize]; if (!NSEqualSizes(maxSize, NSMakeSize(FLT_MAX, FLT_MAX))) { - double maxWidthForAspectRatio = maxSize.height * aspectRatio; bool atMaxHeight = maxSize.height < FLT_MAX && newSize.height >= maxSize.height; - newSize.width = atMaxHeight ? maxWidthForAspectRatio + newSize.width = atMaxHeight ? widthForHeight(maxSize.height) : std::min(newSize.width, maxSize.width); - double maxHeightForAspectRatio = maxSize.width / aspectRatio; bool atMaxWidth = maxSize.width < FLT_MAX && newSize.width >= maxSize.width; - newSize.height = atMaxWidth ? maxHeightForAspectRatio + newSize.height = atMaxWidth ? heightForWidth(maxSize.width) : std::min(newSize.height, maxSize.height); } }