diff --git a/shell/browser/native_window_views.h b/shell/browser/native_window_views.h index 86406d12b0638..952a37e4f154c 100644 --- a/shell/browser/native_window_views.h +++ b/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. diff --git a/shell/browser/native_window_views_win.cc b/shell/browser/native_window_views_win.cc index 5003fbc3c70a6..474e7b25bfff4 100644 --- a/shell/browser/native_window_views_win.cc +++ b/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(); } diff --git a/spec-main/api-browser-window-spec.ts b/spec-main/api-browser-window-spec.ts index 340dcb0d81cc5..d75c18e8feebd 100644 --- a/spec-main/api-browser-window-spec.ts +++ b/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) => {