diff --git a/D53011-remote-content-disappear-fix.diff b/D53011-remote-content-disappear-fix.diff new file mode 100644 index 0000000..f7c9f38 --- /dev/null +++ b/D53011-remote-content-disappear-fix.diff @@ -0,0 +1,98 @@ +diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h +--- a/widget/gtk/nsWindow.h ++++ b/widget/gtk/nsWindow.h +@@ -401,6 +401,8 @@ + #ifdef MOZ_WAYLAND + virtual nsresult GetScreenRect(LayoutDeviceIntRect* aRect) override; + #endif ++ bool IsRemoteContent() { return HasRemoteContent(); } ++ static void HideWaylandOpenedPopups(); + + protected: + virtual ~nsWindow(); +diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp +--- a/widget/gtk/nsWindow.cpp ++++ b/widget/gtk/nsWindow.cpp +@@ -1165,6 +1165,14 @@ + } + } + ++void nsWindow::HideWaylandOpenedPopups() { ++ while (gVisibleWaylandPopupWindows) { ++ nsWindow* window = ++ static_cast(gVisibleWaylandPopupWindows->data); ++ window->HideWaylandWindow(); ++ } ++} ++ + // Hide popup nsWindows which are no longer in the nsXULPopupManager widget + // chain list. + void nsWindow::CleanupWaylandPopups() { +@@ -1218,7 +1226,10 @@ + // popup needs to have an unique parent. + GtkWidget* nsWindow::ConfigureWaylandPopupWindows() { + MOZ_ASSERT(this->mWindowType == eWindowType_popup); +- LOG(("nsWindow::ConfigureWaylandPopupWindows [%p]\n", (void*)this)); ++ LOG( ++ ("nsWindow::ConfigureWaylandPopupWindows [%p], frame %p hasRemoteContent " ++ "%d\n", ++ (void*)this, this->GetFrame(), this->HasRemoteContent())); + #if DEBUG + if (this->GetFrame() && this->GetFrame()->GetContent()->GetID()) { + nsCString nodeId; +@@ -1245,14 +1256,14 @@ + // gVisibleWaylandPopupWindows which were not yet been hidden. + CleanupWaylandPopups(); + // Since the popups are shown by unknown order it can happen that child +- // popup is shown before parent popup. The ++ // popup is shown before parent popup. + // We look for the current window parent in nsXULPopupManager since it + // always has correct popup hierarchy while gVisibleWaylandPopupWindows may + // not. + nsXULPopupManager* pm = nsXULPopupManager::GetInstance(); + AutoTArray widgetChain; + pm->GetSubmenuWidgetChain(&widgetChain); +- for (unsigned long i = 0; i < widgetChain.Length(); i++) { ++ for (unsigned long i = 0; i < widgetChain.Length() - 1; i++) { + unsigned long parentIndex = i + 1; + if (widgetChain.Length() > parentIndex && widgetChain[i] == this) { + nsWindow* parentWindow = +@@ -1264,6 +1275,29 @@ + } + } + } else { ++ // Panels usually ends there ++ if (gVisibleWaylandPopupWindows && HasRemoteContent()) { ++ // If the new panel is remote content, we need to close all other popups ++ // before to keep the correct hierarchy because the remote content popup ++ // can replace the overflow-widget panel. ++ HideWaylandOpenedPopups(); ++ } else if (gVisibleWaylandPopupWindows) { ++ // If there is any remote content panel currently opened, close all ++ // opened popups to keep the correct hierarchy. ++ GList* popupList = gVisibleWaylandPopupWindows; ++ while (popupList) { ++ nsWindow* waylandWnd = static_cast(popupList->data); ++ LOG((" Checking [%p] IsRemoteContent %d\n", popupList->data, ++ waylandWnd->IsRemoteContent())); ++ if (waylandWnd->IsRemoteContent()) { ++ // close all popups including remote content before showing our panel ++ // Most likely returning from addon panel to overflow-widget. ++ HideWaylandOpenedPopups(); ++ break; ++ } ++ popupList = popupList->next; ++ } ++ } + // For popups in panels use the last opened popup window as parent, + // panels are not stored in nsXULPopupManager. + if (gVisibleWaylandPopupWindows) { +@@ -4380,6 +4414,7 @@ + void nsWindow::HideWaylandWindow() { + #ifdef MOZ_WAYLAND + if (mWindowType == eWindowType_popup) { ++ LOG(("nsWindow::HideWaylandWindow: popup [%p]\n", this)); + GList* foundWindow = g_list_find(gVisibleWaylandPopupWindows, this); + if (foundWindow) { + gVisibleWaylandPopupWindows = + diff --git a/D53965-dropdown-missing-on-multimonitor.diff b/D53965-dropdown-missing-on-multimonitor.diff new file mode 100644 index 0000000..d974e74 --- /dev/null +++ b/D53965-dropdown-missing-on-multimonitor.diff @@ -0,0 +1,97 @@ +diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp +--- a/widget/gtk/nsWindow.cpp ++++ b/widget/gtk/nsWindow.cpp +@@ -1295,13 +1295,12 @@ + GdkWindow* window, const GdkRectangle* flipped_rect, + const GdkRectangle* final_rect, gboolean flipped_x, gboolean flipped_y, + void* aWindow) { +- LOG(("%s [%p] flipped_x %d flipped_y %d\n", __FUNCTION__, aWindow, flipped_x, +- flipped_y)); +- +- LOG(("%s [%p] flipped %d %d w:%d h:%d\n", __FUNCTION__, aWindow, +- flipped_rect->x, flipped_rect->y, flipped_rect->width, +- flipped_rect->height)); +- LOG(("%s [%p] final %d %d w:%d h:%d\n", __FUNCTION__, aWindow, final_rect->x, ++ LOG(("NativeMoveResizeWaylandPopupCallback [%p] flipped_x %d flipped_y %d\n", ++ aWindow, flipped_x, flipped_y)); ++ ++ LOG((" flipped_rect x: %d y: %d width: %d height: %d\n", flipped_rect->x, ++ flipped_rect->y, flipped_rect->width, flipped_rect->height)); ++ LOG((" final_rect x: %d y: %d width: %d height: %d\n", final_rect->x, + final_rect->y, final_rect->width, final_rect->height)); + } + #endif +@@ -1312,12 +1311,13 @@ + static auto sGdkWindowMoveToRect = (void (*)( + GdkWindow*, const GdkRectangle*, GdkGravity, GdkGravity, GdkAnchorHints, + gint, gint))dlsym(RTLD_DEFAULT, "gdk_window_move_to_rect"); ++ LOG(("nsWindow::NativeMoveResizeWaylandPopup [%p]\n", (void*)this)); + + // Compositor may be confused by windows with width/height = 0 + // and positioning such windows leads to Bug 1555866. + if (!AreBoundsSane()) { +- LOG(("nsWindow::NativeMoveResizeWaylandPopup [%p] Bounds are not sane\n", +- (void*)this)); ++ LOG((" Bounds are not sane (width: %d height: %d)\n", mBounds.width, ++ mBounds.height)); + return; + } + +@@ -1331,15 +1331,14 @@ + // - gdk_window_move_to_rect() is not available + // - the widget doesn't have a valid GdkWindow + if (!sGdkWindowMoveToRect || !gdkWindow) { +- LOG(("nsWindow::NativeMoveResizeWaylandPopup [%p] use gtk_window_move()\n", +- (void*)this)); ++ LOG((" use gtk_window_move(%d, %d)\n", aPosition->x, aPosition->y)); + gtk_window_move(GTK_WINDOW(mShell), aPosition->x, aPosition->y); + return; + } + + GtkWidget* parentWindow = ConfigureWaylandPopupWindows(); +- LOG(("nsWindow::NativeMoveResizeWaylandPopup [%p] Set popup parent %p\n", +- (void*)this, parentWindow)); ++ LOG(("nsWindow::NativeMoveResizeWaylandPopup: Set popup parent %p\n", ++ parentWindow)); + + int x_parent, y_parent; + gdk_window_get_origin(gtk_widget_get_window(GTK_WIDGET(parentWindow)), +@@ -1351,12 +1350,6 @@ + rect.height = aSize->height; + } + +- LOG(("%s [%p] request position %d,%d\n", __FUNCTION__, (void*)this, +- aPosition->x, aPosition->y)); +- if (aSize) { +- LOG((" request size %d,%d\n", aSize->width, aSize->height)); +- } +- LOG((" request result %d %d\n", rect.x, rect.y)); + #ifdef DEBUG + if (!g_signal_handler_find( + gdkWindow, G_SIGNAL_MATCH_FUNC, 0, 0, nullptr, +@@ -1389,10 +1382,8 @@ + HideWaylandWindow(); + } + +- LOG( +- ("nsWindow::NativeMoveResizeWaylandPopup [%p]: requested rect: x%d y%d " +- "w%d h%d\n", +- this, rect.x, rect.y, rect.width, rect.height)); ++ LOG((" requested rect: x: %d y: %d width: %d height: %d\n", rect.x, rect.y, ++ rect.width, rect.height)); + if (aSize) { + LOG((" aSize: x%d y%d w%d h%d\n", aSize->x, aSize->y, aSize->width, + aSize->height)); +@@ -7348,8 +7339,9 @@ + if (monitor) { + GdkRectangle workArea; + s_gdk_monitor_get_workarea(monitor, &workArea); +- aRect->x = workArea.x; +- aRect->y = workArea.y; ++ // The monitor offset won't help us in Wayland, because we can't get the ++ // absolute position of our window. ++ aRect->x = aRect->y = 0; + aRect->width = workArea.width; + aRect->height = workArea.height; + LOG((" workarea for [%p], monitor %p: x%d y%d w%d h%d\n", this, monitor, + diff --git a/firefox.spec b/firefox.spec index 10e032a..82db088 100644 --- a/firefox.spec +++ b/firefox.spec @@ -153,6 +153,8 @@ Patch419: mozilla-1568569.patch Patch421: mozilla-1579023.patch Patch422: mozilla-1580174-webrtc-popup.patch Patch423: D49289-wayland-monitor-size.diff +Patch424: D53011-remote-content-disappear-fix.diff +Patch425: D53965-dropdown-missing-on-multimonitor.diff # Wayland specific upstream patches Patch574: firefox-pipewire.patch @@ -363,6 +365,10 @@ This package contains results of tests executed during build. %patch419 -p1 -b .1568569 %patch421 -p1 -b .1579023 %patch423 -p1 -b .D49289 +# overflow widgets broken +%patch424 -p1 -b .D53011 +# dropdown missing on multimonitor +%patch425 -p1 -b .D53965 # Wayland specific upstream patches %patch574 -p1 -b .firefox-pipewire