fix
This commit is contained in:
		
						commit
						11bbed2d96
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -385,3 +385,5 @@ firefox-3.6.4.source.tar.bz2 | ||||
| /firefox-langpacks-73.0-20200211.tar.xz | ||||
| /firefox-73.0.1.source.tar.xz | ||||
| /firefox-langpacks-73.0.1-20200220.tar.xz | ||||
| /firefox-74.0.source.tar.xz | ||||
| /firefox-langpacks-74.0-20200303.tar.xz | ||||
|  | ||||
							
								
								
									
										37
									
								
								firefox.spec
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								firefox.spec
									
									
									
									
									
								
							| @ -22,7 +22,11 @@ ExcludeArch: s390x | ||||
| %global enable_mozilla_crashreporter 0 | ||||
| %endif | ||||
| 
 | ||||
| %if 0%{?fedora} > 31 | ||||
| %global system_nss        0 | ||||
| %else | ||||
| %global system_nss        1 | ||||
| %endif | ||||
| %global system_ffi        1 | ||||
| %ifarch armv7hl | ||||
| %global system_libvpx     1 | ||||
| @ -112,13 +116,13 @@ ExcludeArch: s390x | ||||
| 
 | ||||
| Summary:        Mozilla Firefox Web browser | ||||
| Name:           firefox | ||||
| Version:        73.0.1 | ||||
| Release:        4%{?dist} | ||||
| Version:        74.0 | ||||
| Release:        1%{?dist} | ||||
| URL:            https://www.mozilla.org/firefox/ | ||||
| License:        MPLv1.1 or GPLv2+ or LGPLv2+ | ||||
| Source0:        https://archive.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.xz | ||||
| %if %{with langpacks} | ||||
| Source1:        firefox-langpacks-%{version}%{?pre_version}-20200220.tar.xz | ||||
| Source1:        firefox-langpacks-%{version}%{?pre_version}-20200303.tar.xz | ||||
| %endif | ||||
| Source2:        cbindgen-vendor.tar.xz | ||||
| Source10:       firefox-mozconfig | ||||
| @ -157,8 +161,7 @@ Patch46:        firefox-nss-version.patch | ||||
| Patch47:        fedora-shebang-build.patch | ||||
| Patch48:        build-arm-wasm.patch | ||||
| Patch49:        build-arm-libaom.patch | ||||
| Patch50:        Bug-1610814-Fix-NEON-compile-error-with-gcc-and-RGB-.patch | ||||
| Patch51:        build-missing-size_t.patch | ||||
| #Patch50:        Bug-1610814-Fix-NEON-compile-error-with-gcc-and-RGB-.patch | ||||
| 
 | ||||
| # Fedora specific patches | ||||
| Patch215:        firefox-enable-addons.patch | ||||
| @ -178,10 +181,6 @@ Patch412:        mozilla-1337988.patch | ||||
| Patch415:        Bug-1238661---fix-mozillaSignalTrampoline-to-work-.patch | ||||
| Patch417:        bug1375074-save-restore-x28.patch | ||||
| Patch422:        mozilla-1580174-webrtc-popup.patch | ||||
| Patch427:        mozilla-1607404-fix-remote-offset.patch | ||||
| Patch428:        mozilla-1609732-no-full-hide.patch | ||||
| Patch429:        mozilla-1609732-pause-renderer.patch | ||||
| Patch430:        mozilla-1605795-popup-parent-fix.patch | ||||
| 
 | ||||
| # Wayland specific upstream patches | ||||
| Patch574:        firefox-pipewire.patch | ||||
| @ -230,13 +229,7 @@ BuildRequires:  clang-libs | ||||
| %if 0%{?build_with_clang} | ||||
| BuildRequires:  lld | ||||
| %endif | ||||
| 
 | ||||
| %if 0%{?fedora} < 32 | ||||
| BuildRequires:  pipewire-devel | ||||
| %else | ||||
| BuildRequires:  pipewire0.2-devel | ||||
| %endif | ||||
| 
 | ||||
