diff -up firefox-69.0/widget/gtk/nsWindow.cpp.mozilla-1562827 firefox-69.0/widget/gtk/nsWindow.cpp --- firefox-69.0/widget/gtk/nsWindow.cpp.mozilla-1562827 2019-09-02 15:16:15.031528276 +0200 +++ firefox-69.0/widget/gtk/nsWindow.cpp 2019-09-02 15:16:15.037528254 +0200 @@ -818,7 +818,6 @@ void nsWindow::SetParent(nsIWidget* aNew if (mParent) { mParent->RemoveChild(this); } - mParent = aNewParent; GtkWidget* oldContainer = GetMozContainerWidget(); @@ -830,88 +829,73 @@ void nsWindow::SetParent(nsIWidget* aNew return; } + nsWindow* newParent = static_cast(aNewParent); + GdkWindow* newParentWindow = nullptr; + GtkWidget* newContainer = nullptr; if (aNewParent) { aNewParent->AddChild(this); - ReparentNativeWidget(aNewParent); + newParentWindow = newParent->mGdkWindow; + newContainer = newParent->GetMozContainerWidget(); } else { // aNewParent is nullptr, but reparent to a hidden window to avoid // destroying the GdkWindow and its descendants. // An invisible container widget is needed to hold descendant // GtkWidgets. - GtkWidget* newContainer = EnsureInvisibleContainer(); - GdkWindow* newParentWindow = gtk_widget_get_window(newContainer); - ReparentNativeWidgetInternal(aNewParent, newContainer, newParentWindow, - oldContainer); - } -} - -bool nsWindow::WidgetTypeSupportsAcceleration() { return !IsSmallPopup(); } - -void nsWindow::ReparentNativeWidget(nsIWidget* aNewParent) { - MOZ_ASSERT(aNewParent, "null widget"); - NS_ASSERTION(!mIsDestroyed, ""); - NS_ASSERTION(!static_cast(aNewParent)->mIsDestroyed, ""); - - GtkWidget* oldContainer = GetMozContainerWidget(); - if (!oldContainer) { - // The GdkWindows have been destroyed so there is nothing else to - // reparent. - MOZ_ASSERT(gdk_window_is_destroyed(mGdkWindow), - "live GdkWindow with no widget"); - return; + newContainer = EnsureInvisibleContainer(); + newParentWindow = gtk_widget_get_window(newContainer); } - MOZ_ASSERT(!gdk_window_is_destroyed(mGdkWindow), - "destroyed GdkWindow with widget"); - auto* newParent = static_cast(aNewParent); - GdkWindow* newParentWindow = newParent->mGdkWindow; - GtkWidget* newContainer = newParent->GetMozContainerWidget(); - GtkWindow* shell = GTK_WINDOW(mShell); - - if (shell && gtk_window_get_transient_for(shell)) { - GtkWindow* topLevelParent = - GTK_WINDOW(gtk_widget_get_toplevel(newContainer)); - gtk_window_set_transient_for(shell, topLevelParent); - } - - ReparentNativeWidgetInternal(aNewParent, newContainer, newParentWindow, - oldContainer); -} - -void nsWindow::ReparentNativeWidgetInternal(nsIWidget* aNewParent, - GtkWidget* aNewContainer, - GdkWindow* aNewParentWindow, - GtkWidget* aOldContainer) { - if (!aNewContainer) { + if (!newContainer) { // The new parent GdkWindow has been destroyed. - MOZ_ASSERT(!aNewParentWindow || gdk_window_is_destroyed(aNewParentWindow), + MOZ_ASSERT(!newParentWindow || gdk_window_is_destroyed(newParentWindow), "live GdkWindow with no widget"); Destroy(); } else { - if (aNewContainer != aOldContainer) { - MOZ_ASSERT(!gdk_window_is_destroyed(aNewParentWindow), + if (newContainer != oldContainer) { + MOZ_ASSERT(!gdk_window_is_destroyed(newParentWindow), "destroyed GdkWindow with widget"); - SetWidgetForHierarchy(mGdkWindow, aOldContainer, aNewContainer); + SetWidgetForHierarchy(mGdkWindow, oldContainer, newContainer); - if (aOldContainer == gInvisibleContainer) { + if (oldContainer == gInvisibleContainer) { CheckDestroyInvisibleContainer(); } } - if (!mIsTopLevel) { - gdk_window_reparent(mGdkWindow, aNewParentWindow, - DevicePixelsToGdkCoordRoundDown(mBounds.x), - DevicePixelsToGdkCoordRoundDown(mBounds.y)); - } + gdk_window_reparent(mGdkWindow, newParentWindow, + DevicePixelsToGdkCoordRoundDown(mBounds.x), + DevicePixelsToGdkCoordRoundDown(mBounds.y)); + mToplevelParentWindow = GTK_WINDOW(gtk_widget_get_toplevel(newContainer)); } - auto* newParent = static_cast(aNewParent); bool parentHasMappedToplevel = newParent && newParent->mHasMappedToplevel; if (mHasMappedToplevel != parentHasMappedToplevel) { SetHasMappedToplevel(parentHasMappedToplevel); } } +bool nsWindow::WidgetTypeSupportsAcceleration() { return !IsSmallPopup(); } + +void nsWindow::ReparentNativeWidget(nsIWidget* aNewParent) { + MOZ_ASSERT(aNewParent, "null widget"); + MOZ_ASSERT(!mIsDestroyed, ""); + MOZ_ASSERT(!static_cast(aNewParent)->mIsDestroyed, ""); + MOZ_ASSERT(!gdk_window_is_destroyed(mGdkWindow), + "destroyed GdkWindow with widget"); + + MOZ_ASSERT( + !mParent, + "nsWindow::ReparentNativeWidget() works on toplevel windows only."); + + auto* newParent = static_cast(aNewParent); + GtkWindow* newParentWidget = GTK_WINDOW(newParent->GetGtkWidget()); + GtkWindow* shell = GTK_WINDOW(mShell); + + if (shell && gtk_window_get_transient_for(shell)) { + gtk_window_set_transient_for(shell, newParentWidget); + mToplevelParentWindow = newParentWidget; + } +} + void nsWindow::SetModal(bool aModal) { LOG(("nsWindow::SetModal [%p] %d\n", (void*)this, aModal)); if (mIsDestroyed) return; diff -up firefox-69.0/widget/gtk/nsWindow.h.mozilla-1562827 firefox-69.0/widget/gtk/nsWindow.h