New commits:
commit 384eafbcb5e0dd73e801af78358351127e6840e0
Author: Pavel Vinogradov <public AT sourcemage.org>
Commit: Pavel Vinogradov <public AT sourcemage.org>
b/http/firefox/patches/0025-bgo-925101-force-software-rendering-during-pgo-build.patch
new file mode 100644
index 0000000..7f4b987
--- /dev/null
+++
b/http/firefox/patches/0025-bgo-925101-force-software-rendering-during-pgo-build.patch
@@ -0,0 +1,16 @@
+
+bgo#925101 for some unknown reason some users are having issues with pgo
crashing. Forcing software
+rendering to be used while pgo'ing doesn't have an impact in performance, as
hwaccel isn't used
+during pgo even when it works. The issue could be caused by
wrongly/automatically
+configured/detected gpu access anyway. The issue seems related to mesa, but
hard to pinpoint.
+
+diff '--color=auto' -Naur a/testing/profiles/profileserver/user.js
b/testing/profiles/profileserver/user.js
+--- a/testing/profiles/profileserver/user.js 2024-07-11 10:37:53.889115118
+0300
++++ b/testing/profiles/profileserver/user.js 2024-07-11 10:40:23.086996283
+0300
+@@ -11,3 +11,6 @@
+ user_pref("extensions.webextensions.warnings-as-errors", false);
+ // Turn off update
+ user_pref("app.update.disabledForTesting", true);
++// bgo#925101 mesa issues with pgo, force software rendering during pgo
++user_pref("gfx.webrender.software", true);
++
diff --git
a/http/firefox/patches/0025-mozilla-bundled-ffmpeg-7-gcc-14-incompatible-pointer-types.patch
b/http/firefox/patches/0025-mozilla-bundled-ffmpeg-7-gcc-14-incompatible-pointer-types.patch
deleted file mode 100644
index 1fca899..0000000
---
a/http/firefox/patches/0025-mozilla-bundled-ffmpeg-7-gcc-14-incompatible-pointer-types.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff -Naur a/media/ffvpx/libavcodec/moz.build
b/media/ffvpx/libavcodec/moz.build
---- a/media/ffvpx/libavcodec/moz.build 2024-06-07 00:33:58.000000000 +0300
-+++ b/media/ffvpx/libavcodec/moz.build 2024-06-10 21:13:44.142620997 +0300
-@@ -143,6 +143,10 @@
- c11_flags = ["-std=gnu11"]
- if CONFIG["CC_TYPE"] == "clang-cl":
- c11_flags.insert(0, "-Xclang")
-+
-+if CONFIG["CC_TYPE"] == "gcc" and int(CONFIG["CC_VERSION"].split(".")[0])
>= 14:
-+ c11_flags.insert(0, "-Wno-error=incompatible-pointer-types")
-+
- CFLAGS += c11_flags
-
- if not CONFIG["MOZ_SYSTEM_LIBVPX"]:
diff --git a/http/firefox/patches/0026-bgo-929967-fix-pgo-on-musl.patch
b/http/firefox/patches/0026-bgo-929967-fix-pgo-on-musl.patch
new file mode 100644
index 0000000..3c8457e
--- /dev/null
+++ b/http/firefox/patches/0026-bgo-929967-fix-pgo-on-musl.patch
@@ -0,0 +1,14 @@
+diff --git a/build/pgo/profileserver.py b/build/pgo/profileserver.py
+index 7354714..0385792 100755
+--- a/build/pgo/profileserver.py
++++ b/build/pgo/profileserver.py
+@@ -171,6 +171,9 @@ if __name__ == "__main__":
+ env["UPLOAD_PATH"], "profile-run-1.log"
+ )
+
++ # Workaround for https://bugs.gentoo.org/929967
++ env["LD_LIBRARY_PATH"] = os.path.join(os.getcwd(), "dist", "bin")
++
+ # Run Firefox a first time to initialize its profile
+ runner = FirefoxRunner(
+ profile=profile,
diff --git
a/http/firefox/patches/0026-bmo-1898476-nvidia-wayland-egl-sync.patch
b/http/firefox/patches/0026-bmo-1898476-nvidia-wayland-egl-sync.patch
deleted file mode 100644
index 8f8f9cb..0000000
--- a/http/firefox/patches/0026-bmo-1898476-nvidia-wayland-egl-sync.patch
+++ /dev/null
@@ -1,368 +0,0 @@
-diff --git a/widget/gtk/MozContainerSurfaceLock.cpp
b/widget/gtk/MozContainerSurfaceLock.cpp
-new file mode 100644
---- /dev/null
-+++ b/widget/gtk/MozContainerSurfaceLock.cpp
-@@ -0,0 +1,31 @@
-+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2
-*- */
-+/* This Source Code Form is subject to the terms of the Mozilla Public
-+ * License, v. 2.0. If a copy of the MPL was not distributed with this
-+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-+
-+#include "MozContainerSurfaceLock.h"
-+#include "MozContainer.h"
-+#include "WidgetUtilsGtk.h"
-+
-+using namespace mozilla::widget;
-+
-+MozContainerSurfaceLock::MozContainerSurfaceLock(MozContainer* aContainer) {
-+#ifdef MOZ_WAYLAND
-+ mContainer = aContainer;
-+ if (GdkIsWaylandDisplay()) {
-+ // mSurface can be nullptr if we lock hidden MozContainer and
-+ // that's correct, MozContainer is still locked.
-+ mSurface = moz_container_wayland_surface_lock(aContainer);
-+ }
-+#endif
-+}
-+
-+MozContainerSurfaceLock::~MozContainerSurfaceLock() {
-+#ifdef MOZ_WAYLAND
-+ if (GdkIsWaylandDisplay()) {
-+ moz_container_wayland_surface_unlock(mContainer, &mSurface);
-+ }
-+#endif
-+}
-+
-+struct wl_surface* MozContainerSurfaceLock::GetSurface() { return mSurface;
}
-diff --git a/widget/gtk/MozContainerSurfaceLock.h
b/widget/gtk/MozContainerSurfaceLock.h
-new file mode 100644
---- /dev/null
-+++ b/widget/gtk/MozContainerSurfaceLock.h
-@@ -0,0 +1,28 @@
-+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2
-*- */
-+/* This Source Code Form is subject to the terms of the Mozilla Public
-+ * License, v. 2.0. If a copy of the MPL was not distributed with this
-+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-+
-+#ifndef widget_gtk_MozContainerSurfaceLock_h
-+#define widget_gtk_MozContainerSurfaceLock_h
-+
-+struct wl_surface;
-+struct _MozContainer;
-+typedef struct _MozContainer MozContainer;
-+
-+class MozContainerSurfaceLock {
-+ public:
-+ explicit MozContainerSurfaceLock(MozContainer* aContainer);
-+ ~MozContainerSurfaceLock();
-+
-+ // wl_surface can be nullptr if we lock hidden MozContainer.
-+ struct wl_surface* GetSurface();
-+
-+ private:
-+#ifdef MOZ_WAYLAND
-+ MozContainer* mContainer = nullptr;
-+#endif
-+ struct wl_surface* mSurface = nullptr;
-+};
-+
-+#endif // widget_gtk_MozContainerSurfaceLock_h
-diff --git a/widget/gtk/MozContainerWayland.cpp
b/widget/gtk/MozContainerWayland.cpp
---- a/widget/gtk/MozContainerWayland.cpp
-+++ b/widget/gtk/MozContainerWayland.cpp
-@@ -82,33 +82,16 @@ using namespace mozilla;
- using namespace mozilla::widget;
-
- static bool moz_container_wayland_surface_create_locked(
- const MutexAutoLock& aProofOfLock, MozContainer* container);
- static void moz_container_wayland_set_opaque_region_locked(
- const MutexAutoLock& aProofOfLock, MozContainer* container,
- const LayoutDeviceIntRegion&);
-
--// Lock mozcontainer and get wayland surface of it. You need to pair with
--// moz_container_wayland_surface_unlock() even
--// if moz_container_wayland_surface_lock() fails and returns nullptr.
--static struct wl_surface* moz_container_wayland_surface_lock(
-- MozContainer* container);
--static void moz_container_wayland_surface_unlock(MozContainer* container,
-- struct wl_surface**
surface);
--
--MozContainerSurfaceLock::MozContainerSurfaceLock(MozContainer* aContainer) {
-- mContainer = aContainer;
-- mSurface = moz_container_wayland_surface_lock(aContainer);
--}
--MozContainerSurfaceLock::~MozContainerSurfaceLock() {
-- moz_container_wayland_surface_unlock(mContainer, &mSurface);
--}
--struct wl_surface* MozContainerSurfaceLock::GetSurface() { return mSurface;
}
--
- // Invalidate gtk wl_surface to commit changes to wl_subsurface.
- // wl_subsurface changes are effective when parent surface is commited.
- static void moz_container_wayland_invalidate(MozContainer* container) {
- LOGWAYLAND("moz_container_wayland_invalidate [%p]\n",
- (void*)moz_container_get_nsWindow(container));
-
- GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(container));
- if (!window) {
-diff --git a/widget/gtk/MozContainerWayland.h
b/widget/gtk/MozContainerWayland.h
---- a/widget/gtk/MozContainerWayland.h
-+++ b/widget/gtk/MozContainerWayland.h
-@@ -8,16 +8,17 @@
- #ifndef __MOZ_CONTAINER_WAYLAND_H__
- #define __MOZ_CONTAINER_WAYLAND_H__
-
- #include <gtk/gtk.h>
- #include <functional>
- #include <vector>
- #include "mozilla/Mutex.h"
- #include "WindowSurface.h"
-+#include "MozContainerSurfaceLock.h"
-
- /*
- * MozContainer
- *
- * This class serves three purposes in the nsIWidget implementation.
- *
- * - It provides objects to receive signals from GTK for events on native
- * windows.
-@@ -56,25 +57,22 @@ struct MozContainerWayland {
- mozilla::Mutex container_lock{"MozContainerWayland::container_lock"};
- };
-
- struct _MozContainer;
- struct _MozContainerClass;
- typedef struct _MozContainer MozContainer;
- typedef struct _MozContainerClass MozContainerClass;
-
--class MozContainerSurfaceLock {
-- MozContainer* mContainer;
-- struct wl_surface* mSurface;
--
-- public:
-- explicit MozContainerSurfaceLock(MozContainer* aContainer);
-- ~MozContainerSurfaceLock();
-- struct wl_surface* GetSurface();
--};
-+// Lock mozcontainer and get wayland surface of it. You need to pair with
-+// moz_container_wayland_surface_unlock() even
-+// if moz_container_wayland_surface_lock() fails and returns nullptr.
-+struct wl_surface* moz_container_wayland_surface_lock(MozContainer*
container);
-+void moz_container_wayland_surface_unlock(MozContainer* container,
-+ struct wl_surface** surface);
-
- void moz_container_wayland_map(GtkWidget*);
- gboolean moz_container_wayland_map_event(GtkWidget*, GdkEventAny*);
- void moz_container_wayland_size_allocate(GtkWidget*, GtkAllocation*);
- void moz_container_wayland_unmap(GtkWidget*);
-
- struct wl_egl_window* moz_container_wayland_get_egl_window(
- MozContainer* container, double scale);
-diff --git a/widget/gtk/moz.build b/widget/gtk/moz.build
---- a/widget/gtk/moz.build
-+++ b/widget/gtk/moz.build
-@@ -28,16 +28,17 @@ if CONFIG["MOZ_WAYLAND"]:
- if CONFIG["MOZ_ENABLE_VAAPI"]:
- DIRS += ["vaapitest"]
-
- if CONFIG["MOZ_ENABLE_V4L2"]:
- DIRS += ["v4l2test"]
-
- EXPORTS += [
- "MozContainer.h",
-+ "MozContainerSurfaceLock.h",
- "nsGTKToolkit.h",
- "nsGtkUtils.h",
- "nsImageToPixbuf.h",
- ]
-
- EXPORTS.mozilla += [
- "GfxInfo.h",
- "GfxInfoUtils.h",
-@@ -66,16 +67,17 @@ UNIFIED_SOURCES += [
- "DMABufLibWrapper.cpp",
- "DMABufSurface.cpp",
- "GfxInfo.cpp",
- "gtk3drawing.cpp",
- "GtkCompositorWidget.cpp",
- "IMContextWrapper.cpp",
- "InProcessGtkCompositorWidget.cpp",
- "MozContainer.cpp",
-+ "MozContainerSurfaceLock.cpp",
- "MPRISServiceHandler.cpp",
- "NativeKeyBindings.cpp",
- "NativeMenuGtk.cpp",
- "NativeMenuSupport.cpp",
- "nsApplicationChooser.cpp",
- "nsAppShell.cpp",
- "nsBidiKeyboard.cpp",
- "nsClipboard.cpp",
-@@ -109,16 +111,17 @@ if CONFIG["MOZ_WAYLAND"]:
- UNIFIED_SOURCES += [
- "MozContainerWayland.cpp",
- "nsClipboardWayland.cpp",
- "nsWaylandDisplay.cpp",
- "WaylandBuffer.cpp",
- "WindowSurfaceWaylandMultiBuffer.cpp",
- ]
- EXPORTS.mozilla.widget += [
-+ "MozContainerSurfaceLock.h",
- "MozContainerWayland.h",
- "nsWaylandDisplay.h",
- "WaylandBuffer.h",
- ]
-
- if CONFIG["MOZ_X11"]:
- UNIFIED_SOURCES += [
- "nsClipboardX11.cpp",
-
-diff --git a/widget/gtk/GtkCompositorWidget.cpp
b/widget/gtk/GtkCompositorWidget.cpp
---- a/widget/gtk/GtkCompositorWidget.cpp
-+++ b/widget/gtk/GtkCompositorWidget.cpp
-@@ -206,10 +206,14 @@ void GtkCompositorWidget::SetRenderingSu
- }
-
- #ifdef MOZ_LOGGING
- bool GtkCompositorWidget::IsPopup() {
- return mWidget ? mWidget->IsPopup() : false;
- }
- #endif
-
-+UniquePtr<MozContainerSurfaceLock> GtkCompositorWidget::LockSurface() {
-+ return mWidget ? mWidget->LockSurface() : nullptr;
-+}
-+
- } // namespace widget
- } // namespace mozilla
-diff --git a/widget/gtk/GtkCompositorWidget.h
b/widget/gtk/GtkCompositorWidget.h
---- a/widget/gtk/GtkCompositorWidget.h
-+++ b/widget/gtk/GtkCompositorWidget.h
-@@ -5,16 +5,18 @@
-
- #ifndef widget_gtk_GtkCompositorWidget_h
- #define widget_gtk_GtkCompositorWidget_h
-
- #include "GLDefs.h"
- #include "mozilla/DataMutex.h"
- #include "mozilla/widget/CompositorWidget.h"
- #include "WindowSurfaceProvider.h"
-+#include "mozilla/UniquePtr.h"
-+#include "MozContainerSurfaceLock.h"
-
- class nsIWidget;
- class nsWindow;
-
- namespace mozilla {
-
- namespace layers {
- class NativeLayerRootWayland;
-@@ -91,16 +93,18 @@ class GtkCompositorWidget : public Compo
- RefPtr<mozilla::layers::NativeLayerRoot> GetNativeLayerRoot() override;
- #endif
-
- // PlatformCompositorWidgetDelegate Overrides
-
- void NotifyClientSizeChanged(const LayoutDeviceIntSize& aClientSize)
override;
- GtkCompositorWidget* AsGtkCompositorWidget() override { return this; }
-
-+ UniquePtr<MozContainerSurfaceLock> LockSurface();
-+
- private:
- #if defined(MOZ_WAYLAND)
- void ConfigureWaylandBackend();
- #endif
- #if defined(MOZ_X11)
- void ConfigureX11Backend(Window aXWindow, bool aShaped);
- #endif
- #ifdef MOZ_LOGGING
-diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
---- a/widget/gtk/nsWindow.cpp
-+++ b/widget/gtk/nsWindow.cpp
-@@ -10271,8 +10271,15 @@ void nsWindow::SetDragSource(GdkDragCont
- mSourceDragContext = aSourceDragContext;
- if (IsPopup() &&
- (widget::GdkIsWaylandDisplay() || widget::IsXWaylandProtocol())) {
- if (auto* menuPopupFrame = GetMenuPopupFrame(GetFrame())) {
- menuPopupFrame->SetIsDragSource(!!aSourceDragContext);
- }
- }
- }
-+
-+UniquePtr<MozContainerSurfaceLock> nsWindow::LockSurface() {
-+ if (mIsDestroyed) {
-+ return nullptr;
-+ }
-+ return MakeUnique<MozContainerSurfaceLock>(mContainer);
-+}
-diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h
---- a/widget/gtk/nsWindow.h
-+++ b/widget/gtk/nsWindow.h
-@@ -8,16 +8,17 @@
- #ifndef __nsWindow_h__
- #define __nsWindow_h__
-
- #include <gdk/gdk.h>
- #include <gtk/gtk.h>
-
- #include "CompositorWidget.h"
- #include "MozContainer.h"
-+#include "MozContainerSurfaceLock.h"
- #include "VsyncSource.h"
- #include "mozilla/EventForwards.h"
- #include "mozilla/Maybe.h"
- #include "mozilla/RefPtr.h"
- #include "mozilla/TouchEvents.h"
- #include "mozilla/UniquePtr.h"
- #include "mozilla/RWLock.h"
- #include "mozilla/widget/WindowSurface.h"
-@@ -416,16 +417,18 @@ class nsWindow final : public nsBaseWidg
- static bool TitlebarUseShapeMask();
- bool IsRemoteContent() { return HasRemoteContent(); }
- void NativeMoveResizeWaylandPopupCallback(const GdkRectangle* aFinalSize,
- bool aFlippedX, bool aFlippedY);
- static bool IsToplevelWindowTransparent();
-
- static nsWindow* GetFocusedWindow();
-
-+ mozilla::UniquePtr<MozContainerSurfaceLock> LockSurface();
-+
- #ifdef MOZ_WAYLAND
- // Use xdg-activation protocol to transfer focus from gFocusWindow to
aWindow.
- static void TransferFocusToWaylandWindow(nsWindow* aWindow);
- void FocusWaylandWindow(const char* aTokenID);
-
- bool GetCSDDecorationOffset(int* aDx, int* aDy);
- bool SetEGLNativeWindowSize(const LayoutDeviceIntSize& aEGLWindowSize);
- void WaylandDragWorkaround(GdkEventButton* aEvent);
-
-diff --git a/gfx/webrender_bindings/RenderCompositorEGL.cpp
b/gfx/webrender_bindings/RenderCompositorEGL.cpp
---- a/gfx/webrender_bindings/RenderCompositorEGL.cpp
-+++ b/gfx/webrender_bindings/RenderCompositorEGL.cpp
-@@ -149,16 +149,26 @@ RenderedFrameId RenderCompositorEGL::End
- const auto width = right - left;
- const auto height = bottom - top;
-
- bufferInvalid.OrWith(
- gfx::IntRect(left, (GetBufferSize().height - bottom), width,
height));
- }
- gl()->SetDamage(bufferInvalid);
- }
-+
-+#ifdef MOZ_WIDGET_GTK
-+ // Rendering on Wayland has to be atomic (buffer attach + commit) and
-+ // wayland surface is also used by main thread so lock it before
-+ // we paint at SwapBuffers().
-+ UniquePtr<MozContainerSurfaceLock> lock;
-+ if (auto* gtkWidget = mWidget->AsGTK()) {
-+ lock = gtkWidget->LockSurface();
-+ }
-+#endif
- gl()->SwapBuffers();
- return frameId;
- }
-
- void RenderCompositorEGL::Pause() { DestroyEGLSurface(); }
-
- bool RenderCompositorEGL::Resume() {
- if (kIsAndroid) {
-
-
diff --git
a/http/firefox/patches/0027-bgo-925101-force-software-rendering-during-pgo-build.patch
b/http/firefox/patches/0027-bgo-925101-force-software-rendering-during-pgo-build.patch
deleted file mode 100644
index 7f4b987..0000000
---
a/http/firefox/patches/0027-bgo-925101-force-software-rendering-during-pgo-build.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-
-bgo#925101 for some unknown reason some users are having issues with pgo
crashing. Forcing software
-rendering to be used while pgo'ing doesn't have an impact in performance, as
hwaccel isn't used
-during pgo even when it works. The issue could be caused by
wrongly/automatically
-configured/detected gpu access anyway. The issue seems related to mesa, but
hard to pinpoint.
-
-diff '--color=auto' -Naur a/testing/profiles/profileserver/user.js
b/testing/profiles/profileserver/user.js
---- a/testing/profiles/profileserver/user.js 2024-07-11 10:37:53.889115118
+0300
-+++ b/testing/profiles/profileserver/user.js 2024-07-11 10:40:23.086996283
+0300
-@@ -11,3 +11,6 @@
- user_pref("extensions.webextensions.warnings-as-errors", false);
- // Turn off update
- user_pref("app.update.disabledForTesting", true);
-+// bgo#925101 mesa issues with pgo, force software rendering during pgo
-+user_pref("gfx.webrender.software", true);
-+
diff --git
a/http/firefox/patches/0027-bmo-1913286-filter-out-unsupported-devices-for-pipewire-camera-screencasting.patch
b/http/firefox/patches/0027-bmo-1913286-filter-out-unsupported-devices-for-pipewire-camera-screencasting.patch
new file mode 100644
index 0000000..7131aa0
--- /dev/null
+++
b/http/firefox/patches/0027-bmo-1913286-filter-out-unsupported-devices-for-pipewire-camera-screencasting.patch
@@ -0,0 +1,330 @@
+
+# HG changeset patch
+# User Jan Grulich <jgrulich AT redhat.com>
+# Date 1725275240 0
+# Node ID 25415f3c344023667c01089f74b9f0c6fc7b6a56
+# Parent 3071e3421b420019ce714503e0d96f68f0289268
+Bug 1913286 - WebRTC backport: PipeWire camera: filter out devices with no
capabilities r=pehrsons,webrtc-reviewers
+
+Filter out devices that do not support any format supported by WebRTC.
+This will for example be IR cameras that show as duplicated in the list
+of cameras, but support only GRAY8 format and for that reason do not
+work at all.
+
+This is a simple backport of an WebRTC upstream change.
+
+Upstream commit: b4aba7834e6c94adace1cb4c20e2e1ee70eb9cc5
+
+Differential Revision: https://phabricator.services.mozilla.com/D219224
+
+diff --git
a/third_party/libwebrtc/modules/video_capture/linux/device_info_pipewire.cc
b/third_party/libwebrtc/modules/video_capture/linux/device_info_pipewire.cc
+---
a/third_party/libwebrtc/modules/video_capture/linux/device_info_pipewire.cc
++++
b/third_party/libwebrtc/modules/video_capture/linux/device_info_pipewire.cc
+@@ -52,56 +52,56 @@ int32_t DeviceInfoPipeWire::GetDeviceNam
+ uint32_t
productUniqueIdUTF8Length,
+ pid_t* pid,
+ bool* deviceIsPlaceholder) {
+ RTC_CHECK(pipewire_session_);
+
+ if (deviceNumber >= NumberOfDevices())
+ return -1;
+
+- const PipeWireNode& node = pipewire_session_->nodes().at(deviceNumber);
++ const auto& node = pipewire_session_->nodes().at(deviceNumber);
+
+- if (deviceNameLength <= node.display_name().length()) {
++ if (deviceNameLength <= node->display_name().length()) {
+ RTC_LOG(LS_INFO) << "deviceNameUTF8 buffer passed is too small";
+ return -1;
+ }
+- if (deviceUniqueIdUTF8Length <= node.unique_id().length()) {
++ if (deviceUniqueIdUTF8Length <= node->unique_id().length()) {
+ RTC_LOG(LS_INFO) << "deviceUniqueIdUTF8 buffer passed is too small";
+ return -1;
+ }
+ if (productUniqueIdUTF8 &&
+- productUniqueIdUTF8Length <= node.model_id().length()) {
++ productUniqueIdUTF8Length <= node->model_id().length()) {
+ RTC_LOG(LS_INFO) << "productUniqueIdUTF8 buffer passed is too small";
+ return -1;
+ }
+
+ memset(deviceNameUTF8, 0, deviceNameLength);
+- node.display_name().copy(deviceNameUTF8, deviceNameLength);
++ node->display_name().copy(deviceNameUTF8, deviceNameLength);
+
+ memset(deviceUniqueIdUTF8, 0, deviceUniqueIdUTF8Length);
+- node.unique_id().copy(deviceUniqueIdUTF8, deviceUniqueIdUTF8Length);
++ node->unique_id().copy(deviceUniqueIdUTF8, deviceUniqueIdUTF8Length);
+
+ if (productUniqueIdUTF8) {
+ memset(productUniqueIdUTF8, 0, productUniqueIdUTF8Length);
+- node.model_id().copy(productUniqueIdUTF8, productUniqueIdUTF8Length);
++ node->model_id().copy(productUniqueIdUTF8, productUniqueIdUTF8Length);
+ }
+
+ return 0;
+ }
+
+ int32_t DeviceInfoPipeWire::CreateCapabilityMap(
+ const char* deviceUniqueIdUTF8) {
+ RTC_CHECK(pipewire_session_);
+
+ for (auto& node : pipewire_session_->nodes()) {
+- if (node.unique_id().compare(deviceUniqueIdUTF8) != 0)
++ if (node->unique_id().compare(deviceUniqueIdUTF8) != 0)
+ continue;
+
+- _captureCapabilities = node.capabilities();
+- _lastUsedDeviceNameLength = node.unique_id().length();
++ _captureCapabilities = node->capabilities();
++ _lastUsedDeviceNameLength = node->unique_id().length();
+ _lastUsedDeviceName = static_cast<char*>(
+ realloc(_lastUsedDeviceName, _lastUsedDeviceNameLength + 1));
+ memcpy(_lastUsedDeviceName, deviceUniqueIdUTF8,
+ _lastUsedDeviceNameLength + 1);
+ return _captureCapabilities.size();
+ }
+ return -1;
+ }
+diff --git
a/third_party/libwebrtc/modules/video_capture/linux/pipewire_session.cc
b/third_party/libwebrtc/modules/video_capture/linux/pipewire_session.cc
+--- a/third_party/libwebrtc/modules/video_capture/linux/pipewire_session.cc
++++ b/third_party/libwebrtc/modules/video_capture/linux/pipewire_session.cc
+@@ -47,16 +47,29 @@ VideoType PipeWireRawFormatToVideoType(u
+ return VideoType::kABGR;
+ case SPA_VIDEO_FORMAT_ARGB:
+ return VideoType::kBGRA;
+ default:
+ return VideoType::kUnknown;
+ }
+ }
+
++void PipeWireNode::PipeWireNodeDeleter::operator()(
++ PipeWireNode* node) const noexcept {
++ pw_proxy_destroy(node->proxy_);
++ spa_hook_remove(&node->node_listener_);
++}
++
++// static
++PipeWireNode::PipeWireNodePtr PipeWireNode::Create(PipeWireSession* session,
++ uint32_t id,
++ const spa_dict* props) {
++ return PipeWireNodePtr(new PipeWireNode(session, id, props));
++}
++
+ PipeWireNode::PipeWireNode(PipeWireSession* session,
+ uint32_t id,
+ const spa_dict* props)
+ : session_(session),
+ id_(id),
+ display_name_(spa_dict_lookup(props, PW_KEY_NODE_DESCRIPTION)),
+ unique_id_(rtc::ToString(id)) {
+ RTC_LOG(LS_VERBOSE) << "Found Camera: " << display_name_;
+@@ -68,21 +81,16 @@ PipeWireNode::PipeWireNode(PipeWireSessi
+ .version = PW_VERSION_NODE_EVENTS,
+ .info = OnNodeInfo,
+ .param = OnNodeParam,
+ };
+
+ pw_node_add_listener(proxy_, &node_listener_, &node_events, this);
+ }
+
+-PipeWireNode::~PipeWireNode() {
+- pw_proxy_destroy(proxy_);
+- spa_hook_remove(&node_listener_);
+-}
+-
+ // static
+ void PipeWireNode::OnNodeInfo(void* data, const pw_node_info* info) {
+ PipeWireNode* that = static_cast<PipeWireNode*>(data);
+
+ if (info->change_mask & PW_NODE_CHANGE_MASK_PROPS) {
+ const char* vid_str;
+ const char* pid_str;
+ absl::optional<int> vid;
+@@ -94,17 +102,19 @@ void PipeWireNode::OnNodeInfo(void* data
+ pid = pid_str ? rtc::StringToNumber<int>(pid_str) : absl::nullopt;
+
+ if (vid && pid) {
+ char model_str[10];
+ snprintf(model_str, sizeof(model_str), "%04x:%04x", vid.value(),
+ pid.value());
+ that->model_id_ = model_str;
+ }
+- } else if (info->change_mask & PW_NODE_CHANGE_MASK_PARAMS) {
++ }
++
++ if (info->change_mask & PW_NODE_CHANGE_MASK_PARAMS) {
+ for (uint32_t i = 0; i < info->n_params; i++) {
+ uint32_t id = info->params[i].id;
+ if (id == SPA_PARAM_EnumFormat &&
+ info->params[i].flags & SPA_PARAM_INFO_READ) {
+ pw_node_enum_params(that->proxy_, 0, id, 0, UINT32_MAX, nullptr);
+ break;
+ }
+ }
+@@ -345,58 +355,67 @@ void PipeWireSession::OnCoreError(void*
+
+ // static
+ void PipeWireSession::OnCoreDone(void* data, uint32_t id, int seq) {
+ PipeWireSession* that = static_cast<PipeWireSession*>(data);
+
+ if (id == PW_ID_CORE) {
+ if (seq == that->sync_seq_) {
+ RTC_LOG(LS_VERBOSE) << "Enumerating PipeWire camera devices
complete.";
++
++ // Remove camera devices with no capabilities
++ auto it = std::remove_if(that->nodes_.begin(), that->nodes_.end(),
++ [](const PipeWireNode::PipeWireNodePtr&
node) {
++ return node->capabilities().empty();
++ });
++ that->nodes_.erase(it, that->nodes_.end());
++
+ that->Finish(VideoCaptureOptions::Status::SUCCESS);
+ }
+ }
+ }
+
+ // static
+ void PipeWireSession::OnRegistryGlobal(void* data,
+ uint32_t id,
+ uint32_t permissions,
+ const char* type,
+ uint32_t version,
+ const spa_dict* props) {
+ PipeWireSession* that = static_cast<PipeWireSession*>(data);
+
+ // Skip already added nodes to avoid duplicate camera entries
+ if (std::find_if(that->nodes_.begin(), that->nodes_.end(),
+- [id](const PipeWireNode& node) {
+- return node.id() == id;
++ [id](const PipeWireNode::PipeWireNodePtr& node) {
++ return node->id() == id;
+ }) != that->nodes_.end())
+ return;
+
+ if (type != absl::string_view(PW_TYPE_INTERFACE_Node))
+ return;
+
+ if (!spa_dict_lookup(props, PW_KEY_NODE_DESCRIPTION))
+ return;
+
+ auto node_role = spa_dict_lookup(props, PW_KEY_MEDIA_ROLE);
+ if (!node_role || strcmp(node_role, "Camera"))
+ return;
+
+- that->nodes_.emplace_back(that, id, props);
++ that->nodes_.push_back(PipeWireNode::Create(that, id, props));
+ that->PipeWireSync();
+ }
+
+ // static
+ void PipeWireSession::OnRegistryGlobalRemove(void* data, uint32_t id) {
+ PipeWireSession* that = static_cast<PipeWireSession*>(data);
+
+- auto it = std::remove_if(
+- that->nodes_.begin(), that->nodes_.end(),
+- [id](const PipeWireNode& node) { return node.id() == id; });
++ auto it = std::remove_if(that->nodes_.begin(), that->nodes_.end(),
++ [id](const PipeWireNode::PipeWireNodePtr& node) {
++ return node->id() == id;
++ });
+ that->nodes_.erase(it, that->nodes_.end());
+ }
+
+ void PipeWireSession::Finish(VideoCaptureOptions::Status status) {
+ webrtc::MutexLock lock(&callback_lock_);
+
+ if (callback_) {
+ callback_->OnInitialized(status);
+diff --git
a/third_party/libwebrtc/modules/video_capture/linux/pipewire_session.h
b/third_party/libwebrtc/modules/video_capture/linux/pipewire_session.h
+--- a/third_party/libwebrtc/modules/video_capture/linux/pipewire_session.h
++++ b/third_party/libwebrtc/modules/video_capture/linux/pipewire_session.h
+@@ -32,27 +32,37 @@ namespace videocapturemodule {
+ class PipeWireSession;
+ class VideoCaptureModulePipeWire;
+
+ // PipeWireNode objects are the local representation of PipeWire node
objects.
+ // The portal API ensured that only camera nodes are visible to the client.
+ // So they all represent one camera that is available via PipeWire.
+ class PipeWireNode {
+ public:
+- PipeWireNode(PipeWireSession* session, uint32_t id, const spa_dict*
props);
+- ~PipeWireNode();
++ struct PipeWireNodeDeleter {
++ void operator()(PipeWireNode* node) const noexcept;
++ };
++
++ using PipeWireNodePtr =
++ std::unique_ptr<PipeWireNode, PipeWireNode::PipeWireNodeDeleter>;
++ static PipeWireNodePtr Create(PipeWireSession* session,
++ uint32_t id,
++ const spa_dict* props);
+
+ uint32_t id() const { return id_; }
+ std::string display_name() const { return display_name_; }
+ std::string unique_id() const { return unique_id_; }
+ std::string model_id() const { return model_id_; }
+ std::vector<VideoCaptureCapability> capabilities() const {
+ return capabilities_;
+ }
+
++ protected:
++ PipeWireNode(PipeWireSession* session, uint32_t id, const spa_dict*
props);
++
+ private:
+ static void OnNodeInfo(void* data, const pw_node_info* info);
+ static void OnNodeParam(void* data,
+ int seq,
+ uint32_t id,
+ uint32_t index,
+ uint32_t next,
+ const spa_pod* param);
+@@ -82,18 +92,19 @@ class CameraPortalNotifier : public Came
+
+ class PipeWireSession : public rtc::RefCountedNonVirtual<PipeWireSession> {
+ public:
+ PipeWireSession();
+ ~PipeWireSession();
+
+ void Init(VideoCaptureOptions::Callback* callback,
+ int fd = kInvalidPipeWireFd);
+-
+- const std::deque<PipeWireNode>& nodes() const { return nodes_; }
++ const std::deque<PipeWireNode::PipeWireNodePtr>& nodes() const {
++ return nodes_;
++ }
+
+ friend class CameraPortalNotifier;
+ friend class PipeWireNode;
+ friend class VideoCaptureModulePipeWire;
+
+ private:
+ void InitPipeWire(int fd);
+ bool StartPipeWire(int fd);
+@@ -129,17 +140,17 @@ class PipeWireSession : public rtc::RefC
+ struct pw_core* pw_core_ = nullptr;
+ struct spa_hook core_listener_;
+
+ struct pw_registry* pw_registry_ = nullptr;
+ struct spa_hook registry_listener_;
+
+ int sync_seq_ = 0;
+
+- std::deque<PipeWireNode> nodes_;
++ std::deque<PipeWireNode::PipeWireNodePtr> nodes_;
+ std::unique_ptr<CameraPortal> portal_;
+ std::unique_ptr<CameraPortalNotifier> portal_notifier_;
+ };
+
+ } // namespace videocapturemodule
+ } // namespace webrtc
+
+ #endif // MODULES_VIDEO_CAPTURE_LINUX_PIPEWIRE_SESSION_H_
+diff --git
a/third_party/libwebrtc/moz-patch-stack/b4aba7834e.no-op-cherry-pick-msg
b/third_party/libwebrtc/moz-patch-stack/b4aba7834e.no-op-cherry-pick-msg
+new file mode 100644
+--- /dev/null
++++ b/third_party/libwebrtc/moz-patch-stack/b4aba7834e.no-op-cherry-pick-msg
+@@ -0,0 +1,1 @@
++We cherry-picked this in bug 1913286.
+
diff --git
a/http/firefox/patches/0028-bmo-1902227-backport-ffmpeg-av1-vaapi-fixes-for-mesa-24.0.7plus.patch
b/http/firefox/patches/0028-bmo-1902227-backport-ffmpeg-av1-vaapi-fixes-for-mesa-24.0.7plus.patch
deleted file mode 100644
index 43107eb..0000000
---
a/http/firefox/patches/0028-bmo-1902227-backport-ffmpeg-av1-vaapi-fixes-for-mesa-24.0.7plus.patch
+++ /dev/null
@@ -1,250 +0,0 @@
-
-# HG changeset patch
-# User stransky <stransky AT redhat.com>
-# Date 1721296887 0
-# Node ID a782319319be064da7dce5e0964a2954a2fef8ff
-# Parent 046f0f522ce779aa3c9e170f248780cf312103a6
-Bug 1902227 [Linux/VA-API] Backport AV1/VA-API playback fix for AMD/mesa >
24.0.7 r=padenot
-
-Backport of https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29400
-Allows to use multiple slices for AV1 VA-API decode.
-
-Differential Revision: https://phabricator.services.mozilla.com/D216919
-
-diff --git a/media/ffvpx/libavcodec/vaapi_av1.c
b/media/ffvpx/libavcodec/vaapi_av1.c
---- a/media/ffvpx/libavcodec/vaapi_av1.c
-+++ b/media/ffvpx/libavcodec/vaapi_av1.c
-@@ -14,16 +14,17 @@
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
- */
-
- #include "libavutil/frame.h"
-+#include "libavutil/mem.h"
- #include "hwaccel_internal.h"
- #include "vaapi_decode.h"
- #include "internal.h"
- #include "av1dec.h"
- #include "thread.h"
-
- typedef struct VAAPIAV1FrameRef {
- AVFrame *frame;
-@@ -37,16 +38,19 @@ typedef struct VAAPIAV1DecContext {
- * For film grain case, VAAPI generate 2 output for each frame,
- * current_frame will not apply film grain, and will be used for
- * references for next frames. Maintain the reference list without
- * applying film grain here. And current_display_picture will be
- * used to apply film grain and push to downstream.
- */
- VAAPIAV1FrameRef ref_tab[AV1_NUM_REF_FRAMES];
- AVFrame *tmp_frame;
-+
-+ int nb_slice_params;
-+ VASliceParameterBufferAV1 *slice_params;
- } VAAPIAV1DecContext;
-
- static VASurfaceID vaapi_av1_surface_id(AV1Frame *vf)
- {
- if (vf)
- return ff_vaapi_get_surface_id(vf->f);
- else
- return VA_INVALID_SURFACE;
-@@ -92,16 +96,18 @@ static int vaapi_av1_decode_uninit(AVCod
- {
- VAAPIAV1DecContext *ctx = avctx->internal->hwaccel_priv_data;
-
- av_frame_free(&ctx->tmp_frame);
-
- for (int i = 0; i < FF_ARRAY_ELEMS(ctx->ref_tab); i++)
- av_frame_free(&ctx->ref_tab[i].frame);
-
-+ av_freep(&ctx->slice_params);
-+
- return ff_vaapi_decode_uninit(avctx);
- }
-
-
- static int vaapi_av1_start_frame(AVCodecContext *avctx,
- av_unused const uint8_t *buffer,
- av_unused uint32_t size)
- {
-@@ -388,43 +394,56 @@ static int vaapi_av1_end_frame(AVCodecCo
- }
-
- static int vaapi_av1_decode_slice(AVCodecContext *avctx,
- const uint8_t *buffer,
- uint32_t size)
- {
- const AV1DecContext *s = avctx->priv_data;
- VAAPIDecodePicture *pic = s->cur_frame.hwaccel_picture_private;
-- VASliceParameterBufferAV1 slice_param;
-- int err = 0;
-+ VAAPIAV1DecContext *ctx = avctx->internal->hwaccel_priv_data;
-+ int err, nb_params;
-+
-+ nb_params = s->tg_end - s->tg_start + 1;
-+ if (ctx->nb_slice_params < nb_params) {
-+ ctx->slice_params = av_realloc_array(ctx->slice_params,
-+ nb_params,
-+ sizeof(*ctx->slice_params));
-+ if (!ctx->slice_params) {
-+ ctx->nb_slice_params = 0;
-+ err = AVERROR(ENOMEM);
-+ goto fail;
-+ }
-+ ctx->nb_slice_params = nb_params;
-+ }
-
- for (int i = s->tg_start; i <= s->tg_end; i++) {
-- memset(&slice_param, 0, sizeof(VASliceParameterBufferAV1));
--
-- slice_param = (VASliceParameterBufferAV1) {
-+ ctx->slice_params[i - s->tg_start] = (VASliceParameterBufferAV1) {
- .slice_data_size = s->tile_group_info[i].tile_size,
- .slice_data_offset = s->tile_group_info[i].tile_offset,
- .slice_data_flag = VA_SLICE_DATA_FLAG_ALL,
- .tile_row = s->tile_group_info[i].tile_row,
- .tile_column = s->tile_group_info[i].tile_column,
- .tg_start = s->tg_start,
- .tg_end = s->tg_end,
- };
--
-- err = ff_vaapi_decode_make_slice_buffer(avctx, pic, &slice_param,
--
sizeof(VASliceParameterBufferAV1),
-- buffer,
-- size);
-- if (err) {
-- ff_vaapi_decode_cancel(avctx, pic);
-- return err;
-- }
- }
-
-+ err = ff_vaapi_decode_make_slice_buffer(avctx, pic, ctx->slice_params,
nb_params,
-+
sizeof(VASliceParameterBufferAV1),
-+ buffer,
-+ size);
-+ if (err)
-+ goto fail;
-+
- return 0;
-+
-+fail:
-+ ff_vaapi_decode_cancel(avctx, pic);
-+ return err;
- }
-
- const FFHWAccel ff_av1_vaapi_hwaccel = {
- .p.name = "av1_vaapi",
- .p.type = AVMEDIA_TYPE_VIDEO,
- .p.id = AV_CODEC_ID_AV1,
- .p.pix_fmt = AV_PIX_FMT_VAAPI,
- .start_frame = vaapi_av1_start_frame,
-diff --git a/media/ffvpx/libavcodec/vaapi_decode.c
b/media/ffvpx/libavcodec/vaapi_decode.c
---- a/media/ffvpx/libavcodec/vaapi_decode.c
-+++ b/media/ffvpx/libavcodec/vaapi_decode.c
-@@ -58,16 +58,17 @@ int ff_vaapi_decode_make_param_buffer(AV
- "is %#x.\n", type, size, buffer);
- return 0;
- }
-
-
- int ff_vaapi_decode_make_slice_buffer(AVCodecContext *avctx,
- VAAPIDecodePicture *pic,
- const void *params_data,
-+ int nb_params,
- size_t params_size,
- const void *slice_data,
- size_t slice_size)
- {
- VAAPIDecodeContext *ctx = avctx->internal->hwaccel_priv_data;
- VAStatus vas;
- int index;
-
-@@ -83,17 +84,17 @@ int ff_vaapi_decode_make_slice_buffer(AV
- pic->slices_allocated = pic->slices_allocated ?
pic->slices_allocated * 2 : 64;
- }
- av_assert0(pic->nb_slices + 1 <= pic->slices_allocated);
-
- index = 2 * pic->nb_slices;
-
- vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context,
- VASliceParameterBufferType,
-- params_size, 1, (void*)params_data,
-+ params_size, nb_params, (void*)params_data,
- &pic->slice_buffers[index]);
- if (vas != VA_STATUS_SUCCESS) {
- av_log(avctx, AV_LOG_ERROR, "Failed to create slice "
- "parameter buffer: %d (%s).\n", vas, vaErrorStr(vas));
- return AVERROR(EIO);
- }
-
- av_log(avctx, AV_LOG_DEBUG, "Slice %d param buffer (%zu bytes) "
-diff --git a/media/ffvpx/libavcodec/vaapi_decode.h
b/media/ffvpx/libavcodec/vaapi_decode.h
---- a/media/ffvpx/libavcodec/vaapi_decode.h
-+++ b/media/ffvpx/libavcodec/vaapi_decode.h
-@@ -68,16 +68,17 @@ int ff_vaapi_decode_make_param_buffer(AV
- VAAPIDecodePicture *pic,
- int type,
- const void *data,
- size_t size);
-
- int ff_vaapi_decode_make_slice_buffer(AVCodecContext *avctx,
- VAAPIDecodePicture *pic,
- const void *params_data,
-+ int nb_params,
- size_t params_size,
- const void *slice_data,
- size_t slice_size);
-
- int ff_vaapi_decode_issue(AVCodecContext *avctx,
- VAAPIDecodePicture *pic);
- int ff_vaapi_decode_cancel(AVCodecContext *avctx,
- VAAPIDecodePicture *pic);
-diff --git a/media/ffvpx/libavcodec/vaapi_vp8.c
b/media/ffvpx/libavcodec/vaapi_vp8.c
---- a/media/ffvpx/libavcodec/vaapi_vp8.c
-+++ b/media/ffvpx/libavcodec/vaapi_vp8.c
-@@ -204,17 +204,17 @@ static int vaapi_vp8_decode_slice(AVCode
- s->coder_state_at_header_end.bit_count - 8),
- .num_of_partitions = s->num_coeff_partitions + 1,
- };
-
- sp.partition_size[0] = s->header_partition_size -
((sp.macroblock_offset + 7) / 8);
- for (i = 0; i < 8; i++)
- sp.partition_size[i+1] = s->coeff_partition_size[i];
-
-- err = ff_vaapi_decode_make_slice_buffer(avctx, pic, &sp, sizeof(sp),
data, data_size);
-+ err = ff_vaapi_decode_make_slice_buffer(avctx, pic, &sp, 1, sizeof(sp),
data, data_size);
- if (err)
- goto fail;
-
- return 0;
-
- fail:
- ff_vaapi_decode_cancel(avctx, pic);
- return err;
-diff --git a/media/ffvpx/libavcodec/vaapi_vp9.c
b/media/ffvpx/libavcodec/vaapi_vp9.c
---- a/media/ffvpx/libavcodec/vaapi_vp9.c
-+++ b/media/ffvpx/libavcodec/vaapi_vp9.c
-@@ -153,17 +153,17 @@ static int vaapi_vp9_decode_slice(AVCode
- .chroma_dc_quant_scale =
h->h.segmentation.feat[i].qmul[1][0],
- .chroma_ac_quant_scale =
h->h.segmentation.feat[i].qmul[1][1],
- };
-
- memcpy(slice_param.seg_param[i].filter_level,
h->h.segmentation.feat[i].lflvl,
sizeof(slice_param.seg_param[i].filter_level));
- }
-
- err = ff_vaapi_decode_make_slice_buffer(avctx, pic,
-- &slice_param,
sizeof(slice_param),
-+ &slice_param, 1,
sizeof(slice_param),
- buffer, size);
- if (err) {
- ff_vaapi_decode_cancel(avctx, pic);
- return err;
- }
-
- return 0;
- }
-
diff --git
a/http/firefox/patches/0029-bmo-1912663-cbindgen-0.27.0-fixes.patch
b/http/firefox/patches/0029-bmo-1912663-cbindgen-0.27.0-fixes.patch
deleted file mode 100644
index 3904ac7..0000000
--- a/http/firefox/patches/0029-bmo-1912663-cbindgen-0.27.0-fixes.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-diff --git a/servo/components/style_traits/values.rs
b/servo/components/style_traits/values.rs
---- a/servo/components/style_traits/values.rs
-+++ b/servo/components/style_traits/values.rs
-@@ -387,15 +387,15 @@
- mut parse_one: F,
- ) -> Result<Vec<T>, ParseError<'i, E>>
- where
- F: for<'tt> FnMut(&mut Parser<'i, 'tt>) -> Result<T, ParseError<'i,
E>>,
- {
-- input.skip_whitespace(); // Unnecessary for correctness, but may
help try() rewind less.
-+ input.skip_whitespace(); // Unnecessary for correctness, but may
help try_parse() rewind less.
- let mut results = vec![parse_one(input)?];
- loop {
-- input.skip_whitespace(); // Unnecessary for correctness, but
may help try() rewind less.
-- if let Ok(item) = input.try(&mut parse_one) {
-+ input.skip_whitespace(); // Unnecessary for correctness, but
may help try_parse() rewind less.
-+ if let Ok(item) = input.try_parse(&mut parse_one) {
- results.push(item);
- } else {
- return Ok(results);
- }
- }
-@@ -412,18 +412,18 @@
- mut parse_one: F,
- ) -> Result<Vec<T>, ParseError<'i, E>>
- where
- F: for<'tt> FnMut(&mut Parser<'i, 'tt>) -> Result<T, ParseError<'i,
E>>,
- {
-- input.skip_whitespace(); // Unnecessary for correctness, but may
help try() rewind less.
-+ input.skip_whitespace(); // Unnecessary for correctness, but may
help try_parse() rewind less.
- let mut results = vec![parse_one(input)?];
- loop {
-- input.skip_whitespace(); // Unnecessary for correctness, but
may help try() rewind less.
-+ input.skip_whitespace(); // Unnecessary for correctness, but
may help try_parse() rewind less.
- let comma_location = input.current_source_location();
-- let comma = input.try(|i| i.expect_comma()).is_ok();
-- input.skip_whitespace(); // Unnecessary for correctness, but
may help try() rewind less.
-- if let Ok(item) = input.try(&mut parse_one) {
-+ let comma = input.try_parse(|i| i.expect_comma()).is_ok();
-+ input.skip_whitespace(); // Unnecessary for correctness, but
may help try_parse() rewind less.
-+ if let Ok(item) = input.try_parse(&mut parse_one) {
- results.push(item);
- } else if comma {
- return
Err(comma_location.new_unexpected_token_error(Token::Comma));
- } else {
- break;
-diff --git a/servo/ports/geckolib/cbindgen.toml
b/servo/ports/geckolib/cbindgen.toml
---- a/servo/ports/geckolib/cbindgen.toml
-+++ b/servo/ports/geckolib/cbindgen.toml
-@@ -360,11 +360,10 @@
- "gfxFontVariation" = "gfxFontVariation"
- "URLExtraData" = "URLExtraData"
- "Keyframe" = "Keyframe"
- "nsChangeHint" = "nsChangeHint"
- "ServoElementSnapshotTable" = "ServoElementSnapshotTable"
--"Keyframe" = "Keyframe"
- "ComputedKeyframeValues" = "ComputedKeyframeValues"
- "OriginFlags" = "OriginFlags"
- "ServoTraversalFlags" = "ServoTraversalFlags"
- "ServoStyleSetSizes" = "ServoStyleSetSizes"
- "BeforeFlag" = "StyleEasingBeforeFlag"
-
diff --git a/http/firefox/patches/0030-bgo-929967-fix-pgo-on-musl.patch
b/http/firefox/patches/0030-bgo-929967-fix-pgo-on-musl.patch
deleted file mode 100644
index 3c8457e..0000000
--- a/http/firefox/patches/0030-bgo-929967-fix-pgo-on-musl.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff --git a/build/pgo/profileserver.py b/build/pgo/profileserver.py
-index 7354714..0385792 100755
---- a/build/pgo/profileserver.py
-+++ b/build/pgo/profileserver.py
-@@ -171,6 +171,9 @@ if __name__ == "__main__":
- env["UPLOAD_PATH"], "profile-run-1.log"
- )
-
-+ # Workaround for https://bugs.gentoo.org/929967
-+ env["LD_LIBRARY_PATH"] = os.path.join(os.getcwd(), "dist", "bin")
-+
- # Run Firefox a first time to initialize its profile
- runner = FirefoxRunner(
- profile=profile,
[[SM-Commit] ] GIT changes to master grimoire by Pavel Vinogradov (384eafbcb5e0dd73e801af78358351127e6840e0),
Pavel Vinogradov, 09/04/2024