diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp --- a/widget/gtk/nsWindow.cpp +++ b/widget/gtk/nsWindow.cpp @@ -1208,6 +1208,7 @@ if (frame) { menuPopupFrame = do_QueryFrame(frame); } + // The popup is not fully created yet (we're called from // nsWindow::Create()) or we're toplevel popup without parent. // In both cases just use parent which was passed to nsWindow::Create(). @@ -1217,10 +1218,22 @@ return GTK_WIDGET(parentWidget); } + LOG(("...[%p] is %s\n", (void*)this, + menuPopupFrame->IsContextMenu() ? "context menu" : "popup")); + nsWindow* parentWindow = static_cast(menuPopupFrame->GetParentMenuWidget()); LOG(("...[%p] GetParentMenuWidget() = %p\n", (void*)this, parentWindow)); + // If the popup is a regular menu but GetParentMenuWidget() returns + // nullptr which means it's connected non-menu parent + // (bookmark toolbar for instance). + // In this case use a parent given at nsWindow::Create(). + if (!parentWindow && !menuPopupFrame->IsContextMenu()) { + parentWindow = + get_window_for_gtk_widget(GTK_WIDGET(mToplevelParentWindow)); + } + if (!parentWindow) { LOG(("...[%p] using active/visible popups as a parent [%p]\n", (void*)this, gVisibleWaylandPopupWindows->data));