From b686f27745b168b3c60ca8a5cbc5a7da1c687ac1 Mon Sep 17 00:00:00 2001 From: Jan Horak Date: Thu, 12 Sep 2019 15:24:58 +0200 Subject: Fix for disappearing webrtc popups --- mozilla-1580174-webrtc-popup.patch | 51 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 mozilla-1580174-webrtc-popup.patch (limited to 'mozilla-1580174-webrtc-popup.patch') diff --git a/mozilla-1580174-webrtc-popup.patch b/mozilla-1580174-webrtc-popup.patch new file mode 100644 index 0000000..2d154eb --- /dev/null +++ b/mozilla-1580174-webrtc-popup.patch @@ -0,0 +1,51 @@ +diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp +--- a/widget/gtk/nsWindow.cpp ++++ b/widget/gtk/nsWindow.cpp +@@ -1155,6 +1155,28 @@ + } + } + ++bool IsPopupWithoutToplevelParent(nsMenuPopupFrame* aMenuPopupFrame) { ++ // Check if the popup is autocomplete (like tags autocomplete ++ // in the bookmark edit popup). ++ nsAtom* popupId = aMenuPopupFrame->GetContent()->GetID(); ++ if (popupId && popupId->Equals(NS_LITERAL_STRING("PopupAutoComplete"))) { ++ return true; ++ } ++ ++ // Check if the popup is in popupnotificationcontent (like choosing capture ++ // device when starting webrtc session). ++ nsIFrame* parentFrame = aMenuPopupFrame->GetParent(); ++ if (!parentFrame) { ++ return false; ++ } ++ parentFrame = parentFrame->GetParent(); ++ if (parentFrame && parentFrame->GetContent()->NodeName().EqualsLiteral( ++ "popupnotificationcontent")) { ++ return true; ++ } ++ return false; ++} ++ + // Wayland keeps strong popup window hierarchy. We need to track active + // (visible) popup windows and make sure we hide popup on the same level + // before we open another one on that level. It means that every open +@@ -1211,10 +1233,14 @@ + 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). ++ // nullptr which means is not a submenu of any other menu. + // In this case use a parent given at nsWindow::Create(). +- if (!parentWindow && !menuPopupFrame->IsContextMenu()) { ++ // But we have to avoid using mToplevelParentWindow in case the popup ++ // is in 'popupnotificationcontent' element or autocomplete popup, ++ // otherwise the popupnotification would disappear when for ++ // example opening a popup with microphone selection. ++ if (!parentWindow && !menuPopupFrame->IsContextMenu() && ++ !IsPopupWithoutToplevelParent(menuPopupFrame)) { + parentWindow = + get_window_for_gtk_widget(GTK_WIDGET(mToplevelParentWindow)); + } + -- cgit