| %if !0%{?use_bundled_cbindgen} | ||||
| BuildRequires:  cbindgen | ||||
| %endif | ||||
| @ -364,8 +357,7 @@ This package contains results of tests executed during build. | ||||
| %patch47 -p1 -b .fedora-shebang | ||||
| %patch48 -p1 -b .build-arm-wasm | ||||
| %patch49 -p1 -b .build-arm-libaom | ||||
| %patch50 -p1 -b .build-arm-SwizzleNEON | ||||
| %patch51 -p1 -b .build-missing-size_t | ||||
| #%patch50 -p1 -b .build-arm-SwizzleNEON | ||||
| 
 | ||||
| # Fedora patches | ||||
| %patch215 -p1 -b .addons | ||||
| @ -388,14 +380,6 @@ This package contains results of tests executed during build. | ||||
| %patch415 -p1 -b .1238661 | ||||
| %endif | ||||
| 
 | ||||
| # overflow widgets broken | ||||
| # dropdown missing on multimonitor | ||||
| # fix for wrong intl.accept_lang when using non en-us langpack | ||||
| %patch427 -p1 -b .1607404-fix-remote-offset | ||||
| %patch428 -p1 -b .1609732-no-full-hide | ||||
| %patch429 -p1 -b .1609732-pause-renderer | ||||
| %patch430 -p1 -b .1605795-popup-parent-fix | ||||
| 
 | ||||
| # Wayland specific upstream patches | ||||
| %patch574 -p1 -b .firefox-pipewire | ||||
| 
 | ||||
| @ -974,6 +958,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : | ||||
| #--------------------------------------------------------------------- | ||||
| 
 | ||||
| %changelog | ||||
| * Tue Mar 03 2020 Martin Stransky <stransky@redhat.com> - 74.0-1 | ||||
| - Update to 74.0 Build 1 | ||||
| 
 | ||||
| * Mon Feb 24 2020 Martin Stransky <stransky@redhat.com> - 73.0.1-4 | ||||
| - Using pipewire-0.2 as buildrequire | ||||
| - Added armv7hl fixes by Gabriel Hojda | ||||
|  | ||||
| @ -1,231 +0,0 @@ | ||||
| diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h
 | ||||
| --- a/widget/gtk/nsWindow.h
 | ||||
| +++ b/widget/gtk/nsWindow.h
 | ||||
| @@ -687,6 +687,9 @@
 | ||||
|    void HideWaylandPopupAndAllChildren(); | ||||
|    void CleanupWaylandPopups(); | ||||
|    GtkWindow* GetCurrentTopmostWindow(); | ||||
| +  GtkWindow* GetCurrentWindow();
 | ||||
| +  GtkWindow* GetTopmostWindow();
 | ||||
| +  bool IsWidgetOverflowWindow();
 | ||||
