fix: reparenting after BrowserWindow.destroy() (#39062)

fix: reparenting after BrowserWindow.destroy()
This commit is contained in:
Shelley Vohr 2023-07-26 16:47:32 +02:00 committed by GitHub
parent fa5b1be6f3
commit 695fcf3cb2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 46 additions and 9 deletions

View file

@ -434,7 +434,12 @@ void NativeWindowMac::Close() {
}
// Ensure we're detached from the parent window before closing.
RemoveChildFromParentWindow(this);
RemoveChildFromParentWindow();
while (!child_windows_.empty()) {
auto* child = child_windows_.back();
child->RemoveChildFromParentWindow();
}
// If a sheet is attached to the window when we call
// [window_ performClose:nil], the window won't close properly
@ -453,7 +458,14 @@ void NativeWindowMac::Close() {
}
void NativeWindowMac::CloseImmediately() {
RemoveChildFromParentWindow(this);
// Ensure we're detached from the parent window before closing.
RemoveChildFromParentWindow();
while (!child_windows_.empty()) {
auto* child = child_windows_.back();
child->RemoveChildFromParentWindow();
}
[window_ close];
}
@ -642,9 +654,11 @@ void NativeWindowMac::RemoveChildWindow(NativeWindow* child) {
[window_ removeChildWindow:child->GetNativeWindow().GetNativeNSWindow()];
}
void NativeWindowMac::RemoveChildFromParentWindow(NativeWindow* child) {
if (parent())
parent()->RemoveChildWindow(child);
void NativeWindowMac::RemoveChildFromParentWindow() {
if (parent() && !is_modal()) {
parent()->RemoveChildWindow(this);
NativeWindow::SetParentWindow(nullptr);
}
}
void NativeWindowMac::AttachChildren() {
@ -1842,12 +1856,13 @@ void NativeWindowMac::InternalSetParentWindow(NativeWindow* new_parent,
return;
// Remove current parent window.
RemoveChildFromParentWindow(this);
RemoveChildFromParentWindow();
// Set new parent window.
if (new_parent && attach) {
if (new_parent) {
new_parent->add_child_window(this);
new_parent->AttachChildren();
if (attach)
new_parent->AttachChildren();
}
NativeWindow::SetParentWindow(new_parent);