Browse Source

fix: `resizable: false` should disable fullscreen button at start (#39228)

fix: resizable should disable fullscreen button at start

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <[email protected]>
trop[bot] 1 year ago
parent
commit
db7acc9fc0
2 changed files with 26 additions and 6 deletions
  1. 9 6
      shell/browser/native_window.cc
  2. 17 0
      shell/browser/native_window_mac.mm

+ 9 - 6
shell/browser/native_window.cc

@@ -198,10 +198,6 @@ void NativeWindow::InitFromOptions(const gin_helper::Dictionary& options) {
     SetSizeConstraints(size_constraints);
   }
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
-  bool resizable;
-  if (options.Get(options::kResizable, &resizable)) {
-    SetResizable(resizable);
-  }
   bool closable;
   if (options.Get(options::kClosable, &closable)) {
     SetClosable(closable);
@@ -223,6 +219,7 @@ void NativeWindow::InitFromOptions(const gin_helper::Dictionary& options) {
   if (options.Get(options::kAlwaysOnTop, &top) && top) {
     SetAlwaysOnTop(ui::ZOrderLevel::kFloatingWindow);
   }
+
   bool fullscreenable = true;
   bool fullscreen = false;
   if (options.Get(options::kFullscreen, &fullscreen) && !fullscreen) {
@@ -231,12 +228,18 @@ void NativeWindow::InitFromOptions(const gin_helper::Dictionary& options) {
     fullscreenable = false;
 #endif
   }
-  // Overridden by 'fullscreenable'.
+
   options.Get(options::kFullScreenable, &fullscreenable);
   SetFullScreenable(fullscreenable);
-  if (fullscreen) {
+
+  if (fullscreen)
     SetFullScreen(true);
+
+  bool resizable;
+  if (options.Get(options::kResizable, &resizable)) {
+    SetResizable(resizable);
   }
+
   bool skip;
   if (options.Get(options::kSkipTaskbar, &skip)) {
     SetSkipTaskbar(skip);

+ 17 - 0
shell/browser/native_window_mac.mm

@@ -821,7 +821,24 @@ void NativeWindowMac::MoveTop() {
 void NativeWindowMac::SetResizable(bool resizable) {
   ScopedDisableResize disable_resize;
   SetStyleMask(resizable, NSWindowStyleMaskResizable);
+
+  // 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.
   SetCanResize(resizable);
+  if (!resizable) {
+    SetFullScreenable(true);
+    [[window_ standardWindowButton:NSWindowZoomButton] setEnabled:false];
+  } else {
+    SetFullScreenable(true);
+    [[window_ standardWindowButton:NSWindowZoomButton]
+        setEnabled:IsFullScreenable()];
+  }
 }
 
 bool NativeWindowMac::IsResizable() {