fix: crash when restoring minimized hidden window (#21813)
This commit is contained in:
parent
bf6e4b1247
commit
42d8933d66
3 changed files with 29 additions and 0 deletions
|
@ -275,6 +275,9 @@ class NativeWindowViews : public NativeWindow,
|
||||||
|
|
||||||
// Set to true if the window is always on top and behind the task bar.
|
// Set to true if the window is always on top and behind the task bar.
|
||||||
bool behind_task_bar_ = false;
|
bool behind_task_bar_ = false;
|
||||||
|
|
||||||
|
// Whether to block Chromium from handling window messages.
|
||||||
|
bool block_chromium_message_handler_ = false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Handles unhandled keyboard messages coming back from the renderer process.
|
// Handles unhandled keyboard messages coming back from the renderer process.
|
||||||
|
|
|
@ -180,6 +180,14 @@ bool NativeWindowViews::PreHandleMSG(UINT message,
|
||||||
LRESULT* result) {
|
LRESULT* result) {
|
||||||
NotifyWindowMessage(message, w_param, l_param);
|
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.
|
||||||
|
*result = DefWindowProc(GetAcceleratedWidget(), message, w_param, l_param);
|
||||||
|
// Tell Chromium to ignore this message.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
switch (message) {
|
switch (message) {
|
||||||
// Screen readers send WM_GETOBJECT in order to get the accessibility
|
// Screen readers send WM_GETOBJECT in order to get the accessibility
|
||||||
// object, so take this opportunity to push Chromium into accessible
|
// object, so take this opportunity to push Chromium into accessible
|
||||||
|
@ -222,7 +230,18 @@ bool NativeWindowViews::PreHandleMSG(UINT message,
|
||||||
if (!last_normal_placement_bounds_.IsEmpty() &&
|
if (!last_normal_placement_bounds_.IsEmpty() &&
|
||||||
GetWindowPlacement(GetAcceleratedWidget(), &wp)) {
|
GetWindowPlacement(GetAcceleratedWidget(), &wp)) {
|
||||||
wp.rcNormalPosition = last_normal_placement_bounds_.ToRECT();
|
wp.rcNormalPosition = last_normal_placement_bounds_.ToRECT();
|
||||||
|
|
||||||
|
// When calling SetWindowPlacement, Chromium would do window messages
|
||||||
|
// handling. But since we are already in PreHandleMSG this would cause
|
||||||
|
// crash in Chromium under some cases.
|
||||||
|
//
|
||||||
|
// We work around the crash by prevent Chromium from handling window
|
||||||
|
// messages until the SetWindowPlacement call is done.
|
||||||
|
//
|
||||||
|
// See https://github.com/electron/electron/issues/21614 for more.
|
||||||
|
block_chromium_message_handler_ = true;
|
||||||
SetWindowPlacement(GetAcceleratedWidget(), &wp);
|
SetWindowPlacement(GetAcceleratedWidget(), &wp);
|
||||||
|
block_chromium_message_handler_ = false;
|
||||||
|
|
||||||
last_normal_placement_bounds_ = gfx::Rect();
|
last_normal_placement_bounds_ = gfx::Rect();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2858,6 +2858,13 @@ describe('BrowserWindow module', () => {
|
||||||
w.restore()
|
w.restore()
|
||||||
expectBoundsEqual(w.getSize(), initialSize)
|
expectBoundsEqual(w.getSize(), initialSize)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('does not crash when restoring hidden minimized window', () => {
|
||||||
|
const w = new BrowserWindow({})
|
||||||
|
w.minimize()
|
||||||
|
w.hide()
|
||||||
|
w.show()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('BrowserWindow.unmaximize()', () => {
|
describe('BrowserWindow.unmaximize()', () => {
|
||||||
|
|
Loading…
Reference in a new issue