Blob Blame History Raw
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<nsWindow*>(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));