|   | ||||
|    /** | ||||
|     * |mIMContext| takes all IME related stuff. | ||||
| diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
 | ||||
| --- a/widget/gtk/nsWindow.cpp
 | ||||
| +++ b/widget/gtk/nsWindow.cpp
 | ||||
| @@ -1193,20 +1193,26 @@
 | ||||
|    while (popupList) { | ||||
|      LOG(("  Looking for %p [nsWindow]\n", popupList->data)); | ||||
|      nsWindow* waylandWnd = static_cast<nsWindow*>(popupList->data); | ||||
| -    bool popupFound = false;
 | ||||
| -    for (unsigned long i = 0; i < widgetChain.Length(); i++) {
 | ||||
| -      if (waylandWnd == widgetChain[i]) {
 | ||||
| -        popupFound = true;
 | ||||
| -        break;
 | ||||
| +    // Remove only menu popups or empty frames - they are most likely
 | ||||
| +    // already rolledup popups
 | ||||
| +    if (waylandWnd->IsMainMenuWindow() || !waylandWnd->GetFrame()) {
 | ||||
| +      bool popupFound = false;
 | ||||
| +      for (unsigned long i = 0; i < widgetChain.Length(); i++) {
 | ||||
| +        if (waylandWnd == widgetChain[i]) {
 | ||||
| +          popupFound = true;
 | ||||
| +          break;
 | ||||
| +        }
 | ||||
|        } | ||||
| -    }
 | ||||
| -    if (!popupFound) {
 | ||||
| -      LOG(("    nsWindow [%p] not found in PopupManager, hiding it.\n",
 | ||||
| -           waylandWnd));
 | ||||
| -      waylandWnd->HideWaylandWindow();
 | ||||
| -      popupList = gVisibleWaylandPopupWindows;
 | ||||
| +      if (!popupFound) {
 | ||||
| +        LOG(("    nsWindow [%p] not found in PopupManager, hiding it.\n",
 | ||||
| +             waylandWnd));
 | ||||
| +        waylandWnd->HideWaylandWindow();
 | ||||
| +        popupList = gVisibleWaylandPopupWindows;
 | ||||
| +      } else {
 | ||||
| +        LOG(("    nsWindow [%p] is still open.\n", waylandWnd));
 | ||||
| +        popupList = popupList->next;
 | ||||
| +      }
 | ||||
|      } else { | ||||
| -      LOG(("    nsWindow [%p] is still open.\n", waylandWnd));
 | ||||
|        popupList = popupList->next; | ||||
|      } | ||||
|    } | ||||
| @@ -1229,6 +1235,55 @@
 | ||||
|    return false; | ||||
|  } | ||||
|   | ||||
| +GtkWindow* nsWindow::GetTopmostWindow() {
 | ||||
| +  nsView* view = nsView::GetViewFor(this);
 | ||||
| +  if (view) {
 | ||||
| +    nsView* parentView = view->GetParent();
 | ||||
| +    if (parentView) {
 | ||||
| +      nsIWidget* parentWidget = parentView->GetNearestWidget(nullptr);
 | ||||
| +      if (parentWidget) {
 | ||||
| +        nsWindow* parentnsWindow = static_cast<nsWindow*>(parentWidget);
 | ||||
| +        LOG(("  Topmost window: %p [nsWindow]\n", parentnsWindow));
 | ||||
| +        return GTK_WINDOW(parentnsWindow->mShell);
 | ||||
| +      }
 | ||||
| +    }
 | ||||
| +  }
 | ||||
| +  return nullptr;
 | ||||
| +}
 | ||||
| +
 | ||||
| +GtkWindow* nsWindow::GetCurrentWindow() {
 | ||||
| +  GtkWindow* parentGtkWindow = nullptr;
 | ||||
| +  // get the last opened window from gVisibleWaylandPopupWindows
 | ||||
| +  if (gVisibleWaylandPopupWindows) {
 | ||||
| +    nsWindow* parentnsWindow =
 | ||||
| +        static_cast<nsWindow*>(gVisibleWaylandPopupWindows->data);
 | ||||
| +    if (parentnsWindow) {
 | ||||
| +      LOG(("  Setting parent to last opened window: %p [nsWindow]\n",
 | ||||
| +           parentnsWindow));
 | ||||
| +      parentGtkWindow = GTK_WINDOW(parentnsWindow->GetGtkWidget());
 | ||||
| +    }
 | ||||
| +  }
 | ||||
| +  // get the topmost window if the last opened windows are empty
 | ||||
| +  if (!parentGtkWindow) {
 | ||||
| +    parentGtkWindow = GetTopmostWindow();
 | ||||
| +  }
 | ||||
| +  if (parentGtkWindow && GTK_IS_WINDOW(parentGtkWindow)) {
 | ||||
| +    return GTK_WINDOW(parentGtkWindow);
 | ||||
| +  } else {
 | ||||
| +    LOG(("  Failed to get current window for %p: %p\n", this, parentGtkWindow));
 | ||||
| +  }
 | ||||
| +  return nullptr;
 | ||||
| +}
 | ||||
| +
 | ||||
| +bool nsWindow::IsWidgetOverflowWindow() {
 | ||||
| +  if (this->GetFrame() && this->GetFrame()->GetContent()->GetID()) {
 | ||||
| +    nsCString nodeId;
 | ||||
| +    this->GetFrame()->GetContent()->GetID()->ToUTF8String(nodeId);
 | ||||
| +    return nodeId.Equals("widget-overflow");
 | ||||
| +  }
 | ||||
| +  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 | ||||
| @@ -1247,9 +1302,18 @@
 | ||||
|    } | ||||
|  #endif | ||||
|   | ||||
| -  // Check if we're already configured.
 | ||||
| +  if (!GetFrame()) {
 | ||||
| +    LOG(("  Window without frame cannot be configured.\n"));
 | ||||
| +    return nullptr;
 | ||||
| +  }
 | ||||
| +
 | ||||
| +  // Check if we're already configured. Popup can be reattached to various
 | ||||
| +  // windows, so don't consider them configured. Also the widget-overflow needs
 | ||||
| +  // special care because the opened (remote) popups has to be closed before is
 | ||||
| +  // it shown again.
 | ||||
|    if (gVisibleWaylandPopupWindows && | ||||
| -      g_list_find(gVisibleWaylandPopupWindows, this)) {
 | ||||
| +      g_list_find(gVisibleWaylandPopupWindows, this) &&
 | ||||
| +      mPopupType != ePopupTypeTooltip && !IsWidgetOverflowWindow()) {
 | ||||
|      LOG(("  [%p] is already configured.\n", (void*)this)); | ||||
|      return GTK_WIDGET(gtk_window_get_transient_for(GTK_WINDOW(mShell))); | ||||
|    } | ||||
| @@ -1257,80 +1321,30 @@
 | ||||
|    // If we're opening a new window we don't want to attach it to a tooltip | ||||
|    // as it's short lived temporary window. | ||||
|    HideWaylandTooltips(); | ||||
| +  // Cleanup already closed menus
 | ||||
| +  CleanupWaylandPopups();
 | ||||
|   | ||||
|    GtkWindow* parentGtkWindow = nullptr; | ||||
| -
 | ||||
| -  if (IsMainMenuWindow()) {
 | ||||
| -    // Remove and hide already closed popups from the
 | ||||
| -    // 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.
 | ||||
| -    // 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<nsIWidget*, 5> widgetChain;
 | ||||
| -    pm->GetSubmenuWidgetChain(&widgetChain);
 | ||||
| -    for (unsigned long i = 0; i < widgetChain.Length() - 1; i++) {
 | ||||
| -      unsigned long parentIndex = i + 1;
 | ||||
| -      if (widgetChain.Length() > parentIndex && widgetChain[i] == this) {
 | ||||
| -        nsWindow* parentWindow =
 | ||||
| -            static_cast<nsWindow*>(widgetChain[parentIndex]);
 | ||||
| -        parentGtkWindow = GTK_WINDOW(parentWindow->GetGtkWidget());
 | ||||
| -        LOG(("  [%p] Found %p as parent in nsXULPopupManager.", this,
 | ||||
| -             parentWindow));
 | ||||
| -        break;
 | ||||
| -      }
 | ||||
| -    }
 | ||||
| -  } 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<nsWindow*>(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) {
 | ||||
| -      nsWindow* parentWindow =
 | ||||
| -          static_cast<nsWindow*>(gVisibleWaylandPopupWindows->data);
 | ||||
| -      parentGtkWindow = GTK_WINDOW(parentWindow->GetGtkWidget());
 | ||||
| -    }
 | ||||
| -  }
 | ||||
| +  if (HasRemoteContent() || IsWidgetOverflowWindow()) {
 | ||||
| +    LOG(
 | ||||
| +        ("  Hiding all opened popups because the window is remote content or "
 | ||||
| +         "overflow-widget"));
 | ||||
| +    HideWaylandOpenedPopups();
 | ||||
| +  }
 | ||||
| +
 | ||||
| +  parentGtkWindow = GetCurrentWindow();
 | ||||
|    if (parentGtkWindow) { | ||||
|      MOZ_ASSERT(parentGtkWindow != GTK_WINDOW(this->GetGtkWidget()), | ||||
|                 "Cannot set self as parent"); | ||||
|      gtk_window_set_transient_for(GTK_WINDOW(mShell), | ||||
|                                   GTK_WINDOW(parentGtkWindow)); | ||||
| -  } else {
 | ||||
| -    // Fallback to the parent given in nsWindow::Create (most likely the
 | ||||
| -    // toplevel window).
 | ||||
| -    parentGtkWindow = gtk_window_get_transient_for(GTK_WINDOW(mShell));
 | ||||
| -    LOG(("  Setting parent from transient: %p [GtkWindow]\n", parentGtkWindow));
 | ||||
| -  }
 | ||||
| -  // Add current window to the visible popup list
 | ||||
| -  gVisibleWaylandPopupWindows =
 | ||||
| -      g_list_prepend(gVisibleWaylandPopupWindows, this);
 | ||||
| -
 | ||||
| -  LOG(("  Parent window for %p: %p [GtkWindow]", this, parentGtkWindow));
 | ||||
| +    // Add current window to the visible popup list
 | ||||
| +    gVisibleWaylandPopupWindows =
 | ||||
| +        g_list_prepend(gVisibleWaylandPopupWindows, this);
 | ||||
| +    LOG(("  Parent window for %p: %p [GtkWindow]", this, parentGtkWindow));
 | ||||
| +  }
 | ||||
| +
 | ||||
| +  MOZ_ASSERT(parentGtkWindow, "NO parent window for %p: expect popup glitches");
 | ||||
|    return GTK_WIDGET(parentGtkWindow); | ||||
|  } | ||||
|   | ||||
| 
 | ||||
| @ -1,109 +0,0 @@ | ||||
| diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h
 | ||||
| --- a/widget/gtk/nsWindow.h
 | ||||
| +++ b/widget/gtk/nsWindow.h
 | ||||
| @@ -427,6 +427,8 @@
 | ||||
|  #endif | ||||
|    bool IsRemoteContent() { return HasRemoteContent(); } | ||||
|    static void HideWaylandOpenedPopups(); | ||||
| +  void NativeMoveResizeWaylandPopupCB(const GdkRectangle* aFinalSize,
 | ||||
| +                                      bool aFlippedX, bool aFlippedY);
 | ||||
|   | ||||
|   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
 | ||||
| @@ -1333,7 +1333,6 @@
 | ||||
|    return GTK_WIDGET(parentGtkWindow); | ||||
|  } | ||||
|   | ||||
| -#ifdef DEBUG
 | ||||
|  static void NativeMoveResizeWaylandPopupCallback( | ||||
|      GdkWindow* window, const GdkRectangle* flipped_rect, | ||||
|      const GdkRectangle* final_rect, gboolean flipped_x, gboolean flipped_y, | ||||
| @@ -1341,12 +1340,60 @@
 | ||||
|    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,
 | ||||
| +  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,
 | ||||
| +  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
 | ||||
| +  nsWindow* wnd = get_window_for_gdk_window(window);
 | ||||
| +
 | ||||
| +  wnd->NativeMoveResizeWaylandPopupCB(final_rect, flipped_x, flipped_y);
 | ||||
| +}
 | ||||
| +
 | ||||
| +void nsWindow::NativeMoveResizeWaylandPopupCB(const GdkRectangle* aFinalSize,
 | ||||
| +                                              bool aFlippedX, bool aFlippedY) {
 | ||||
| +  LOG(("  orig mBounds x=%d y=%d width=%d height=%d\n", mBounds.x, mBounds.y,
 | ||||
| +       mBounds.width, mBounds.height));
 | ||||
| +
 | ||||
| +  GtkWindow* parentGtkWindow = gtk_window_get_transient_for(GTK_WINDOW(mShell));
 | ||||
| +  if (!parentGtkWindow) {
 | ||||
| +    NS_WARNING("Popup has no parent!");
 | ||||
| +    return;
 | ||||
| +  }
 | ||||
| +
 | ||||
| +  // The position of the menu in GTK is relative to it's parent window while
 | ||||
| +  // in mBounds we have position relative to toplevel window. We need to check
 | ||||
| +  // and update mBounds in the toplevel coordinates.
 | ||||
| +  int x_parent, y_parent;
 | ||||
| +  gdk_window_get_origin(gtk_widget_get_window(GTK_WIDGET(parentGtkWindow)),
 | ||||
| +                        &x_parent, &y_parent);
 | ||||
| +
 | ||||
| +  LayoutDeviceIntRect newBounds(aFinalSize->x + x_parent,
 | ||||
| +                                aFinalSize->y + y_parent, aFinalSize->width,
 | ||||
| +                                aFinalSize->height);
 | ||||
| +
 | ||||
| +  newBounds.Scale(nsWindow::GdkScaleFactor());
 | ||||
| +  LOG(("  new mBounds  x=%d y=%d width=%d height=%d\n", newBounds.x,
 | ||||
| +       newBounds.y, newBounds.width, newBounds.height));
 | ||||
| +
 | ||||
| +  bool needsPositionUpdate =
 | ||||
| +      (newBounds.x != mBounds.x || newBounds.y != mBounds.y);
 | ||||
| +  bool needsSizeUpdate =
 | ||||
| +      (newBounds.width != mBounds.width || newBounds.height != mBounds.height);
 | ||||
| +
 | ||||
| +  if (!needsPositionUpdate && !needsSizeUpdate) {
 | ||||
| +    return;
 | ||||
| +  }
 | ||||
| +
 | ||||
| +  if (needsPositionUpdate && needsSizeUpdate) {
 | ||||
| +    Resize(newBounds.x, newBounds.y, newBounds.width, newBounds.height, true);
 | ||||
| +    NotifyWindowMoved(newBounds.x, newBounds.y);
 | ||||
| +  } else if (needsPositionUpdate) {
 | ||||
| +    Move(newBounds.x, newBounds.y);
 | ||||
| +    NotifyWindowMoved(newBounds.x, newBounds.y);
 | ||||
| +  } else {
 | ||||
| +    Resize(newBounds.width, newBounds.height, true);
 | ||||
| +  }
 | ||||
| +}
 | ||||
|   | ||||
|  void nsWindow::NativeMoveResizeWaylandPopup(GdkPoint* aPosition, | ||||
|                                              GdkRectangle* aSize) { | ||||
| @@ -1392,15 +1439,16 @@
 | ||||
|      rect.width = aSize->width; | ||||
|      rect.height = aSize->height; | ||||
|    } | ||||
| -
 | ||||
| -#ifdef DEBUG
 | ||||
| +  LOG(("  x_parent    %d   y_parent    %d\n", x_parent, y_parent));
 | ||||
| +  LOG(("  aPosition x %d   aPosition y %d\n", aPosition->x, aPosition->y));
 | ||||
| +  LOG(("  rect.x      %d   rect.y      %d\n", rect.x, rect.y));
 | ||||
| +
 | ||||
|    if (!g_signal_handler_find( | ||||
|            gdkWindow, G_SIGNAL_MATCH_FUNC, 0, 0, nullptr, | ||||
|            FuncToGpointer(NativeMoveResizeWaylandPopupCallback), this)) { | ||||
|      g_signal_connect(gdkWindow, "moved-to-rect", | ||||
|                       G_CALLBACK(NativeMoveResizeWaylandPopupCallback), this); | ||||
|    } | ||||
| -#endif
 | ||||
|   | ||||
|    GdkGravity rectAnchor = GDK_GRAVITY_NORTH_WEST; | ||||
|    GdkGravity menuAnchor = GDK_GRAVITY_NORTH_WEST; | ||||
| 
 | ||||
| @ -1,60 +0,0 @@ | ||||
| diff --git a/widget/gtk/WindowSurfaceWayland.cpp b/widget/gtk/WindowSurfaceWayland.cpp
 | ||||
| --- a/widget/gtk/WindowSurfaceWayland.cpp
 | ||||
| +++ b/widget/gtk/WindowSurfaceWayland.cpp
 | ||||
| @@ -805,6 +805,10 @@
 | ||||
|    mBufferCommitAllowed = false; | ||||
|   | ||||
|    LayoutDeviceIntRect lockedScreenRect = mWindow->GetBounds(); | ||||
| +  // The window bounds of popup windows contains relative position to
 | ||||
| +  // the transient window. We need to remove that effect because by changing
 | ||||
| +  // position of the popup window the buffer has not changed its size.
 | ||||
| +  lockedScreenRect.x = lockedScreenRect.y = 0;
 | ||||
|    gfx::IntRect lockSize = aRegion.GetBounds().ToUnknownRect(); | ||||
|   | ||||
|    bool isTransparentPopup = | ||||
| diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
 | ||||
| --- a/widget/gtk/nsWindow.cpp
 | ||||
| +++ b/widget/gtk/nsWindow.cpp
 | ||||
| @@ -1324,6 +1324,7 @@
 | ||||
|      // Fallback to the parent given in nsWindow::Create (most likely the | ||||
|      // toplevel window). | ||||
|      parentGtkWindow = gtk_window_get_transient_for(GTK_WINDOW(mShell)); | ||||
| +    LOG(("  Setting parent from transient: %p [GtkWindow]\n", parentGtkWindow));
 | ||||
|    } | ||||
|    // Add current window to the visible popup list | ||||
|    gVisibleWaylandPopupWindows = | ||||
| @@ -1355,7 +1356,7 @@
 | ||||
|         mBounds.width, mBounds.height)); | ||||
|   | ||||
|    GtkWindow* parentGtkWindow = gtk_window_get_transient_for(GTK_WINDOW(mShell)); | ||||
| -  if (!parentGtkWindow) {
 | ||||
| +  if (!parentGtkWindow || !GTK_IS_WIDGET(parentGtkWindow)) {
 | ||||
|      NS_WARNING("Popup has no parent!"); | ||||
|      return; | ||||
|    } | ||||
| @@ -1431,8 +1432,13 @@
 | ||||
|         parentWindow)); | ||||
|   | ||||
|    int x_parent, y_parent; | ||||
| -  gdk_window_get_origin(gtk_widget_get_window(GTK_WIDGET(parentWindow)),
 | ||||
| -                        &x_parent, &y_parent);
 | ||||
| +  if (parentWindow) {
 | ||||
| +    gdk_window_get_origin(gtk_widget_get_window(GTK_WIDGET(parentWindow)),
 | ||||
| +                          &x_parent, &y_parent);
 | ||||
| +  } else {
 | ||||
| +    NS_WARNING(("no parent window, this should not happen for popup!"));
 | ||||
| +    x_parent = y_parent = 0;
 | ||||
| +  }
 | ||||
|   | ||||
|    GdkRectangle rect = {aPosition->x - x_parent, aPosition->y - y_parent, 1, 1}; | ||||
|    if (aSize) { | ||||
| @@ -1470,7 +1476,7 @@
 | ||||
|    bool isWidgetVisible = | ||||
|        (sGtkWidgetIsVisible != nullptr) && sGtkWidgetIsVisible(mShell); | ||||
|    if (isWidgetVisible) { | ||||
| -    HideWaylandWindow();
 | ||||
| +    gtk_widget_hide(mShell);
 | ||||
|    } | ||||
|   | ||||
|    LOG(("  requested rect: x: %d y: %d width: %d height: %d\n", rect.x, rect.y, | ||||
| 
 | ||||
| @ -1,73 +0,0 @@ | ||||
| diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h
 | ||||
| --- a/widget/gtk/nsWindow.h
 | ||||
| +++ b/widget/gtk/nsWindow.h
 | ||||
| @@ -681,6 +681,7 @@
 | ||||
|   | ||||
|    bool IsMainMenuWindow(); | ||||
|    GtkWidget* ConfigureWaylandPopupWindows(); | ||||
| +  void PauseRemoteRenderer();
 | ||||
|    void HideWaylandWindow(); | ||||
|    void HideWaylandTooltips(); | ||||
|    void HideWaylandPopupAndAllChildren(); | ||||
| diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
 | ||||
| --- a/widget/gtk/nsWindow.cpp
 | ||||
| +++ b/widget/gtk/nsWindow.cpp
 | ||||
| @@ -1386,10 +1386,10 @@
 | ||||
|    } | ||||
|   | ||||
|    if (needsPositionUpdate && needsSizeUpdate) { | ||||
| -    Resize(newBounds.x, newBounds.y, newBounds.width, newBounds.height, true);
 | ||||
| +    mBounds = newBounds;
 | ||||
|      NotifyWindowMoved(newBounds.x, newBounds.y); | ||||
|    } else if (needsPositionUpdate) { | ||||
| -    Move(newBounds.x, newBounds.y);
 | ||||
| +    mBounds = newBounds;
 | ||||
|      NotifyWindowMoved(newBounds.x, newBounds.y); | ||||
|    } else { | ||||
|      Resize(newBounds.width, newBounds.height, true); | ||||
| @@ -1476,6 +1476,7 @@
 | ||||
|    bool isWidgetVisible = | ||||
|        (sGtkWidgetIsVisible != nullptr) && sGtkWidgetIsVisible(mShell); | ||||
|    if (isWidgetVisible) { | ||||
| +    PauseRemoteRenderer();
 | ||||
|      gtk_widget_hide(mShell); | ||||
|    } | ||||
|   | ||||
| @@ -4497,16 +4498,8 @@
 | ||||
|    } | ||||
|  } | ||||
|   | ||||
| -void nsWindow::HideWaylandWindow() {
 | ||||
| +void nsWindow::PauseRemoteRenderer() {
 | ||||
|  #ifdef MOZ_WAYLAND | ||||
| -  if (mWindowType == eWindowType_popup) {
 | ||||
| -    LOG(("nsWindow::HideWaylandWindow: popup [%p]\n", this));
 | ||||
| -    GList* foundWindow = g_list_find(gVisibleWaylandPopupWindows, this);
 | ||||
| -    if (foundWindow) {
 | ||||
| -      gVisibleWaylandPopupWindows =
 | ||||
| -          g_list_delete_link(gVisibleWaylandPopupWindows, foundWindow);
 | ||||
| -    }
 | ||||
| -  }
 | ||||
|    if (!mIsDestroyed) { | ||||
|      if (mContainer && moz_container_has_wl_egl_window(mContainer)) { | ||||
|        // Because wl_egl_window is destroyed on moz_container_unmap(), | ||||
| @@ -4529,6 +4522,18 @@
 | ||||
|      } | ||||
|    } | ||||
|  #endif | ||||
| +}
 | ||||
| +
 | ||||
| +void nsWindow::HideWaylandWindow() {
 | ||||
| +  if (mWindowType == eWindowType_popup) {
 | ||||
| +    LOG(("nsWindow::HideWaylandWindow: popup [%p]\n", this));
 | ||||
| +    GList* foundWindow = g_list_find(gVisibleWaylandPopupWindows, this);
 | ||||
| +    if (foundWindow) {
 | ||||
| +      gVisibleWaylandPopupWindows =
 | ||||
| +          g_list_delete_link(gVisibleWaylandPopupWindows, foundWindow);
 | ||||
| +    }
 | ||||
| +  }
 | ||||
| +  PauseRemoteRenderer();
 | ||||
|    gtk_widget_hide(mShell); | ||||
|  } | ||||
|   | ||||
| 
 | ||||
							
								
								
									
										4
									
								
								sources
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								sources
									
									
									
									
									
								
							| @ -1,3 +1,3 @@ | ||||
| SHA512 (cbindgen-vendor.tar.xz) = 9709c47df2dfb615554c6616c1d9f94c7a408ea4382400bd9f75eae29b0819a6418b5625eb0df2508fcbbbb74672347d00a5f6557755b9dd9de7d42fb2e509c4 | ||||
| SHA512 (firefox-73.0.1.source.tar.xz) = 89fac2c50e092f2805f48399f68cdf0793324e1dce89266f62b76e9b335dfc553ae54a36738992630b6035a52cd65b9aa774e7e54cea2e3ec7d609d9219cdf76 | ||||
| SHA512 (firefox-langpacks-73.0.1-20200220.tar.xz) = 652f9ebfcec2921d13baea5433d86f160bea66e0b528f94874ff19a9e1b73978c23651dce964755ca2bc87fecd2baeb239f613230fb2fe59b8bcd0b4d40f296f | ||||
| SHA512 (firefox-74.0.source.tar.xz) = 83fcdf1a8a702cc480314dbbef0a819f95fac2ebbe275207b052ba8d62bfa9d93dc21b25ebfc466e798933e3f7b9a3bd9afc6afc295451495bb3d8a2bf864f44 | ||||
| SHA512 (firefox-langpacks-74.0-20200303.tar.xz) = 3cdb50c27adaaa85d727f2a8c0c6a284092fa4af815fdfbc8d170066287b22b566d052cc8e151ed901bcebf1a5ae2f19bb68be543738d35eac4a316aadb78232 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user