Browse Source

fix: calculate frame when setting window placement (#25057)

Cheng Zhao 4 years ago
parent
commit
ad66542cf7

+ 2 - 2
shell/browser/native_window_views.h

@@ -273,8 +273,8 @@ class NativeWindowViews : public NativeWindow,
   // Set to true if the window is always on top and behind the task bar.
   bool behind_task_bar_ = false;
 
-  // Whether to block Chromium from handling window messages.
-  bool block_chromium_message_handler_ = false;
+  // Whether we want to set window placement without side effect.
+  bool is_setting_window_placement_ = false;
 #endif
 
   // Handles unhandled keyboard messages coming back from the renderer process.

+ 11 - 6
shell/browser/native_window_views_win.cc

@@ -180,11 +180,16 @@ bool NativeWindowViews::PreHandleMSG(UINT message,
                                      LRESULT* result) {
   NotifyWindowMessage(message, w_param, l_param);
 
-  // See code below for why blocking Chromium from handling messages.
-  if (block_chromium_message_handler_) {
-    // Handle the message with default proc.
+  // Avoid side effects when calling SetWindowPlacement.
+  if (is_setting_window_placement_) {
+    // Let Chromium handle the WM_NCCALCSIZE message otherwise the window size
+    // would be wrong.
+    // See https://github.com/electron/electron/issues/22393 for more.
+    if (message == WM_NCCALCSIZE)
+      return false;
+    // Otherwise handle the message with default proc,
     *result = DefWindowProc(GetAcceleratedWidget(), message, w_param, l_param);
-    // Tell Chromium to ignore this message.
+    // and tell Chromium to ignore this message.
     return true;
   }
 
@@ -239,9 +244,9 @@ bool NativeWindowViews::PreHandleMSG(UINT message,
         // messages until the SetWindowPlacement call is done.
         //
         // See https://github.com/electron/electron/issues/21614 for more.
-        block_chromium_message_handler_ = true;
+        is_setting_window_placement_ = true;
         SetWindowPlacement(GetAcceleratedWidget(), &wp);
-        block_chromium_message_handler_ = false;
+        is_setting_window_placement_ = false;
 
         last_normal_placement_bounds_ = gfx::Rect();
       }

+ 20 - 0
spec-main/api-browser-window-spec.ts

@@ -971,6 +971,26 @@ describe('BrowserWindow module', () => {
           w.show()
           w.minimize()
         })
+        it('does not change size for a frameless window with min size', async () => {
+          w.destroy()
+          w = new BrowserWindow({
+            show: false,
+            frame: false,
+            width: 300,
+            height: 300,
+            minWidth: 300,
+            minHeight: 300
+          })
+          const bounds = w.getBounds()
+          w.once('minimize', () => {
+            w.restore()
+          })
+          const restore = emittedOnce(w, 'restore')
+          w.show()
+          w.minimize()
+          await restore
+          expectBoundsEqual(w.getNormalBounds(), bounds)
+        })
       })
       ifdescribe(process.platform === 'win32')(`Fullscreen state`, () => {
         it(`checks normal bounds when fullscreen'ed`, (done) => {