summaryrefslogtreecommitdiff
path: root/mozilla-1580174-webrtc-popup.patch
diff options
context:
space:
mode:
Diffstat (limited to 'mozilla-1580174-webrtc-popup.patch')
-rw-r--r--mozilla-1580174-webrtc-popup.patch51
1 files changed, 51 insertions, 0 deletions
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));
+ }
+
bgstack15