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 --- firefox.spec | 2 ++ mozilla-1580174-webrtc-popup.patch | 51 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 mozilla-1580174-webrtc-popup.patch diff --git a/firefox.spec b/firefox.spec index 9e929a5..1719e43 100644 --- a/firefox.spec +++ b/firefox.spec @@ -152,6 +152,7 @@ Patch418: mozilla-1512162.patch Patch419: mozilla-1568569.patch Patch420: mozilla-1566876-webrtc-ind.patch Patch421: mozilla-1579023.patch +Patch422: mozilla-1580174-webrtc-popup.patch # Wayland specific upstream patches Patch574: firefox-pipewire.patch @@ -382,6 +383,7 @@ This package contains results of tests executed during build. %patch583 -p1 -b .mozilla-1579794-1 %patch584 -p1 -b .mozilla-1579794-2 %patch585 -p1 -b .mozilla-1579849 +%patch422 -p1 -b .1580174-webrtc-popup # PGO patches %patch600 -p1 -b .pgo 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