diff --git a/shell/browser/native_window_views_win.cc b/shell/browser/native_window_views_win.cc index 474e7b25bfff4..ac9d7fd2a4dc8 100644 --- a/shell/browser/native_window_views_win.cc +++ b/shell/browser/native_window_views_win.cc @@ -315,14 +315,8 @@ void NativeWindowViews::HandleSizeEvent(WPARAM w_param, LPARAM l_param) { // Here we handle the WM_SIZE event in order to figure out what is the current // window state and notify the user accordingly. switch (w_param) { - case SIZE_MAXIMIZED: { - last_window_state_ = ui::SHOW_STATE_MAXIMIZED; - NotifyWindowMaximize(); - break; - } - case SIZE_MINIMIZED: - last_window_state_ = ui::SHOW_STATE_MINIMIZED; - + case SIZE_MAXIMIZED: + case SIZE_MINIMIZED: { WINDOWPLACEMENT wp; wp.length = sizeof(WINDOWPLACEMENT); @@ -330,8 +324,19 @@ void NativeWindowViews::HandleSizeEvent(WPARAM w_param, LPARAM l_param) { last_normal_placement_bounds_ = gfx::Rect(wp.rcNormalPosition); } - NotifyWindowMinimize(); + // Note that SIZE_MAXIMIZED and SIZE_MINIMIZED might be emitted for + // multiple times for one resize because of the SetWindowPlacement call. + if (w_param == SIZE_MAXIMIZED && + last_window_state_ != ui::SHOW_STATE_MAXIMIZED) { + last_window_state_ = ui::SHOW_STATE_MAXIMIZED; + NotifyWindowMaximize(); + } else if (w_param == SIZE_MINIMIZED && + last_window_state_ != ui::SHOW_STATE_MINIMIZED) { + last_window_state_ = ui::SHOW_STATE_MINIMIZED; + NotifyWindowMinimize(); + } break; + } case SIZE_RESTORED: switch (last_window_state_) { case ui::SHOW_STATE_MAXIMIZED: diff --git a/spec-main/api-browser-window-spec.ts b/spec-main/api-browser-window-spec.ts index 3f69f00bfe30b..99edf2f6729a6 100644 --- a/spec-main/api-browser-window-spec.ts +++ b/spec-main/api-browser-window-spec.ts @@ -1021,6 +1021,26 @@ describe('BrowserWindow module', () => { await unmaximize; expectBoundsEqual(w.getNormalBounds(), bounds); }); + 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('maximize', () => { + w.unmaximize(); + }); + const unmaximize = emittedOnce(w, 'unmaximize'); + w.show(); + w.maximize(); + await unmaximize; + expectBoundsEqual(w.getNormalBounds(), bounds); + }); }); ifdescribe(process.platform !== 'linux')('Minimized state', () => { @@ -2993,6 +3013,15 @@ describe('BrowserWindow module', () => { await maximize; }); + it('emits only one event when frameless window is maximized', () => { + const w = new BrowserWindow({ show: false, frame: false }); + let emitted = 0; + w.on('maximize', () => emitted++); + w.show(); + w.maximize(); + expect(emitted).to.equal(1); + }); + it('emits an event when window is unmaximized', async () => { const w = new BrowserWindow({ show: false }); const unmaximize = emittedOnce(w, 'unmaximize');