FF 117.0.1 firefox117
authorWolfgang Rosenauer <wr@rosenauer.org>
Sat, 23 Sep 2023 09:32:28 +0200
branchfirefox117
changeset 1193 16de98d33e97
parent 1192 7612b8d8c46f
child 1194 d1b75dcb25fc
FF 117.0.1
MozillaFirefox/MozillaFirefox.changes
MozillaFirefox/MozillaFirefox.spec
MozillaFirefox/mozilla-bmo1775202.patch
MozillaFirefox/mozilla-bmo1822730.patch
MozillaFirefox/mozilla-fix-top-level-asm.patch
MozillaFirefox/tar_stamps
mozilla-bmo1775202.patch
mozilla-bmo1822730.patch
mozilla-fix-top-level-asm.patch
mozilla-rust-disable-future-incompat.patch
mozilla-silence-no-return-type.patch
series
--- a/MozillaFirefox/MozillaFirefox.changes	Sun Aug 27 10:23:20 2023 +0200
+++ b/MozillaFirefox/MozillaFirefox.changes	Sat Sep 23 09:32:28 2023 +0200
@@ -1,4 +1,70 @@
 -------------------------------------------------------------------
+Sat Sep 23 07:29:25 UTC 2023 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- add mozilla-bmo1822730.patch
+
+-------------------------------------------------------------------
+Tue Sep 12 17:04:01 UTC 2023 - Andreas Stieger <andreas.stieger@gmx.de>
+
+- Mozilla Firefox 117.0.1
+  * Fix a bug causing extensions using an event page for long-
+    running tasks to be terminated while running, causing
+    unexpected behavior changes (bmo#1851373)
+  * Temporarily revert an intentional behavior change preventing
+    Javascript from changing URL.protocol (bmo#1850954).
+  * Fix audio worklets not working for sites using WebAssembly
+    exception handling (bmo#1851468)
+  * Fix the Reopen all tabs option in the Recently closed tabs
+    menu sometimes failing to open all tabs (bmo#1850856)
+  * Fix the bookmarks menu sometimes remaining partially visible
+    when minimizing Firefox (bmo#1843700)
+  * Fix an issue causing incorrect time zones to be detected on
+    some sites (bmo#1848615)
+  * MFSA 2023-40 CVE-2023-4863 (boo#1215231)
+    Heap buffer overflow in WebP
+
+-------------------------------------------------------------------
+Sun Aug 27 08:51:28 UTC 2023 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Mozilla Firefox 117.0
+  https://www.mozilla.org/en-US/firefox/117.0/releasenotes
+  MFSA 2023-34 (bsc#1214606)
+  * CVE-2023-4573 (bmo#1846687)
+    Memory corruption in IPC CanvasTranslator
+  * CVE-2023-4574 (bmo#1846688)
+    Memory corruption in IPC ColorPickerShownCallback
+  * CVE-2023-4575 (bmo#1846689)
+    Memory corruption in IPC FilePickerShownCallback
+  * CVE-2023-4576 (bmo#1846694)
+    Integer Overflow in RecordedSourceSurfaceCreation
+  * CVE-2023-4577 (bmo#1847397)
+    Memory corruption in JIT UpdateRegExpStatics
+  * CVE-2023-4578 (bmo#1839007)
+    Error reporting methods in SpiderMonkey could have triggered
+    an Out of Memory Exception
+  * CVE-2023-4579 (bmo#1842766)
+    Persisted search terms were formatted as URLs
+  * CVE-2023-4580 (bmo#1843046)
+    Push notifications saved to disk unencrypted
+  * CVE-2023-4581 (bmo#1843758)
+    XLL file extensions were downloadable without warnings
+  * CVE-2023-4582 (bmo#1773874)
+    Buffer Overflow in WebGL glGetProgramiv
+  * CVE-2023-4583 (bmo#1842030)
+    Browsing Context potentially not cleared when closing Private
+    Window
+  * CVE-2023-4584 (bmo#1843968, bmo#1845205, bmo#1846080,
+    bmo#1846526, bmo#1847529)
+    Memory safety bugs fixed in Firefox 117, Firefox ESR 102.15,
+    Firefox ESR 115.2, Thunderbird 102.15, and Thunderbird 115.2
+  * CVE-2023-4585 (bmo#1751583, bmo#1841082, bmo#1847904, bmo#1848999)
+    Memory safety bugs fixed in Firefox 117, Firefox ESR 115.2,
+    and Thunderbird 115.2
+- requires
+  NSS = 3.92
+  rustc = 1.71
+
+-------------------------------------------------------------------
 Thu Aug 17 18:20:18 UTC 2023 - Andreas Stieger <andreas.stieger@gmx.de>
 
 - Mozilla Firefox 116.0.3
--- a/MozillaFirefox/MozillaFirefox.spec	Sun Aug 27 10:23:20 2023 +0200
+++ b/MozillaFirefox/MozillaFirefox.spec	Sat Sep 23 09:32:28 2023 +0200
@@ -28,9 +28,9 @@
 # orig_suffix b3
 # major 69
 # mainver %%major.99
-%define major          116
-%define mainver        %major.0.3
-%define orig_version   116.0.3
+%define major          117
+%define mainver        %major.0.1
+%define orig_version   117.0.1
 %define orig_suffix    %{nil}
 %define update_channel release
 %define branding       1
@@ -103,8 +103,8 @@
 %else
 BuildRequires:  gcc-c++
 %endif
-BuildRequires:  cargo1.69
-BuildRequires:  rust1.69
+BuildRequires:  cargo1.71
+BuildRequires:  rust1.71
 %if 0%{useccache} != 0
 BuildRequires:  ccache
 %endif
@@ -114,7 +114,7 @@
 BuildRequires:  libproxy-devel
 BuildRequires:  makeinfo
 BuildRequires:  mozilla-nspr-devel >= 4.35
-BuildRequires:  mozilla-nss-devel >= 3.91
+BuildRequires:  mozilla-nss-devel >= 3.92
 BuildRequires:  nasm >= 2.14
 BuildRequires:  nodejs >= 12.22.12
 %if 0%{?sle_version} >= 120000 && 0%{?sle_version} < 150000
@@ -228,6 +228,7 @@
 Patch21:        svg-rendering.patch
 Patch22:        mozilla-partial-revert-1768632.patch
 Patch23:        mozilla-rust-disable-future-incompat.patch
+Patch24:        mozilla-bmo1822730.patch
 # Firefox/browser
 Patch101:       firefox-kde.patch
 Patch102:       firefox-branded-icons.patch
--- a/MozillaFirefox/mozilla-bmo1775202.patch	Sun Aug 27 10:23:20 2023 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-bmo1775202.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/mozilla-bmo1822730.patch	Sat Sep 23 09:32:28 2023 +0200
@@ -0,0 +1,1 @@
+../mozilla-bmo1822730.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-fix-top-level-asm.patch	Sun Aug 27 10:23:20 2023 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-fix-top-level-asm.patch
\ No newline at end of file
--- a/MozillaFirefox/tar_stamps	Sun Aug 27 10:23:20 2023 +0200
+++ b/MozillaFirefox/tar_stamps	Sat Sep 23 09:32:28 2023 +0200
@@ -1,10 +1,10 @@
 PRODUCT="firefox"
 CHANNEL="release"
-VERSION="116.0.3"
+VERSION="117.0.1"
 VERSION_SUFFIX=""
-PREV_VERSION="116.0.2"
+PREV_VERSION="117.0"
 PREV_VERSION_SUFFIX=""
 #SKIP_LOCALES="" # Uncomment to skip l10n and compare-locales-generation
 RELEASE_REPO="https://hg.mozilla.org/releases/mozilla-release"
-RELEASE_TAG="183063cc6efa429f4f184aff169e1f9dad68cbfc"
-RELEASE_TIMESTAMP="20230815173142"
+RELEASE_TAG="e245ca2125a6eb1e2d08cc9e5824f15e1e67a566"
+RELEASE_TIMESTAMP="20230912013654"
--- a/mozilla-bmo1775202.patch	Sun Aug 27 10:23:20 2023 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-From: Mike Hommey <mh@glandium.org>
-Date: Sun, 14 Aug 2022 07:01:33 +0900
-Subject: Work around bz#1775202 to fix FTBFS on ppc64el
-
----
- third_party/libwebrtc/moz.build | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/third_party/libwebrtc/modules/video_capture/video_capture_internal_impl_gn/moz.build b/third_party/libwebrtc/modules/video_capture/video_capture_internal_impl_gn/moz.build
---- a/third_party/libwebrtc/modules/video_capture/video_capture_internal_impl_gn/moz.build
-+++ b/third_party/libwebrtc/modules/video_capture/video_capture_internal_impl_gn/moz.build
-@@ -318,9 +318,32 @@ if CONFIG["CPU_ARCH"] == "x86_64" and CO
- 
-     UNIFIED_SOURCES += [
-         "/third_party/libwebrtc/modules/video_capture/linux/camera_portal.cc",
-         "/third_party/libwebrtc/modules/video_capture/linux/device_info_pipewire.cc",
-         "/third_party/libwebrtc/modules/video_capture/linux/pipewire_session.cc",
-         "/third_party/libwebrtc/modules/video_capture/linux/video_capture_pipewire.cc"
-     ]
- 
-+if CONFIG["CPU_ARCH"] == "ppc64" and CONFIG["OS_TARGET"] == "Linux":
-+
-+    DEFINES["WEBRTC_ENABLE_AVX2"] = True
-+    DEFINES["WEBRTC_USE_PIPEWIRE"] = True
-+    DEFINES["_GNU_SOURCE"] = True
-+
-+    LOCAL_INCLUDES += [
-+        "/gfx/angle/checkout/include/",
-+        "/third_party/drm/drm/",
-+        "/third_party/drm/drm/include/",
-+        "/third_party/drm/drm/include/libdrm/",
-+        "/third_party/gbm/gbm/",
-+        "/third_party/libepoxy/libepoxy/include/",
-+        "/third_party/pipewire/"
-+    ]
-+
-+    UNIFIED_SOURCES += [
-+        "/third_party/libwebrtc/modules/video_capture/linux/camera_portal.cc",
-+        "/third_party/libwebrtc/modules/video_capture/linux/device_info_pipewire.cc",
-+        "/third_party/libwebrtc/modules/video_capture/linux/pipewire_session.cc",
-+        "/third_party/libwebrtc/modules/video_capture/linux/video_capture_pipewire.cc"
-+    ]
-+
- Library("video_capture_internal_impl_gn")
-diff --git a/third_party/libwebrtc/moz.build b/third_party/libwebrtc/moz.build
---- a/third_party/libwebrtc/moz.build
-+++ b/third_party/libwebrtc/moz.build
-@@ -603,16 +603,28 @@ if CONFIG["CPU_ARCH"] == "x86_64" and CO
-         "/third_party/libwebrtc/modules/desktop_capture/primitives_gn",
-         "/third_party/libwebrtc/modules/portal/portal_gn",
-         "/third_party/libwebrtc/third_party/drm/drm_gn",
-         "/third_party/libwebrtc/third_party/gbm/gbm_gn",
-         "/third_party/libwebrtc/third_party/libepoxy/libepoxy_gn",
-         "/third_party/libwebrtc/third_party/pipewire/pipewire_gn"
-     ]
- 
-+if CONFIG["CPU_ARCH"] == "ppc64" and CONFIG["OS_TARGET"] == "Linux":
-+
-+    DIRS += [
-+        "/third_party/libwebrtc/modules/desktop_capture/desktop_capture_gn",
-+        "/third_party/libwebrtc/modules/desktop_capture/primitives_gn",
-+        "/third_party/libwebrtc/modules/portal/portal_gn",
-+        "/third_party/libwebrtc/third_party/drm/drm_gn",
-+        "/third_party/libwebrtc/third_party/gbm/gbm_gn",
-+        "/third_party/libwebrtc/third_party/libepoxy/libepoxy_gn",
-+        "/third_party/libwebrtc/third_party/pipewire/pipewire_gn"
-+    ]
-+
- if CONFIG["CPU_ARCH"] == "aarch64" and CONFIG["OS_TARGET"] == "OpenBSD":
- 
-     DIRS += [
-         "/third_party/libwebrtc/common_audio/common_audio_neon_c_gn",
-         "/third_party/libwebrtc/common_audio/common_audio_neon_gn"
-     ]
- 
- if CONFIG["CPU_ARCH"] == "x86_64" and CONFIG["OS_TARGET"] == "OpenBSD":
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mozilla-bmo1822730.patch	Sat Sep 23 09:32:28 2023 +0200
@@ -0,0 +1,52 @@
+# HG changeset patch
+# User Rob Krum <biggestsonicfan@gmail.com>
+# Date 1695432215 25200
+#      Fri Sep 22 18:23:35 2023 -0700
+# Node ID e6a8a9f0956d124e8de34eb4bcf09d8e17077d9d
+# Parent  677cbf2e64cdcd3a93e644f781be2bdc2529ba1a
+Bug 1822730 - Add basic blob protocol handling for blob URIs that contain parsable http/s protocols
+
+diff --git a/toolkit/mozapps/downloads/DownloadLastDir.sys.mjs b/toolkit/mozapps/downloads/DownloadLastDir.sys.mjs
+--- a/toolkit/mozapps/downloads/DownloadLastDir.sys.mjs
++++ b/toolkit/mozapps/downloads/DownloadLastDir.sys.mjs
+@@ -221,11 +221,13 @@ export class DownloadLastDir {
+ 
+   /**
+    * Pre-processor to extract a domain name to be used with the content-prefs
+-   * service. This specially handles data and file URIs so that the download
+-   * dirs are recalled in a more consistent way:
++   * service. This specially handles data, file and blob URIs so that the
++   * download dirs are recalled in a more consistent way:
+    *  - all file:/// URIs share the same folder
+    *  - data: URIs share a folder per mime-type. If a mime-type is not
+    *    specified text/plain is assumed.
++   *  - blob: blob URIs are tested for http/https and the blob protocol
++   *    is stripped.
+    * In any other case the original URL is returned as a string and ContentPrefs
+    * will do its usual parsing.
+    *
+@@ -234,6 +236,9 @@ export class DownloadLastDir {
+    */
+   #cpsGroupFromURL(url) {
+     if (typeof url == "string") {
++      if (url.startsWith("blob:http://") || url.startsWith("blob:https://")) {
++        url = url.replace("blob:", "");
++      }
+       url = new URL(url);
+     } else if (url instanceof Ci.nsIURI) {
+       url = URL.fromURI(url);
+@@ -241,6 +246,14 @@ export class DownloadLastDir {
+     if (!URL.isInstance(url)) {
+       return url;
+     }
++    if (url.protocol == "blob:") {
++      if (
++        url.href.startsWith("blob:http://") ||
++        url.href.startsWith("blob:https://")
++      ) {
++        return url.href.replace("blob:", "");
++      }
++    }
+     if (url.protocol == "data:") {
+       return url.href.match(/^data:[^;,]*/i)[0].replace(/:$/, ":text/plain");
+     }
--- a/mozilla-fix-top-level-asm.patch	Sun Aug 27 10:23:20 2023 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-From 91bb79836ee274855393bdf6ab10e24899b1b349 Mon Sep 17 00:00:00 2001
-From: Martin Liska <mliska@suse.cz>
-Date: Fri, 17 May 2019 14:41:35 +0200
-Subject: [PATCH] Fix top-level asm issue.
-
----
- security/sandbox/linux/moz.build | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/security/sandbox/linux/moz.build b/security/sandbox/linux/moz.build
---- a/security/sandbox/linux/moz.build
-+++ b/security/sandbox/linux/moz.build
-@@ -64,17 +64,16 @@ UNIFIED_SOURCES += [
-     "../chromium/base/time/time.cc",
-     "../chromium/base/time/time_exploded_posix.cc",
-     "../chromium/base/time/time_now_posix.cc",
-     "../chromium/sandbox/linux/bpf_dsl/bpf_dsl.cc",
-     "../chromium/sandbox/linux/bpf_dsl/codegen.cc",
-     "../chromium/sandbox/linux/bpf_dsl/dump_bpf.cc",
-     "../chromium/sandbox/linux/bpf_dsl/policy.cc",
-     "../chromium/sandbox/linux/bpf_dsl/policy_compiler.cc",
--    "../chromium/sandbox/linux/bpf_dsl/syscall_set.cc",
-     "../chromium/sandbox/linux/seccomp-bpf/die.cc",
-     "../chromium/sandbox/linux/seccomp-bpf/syscall.cc",
-     "/ipc/glue/UtilityProcessSandboxing.cpp",
-     "broker/SandboxBrokerCommon.cpp",
-     "Sandbox.cpp",
-     "SandboxBrokerClient.cpp",
-     "SandboxFilter.cpp",
-     "SandboxFilterUtil.cpp",
-@@ -83,16 +82,17 @@ UNIFIED_SOURCES += [
-     "SandboxLogging.cpp",
-     "SandboxOpenedFiles.cpp",
-     "SandboxReporterClient.cpp",
- ]
- 
- SOURCES += [
-     "../chromium/base/strings/safe_sprintf.cc",
-     "../chromium/base/third_party/icu/icu_utf.cc",
-+    "../chromium/sandbox/linux/bpf_dsl/syscall_set.cc",
-     "../chromium/sandbox/linux/seccomp-bpf/trap.cc",
-     "../chromium/sandbox/linux/services/syscall_wrappers.cc",
- ]
- 
- # This copy of SafeSPrintf doesn't need to avoid the Chromium logging
- # dependency like the one in libxul does, but this way the behavior is
- # consistent.  See also the comment in SandboxLogging.h.
- SOURCES["../chromium/base/strings/safe_sprintf.cc"].flags += ["-DNDEBUG"]
-@@ -106,16 +106,19 @@ if CONFIG["CC_TYPE"] in ("clang", "gcc")
-         "-Wno-unreachable-code-return"
-     ]
- 
- if CONFIG["CC_TYPE"] in ("clang", "gcc"):
-     CXXFLAGS += ["-Wno-error=stack-protector"]
-     SOURCES["../chromium/sandbox/linux/services/syscall_wrappers.cc"].flags += [
-         "-Wno-empty-body",
-     ]
-+    SOURCES['../chromium/sandbox/linux/seccomp-bpf/syscall.cc'].flags += [
-+        '-fno-lto'
-+    ]
- 
- # gcc lto likes to put the top level asm in syscall.cc in a different partition
- # from the function using it which breaks the build.  Work around that by
- # forcing there to be only one partition.
- for f in CONFIG["OS_CXXFLAGS"]:
-     if f.startswith("-flto") and CONFIG["CC_TYPE"] != "clang":
-         LDFLAGS += ["--param lto-partitions=1"]
- 
--- a/mozilla-rust-disable-future-incompat.patch	Sun Aug 27 10:23:20 2023 +0200
+++ b/mozilla-rust-disable-future-incompat.patch	Sat Sep 23 09:32:28 2023 +0200
@@ -1,9 +1,17 @@
-diff -rup a/Cargo.toml b/Cargo.toml
---- a/Cargo.toml	2023-07-04 15:15:01.089470619 +0200
-+++ b/Cargo.toml	2023-07-04 15:24:31.626226962 +0200
-@@ -188,3 +188,8 @@ uniffi_bindgen = "=0.23.0"
- uniffi_build = "=0.23.0"
- uniffi_macros = "=0.23.0"
+# HG changeset patch
+# Parent  b62ddf6a31854e9e3c22a81056d233a50b4dd5c4
+
+diff --git a/Cargo.toml b/Cargo.toml
+--- a/Cargo.toml
++++ b/Cargo.toml
+@@ -206,8 +206,13 @@ webext-storage = { git = "https://github
+ path = "third_party/rust/mio-0.6.23"
+ 
+ [patch."https://github.com/mozilla/uniffi-rs.git"]
+ uniffi = "=0.24.3"
+ uniffi_bindgen = "=0.24.3"
+ uniffi_build = "=0.24.3"
+ uniffi_macros = "=0.24.3"
  weedle2 = "=4.0.0"
 +
 +# Package code v0.1.4 uses code "that will be rejected by a future version of Rust"
--- a/mozilla-silence-no-return-type.patch	Sun Aug 27 10:23:20 2023 +0200
+++ b/mozilla-silence-no-return-type.patch	Sat Sep 23 09:32:28 2023 +0200
@@ -1,11 +1,15 @@
 # HG changeset patch
-# Parent  5df550d4b5fc674268055e504f60392389eb9ea7
+# Parent  505c5ac5cad0268fe81c67d39f70cbab3bff616a
 
-Index: firefox-115.0/gfx/skia/skia/include/codec/SkEncodedOrigin.h
-===================================================================
---- firefox-115.0.orig/gfx/skia/skia/include/codec/SkEncodedOrigin.h
-+++ firefox-115.0/gfx/skia/skia/include/codec/SkEncodedOrigin.h
-@@ -41,6 +41,7 @@ static inline SkMatrix SkEncodedOriginTo
+diff --git a/gfx/skia/skia/include/codec/SkEncodedOrigin.h b/gfx/skia/skia/include/codec/SkEncodedOrigin.h
+--- a/gfx/skia/skia/include/codec/SkEncodedOrigin.h
++++ b/gfx/skia/skia/include/codec/SkEncodedOrigin.h
+@@ -36,16 +36,17 @@ static inline SkMatrix SkEncodedOriginTo
+         case kBottomRight_SkEncodedOrigin: return SkMatrix::MakeAll(-1,  0, w,  0, -1, h, 0, 0, 1);
+         case  kBottomLeft_SkEncodedOrigin: return SkMatrix::MakeAll( 1,  0, 0,  0, -1, h, 0, 0, 1);
+         case     kLeftTop_SkEncodedOrigin: return SkMatrix::MakeAll( 0,  1, 0,  1,  0, 0, 0, 0, 1);
+         case    kRightTop_SkEncodedOrigin: return SkMatrix::MakeAll( 0, -1, w,  1,  0, 0, 0, 0, 1);
+         case kRightBottom_SkEncodedOrigin: return SkMatrix::MakeAll( 0, -1, w, -1,  0, h, 0, 0, 1);
          case  kLeftBottom_SkEncodedOrigin: return SkMatrix::MakeAll( 0,  1, 0, -1,  0, h, 0, 0, 1);
      }
      SK_ABORT("Unexpected origin");
@@ -13,11 +17,20 @@
  }
  
  /**
-Index: firefox-115.0/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h
-===================================================================
---- firefox-115.0.orig/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h
-+++ firefox-115.0/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h
-@@ -325,6 +325,7 @@ static inline bool GrTextureTypeHasRestr
+  * Return true if the encoded origin includes a 90 degree rotation, in which case the width
+  * and height of the source data are swapped relative to a correctly oriented destination.
+  */
+ static inline bool SkEncodedOriginSwapsWidthHeight(SkEncodedOrigin origin) {
+     return origin >= kLeftTop_SkEncodedOrigin;
+diff --git a/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h b/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h
+--- a/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h
++++ b/gfx/skia/skia/include/private/gpu/ganesh/GrTypesPriv.h
+@@ -320,16 +320,17 @@ static inline bool GrTextureTypeHasRestr
+             return false;
+         case GrTextureType::kRectangle:
+             return true;
+         case GrTextureType::kExternal:
+             return true;
          default:
              SK_ABORT("Unexpected texture type");
      }
@@ -25,11 +38,20 @@
  }
  
  //////////////////////////////////////////////////////////////////////////////
-Index: firefox-115.0/gfx/skia/skia/src/core/SkDescriptor.cpp
-===================================================================
---- firefox-115.0.orig/gfx/skia/skia/src/core/SkDescriptor.cpp
-+++ firefox-115.0/gfx/skia/skia/src/core/SkDescriptor.cpp
-@@ -26,6 +26,7 @@ std::unique_ptr<SkDescriptor> SkDescript
+ 
+ /**
+  * Types used to describe format of vertices in arrays.
+  */
+ enum GrVertexAttribType {
+diff --git a/gfx/skia/skia/src/core/SkDescriptor.cpp b/gfx/skia/skia/src/core/SkDescriptor.cpp
+--- a/gfx/skia/skia/src/core/SkDescriptor.cpp
++++ b/gfx/skia/skia/src/core/SkDescriptor.cpp
+@@ -21,16 +21,17 @@ std::unique_ptr<SkDescriptor> SkDescript
+     SkASSERT(length >= sizeof(SkDescriptor) && SkAlign4(length) == length);
+     void* allocation = ::operator new(length);
+     return std::unique_ptr<SkDescriptor>(new (allocation) SkDescriptor{});
+ }
+ 
  void SkDescriptor::operator delete(void* p) { ::operator delete(p); }
  void* SkDescriptor::operator new(size_t) {
      SK_ABORT("Descriptors are created with placement new.");
@@ -37,11 +59,20 @@
  }
  
  void SkDescriptor::flatten(SkWriteBuffer& buffer) const {
-Index: firefox-115.0/gfx/skia/skia/src/core/SkGeometry.h
-===================================================================
---- firefox-115.0.orig/gfx/skia/skia/src/core/SkGeometry.h
-+++ firefox-115.0/gfx/skia/skia/src/core/SkGeometry.h
-@@ -281,6 +281,7 @@ static inline bool SkCubicIsDegenerate(S
+     buffer.writePad32(static_cast<const void*>(this), this->fLength);
+ }
+ 
+ void* SkDescriptor::addEntry(uint32_t tag, size_t length, const void* data) {
+     SkASSERT(tag);
+diff --git a/gfx/skia/skia/src/core/SkGeometry.h b/gfx/skia/skia/src/core/SkGeometry.h
+--- a/gfx/skia/skia/src/core/SkGeometry.h
++++ b/gfx/skia/skia/src/core/SkGeometry.h
+@@ -276,28 +276,30 @@ static inline bool SkCubicIsDegenerate(S
+         case SkCubicType::kLocalCusp:
+         case SkCubicType::kCuspAtInfinity:
+             return false;
+         case SkCubicType::kQuadratic:
+         case SkCubicType::kLineOrPoint:
              return true;
      }
      SK_ABORT("Invalid SkCubicType");
@@ -49,7 +80,12 @@
  }
  
  static inline const char* SkCubicTypeName(SkCubicType type) {
-@@ -293,6 +294,7 @@ static inline const char* SkCubicTypeNam
+     switch (type) {
+         case SkCubicType::kSerpentine: return "kSerpentine";
+         case SkCubicType::kLoop: return "kLoop";
+         case SkCubicType::kLocalCusp: return "kLocalCusp";
+         case SkCubicType::kCuspAtInfinity: return "kCuspAtInfinity";
+         case SkCubicType::kQuadratic: return "kQuadratic";
          case SkCubicType::kLineOrPoint: return "kLineOrPoint";
      }
      SK_ABORT("Invalid SkCubicType");
@@ -57,11 +93,20 @@
  }
  
  /** Returns the cubic classification.
-Index: firefox-115.0/gfx/skia/skia/src/core/SkTextBlob.cpp
-===================================================================
---- firefox-115.0.orig/gfx/skia/skia/src/core/SkTextBlob.cpp
-+++ firefox-115.0/gfx/skia/skia/src/core/SkTextBlob.cpp
-@@ -204,6 +204,7 @@ void SkTextBlob::operator delete(void* p
+ 
+     t[],s[] are set to the two homogeneous parameter values at which points the lines L & M
+     intersect with K, sorted from smallest to largest and oriented so positive values of the
+     implicit are on the "left" side. For a serpentine curve they are the inflection points. For a
+     loop they are the double point. For a local cusp, they are both equal and denote the cusp point.
+diff --git a/gfx/skia/skia/src/core/SkTextBlob.cpp b/gfx/skia/skia/src/core/SkTextBlob.cpp
+--- a/gfx/skia/skia/src/core/SkTextBlob.cpp
++++ b/gfx/skia/skia/src/core/SkTextBlob.cpp
+@@ -199,16 +199,17 @@ unsigned SkTextBlob::ScalarsPerGlyph(Gly
+ }
+ 
+ void SkTextBlob::operator delete(void* p) {
+     sk_free(p);
+ }
  
  void* SkTextBlob::operator new(size_t) {
      SK_ABORT("All blobs are created by placement new.");
@@ -69,11 +114,20 @@
  }
  
  void* SkTextBlob::operator new(size_t, void* p) {
-Index: firefox-115.0/gfx/skia/skia/src/core/SkTypeface_remote.h
-===================================================================
---- firefox-115.0.orig/gfx/skia/skia/src/core/SkTypeface_remote.h
-+++ firefox-115.0/gfx/skia/skia/src/core/SkTypeface_remote.h
-@@ -95,12 +95,14 @@ public:
+     return p;
+ }
+ 
+ SkTextBlobRunIterator::SkTextBlobRunIterator(const SkTextBlob* blob)
+     : fCurrentRun(SkTextBlob::RunRecord::First(blob)) {
+diff --git a/gfx/skia/skia/src/core/SkTypeface_remote.h b/gfx/skia/skia/src/core/SkTypeface_remote.h
+--- a/gfx/skia/skia/src/core/SkTypeface_remote.h
++++ b/gfx/skia/skia/src/core/SkTypeface_remote.h
+@@ -90,83 +90,97 @@ public:
+ 
+     SkTypefaceID remoteTypefaceID() const {return fTypefaceID;}
+ 
+     int glyphCount() const {return fGlyphCount;}
+ 
      bool isLogging() const {return fIsLogging;}
  
  protected:
@@ -89,7 +143,7 @@
      }
      bool onGlyphMaskNeedsCurrentColor() const override {
          return fGlyphMaskNeedsCurrentColor;
-@@ -108,10 +110,12 @@ protected:
+     }
      int onGetVariationDesignPosition(SkFontArguments::VariationPosition::Coordinate coordinates[],
                                       int coordinateCount) const override {
          SK_ABORT("Should never be called.");
@@ -102,7 +156,7 @@
      }
      void onGetFamilyName(SkString* familyName) const override {
          // Used by SkStrikeCache::DumpMemoryStatistics.
-@@ -119,15 +123,19 @@ protected:
+         *familyName = "";
      }
      bool onGetPostScriptName(SkString*) const override {
          SK_ABORT("Should never be called.");
@@ -122,7 +176,13 @@
      }
      std::unique_ptr<SkScalerContext> onCreateScalerContext(
          const SkScalerContextEffects& effects, const SkDescriptor* desc) const override
-@@ -141,20 +149,25 @@ protected:
+     {
+         return std::make_unique<SkScalerContextProxy>(
+                 sk_ref_sp(const_cast<SkTypefaceProxy*>(this)), effects, desc, fDiscardableManager);
+     }
+     void onFilterRec(SkScalerContextRec* rec) const override {
+         // The rec filtering is already applied by the server when generating
+         // the glyphs.
      }
      void onGetFontDescriptor(SkFontDescriptor*, bool*) const override {
          SK_ABORT("Should never be called.");
@@ -148,7 +208,7 @@
      }
      int onCountGlyphs() const override {
          return this->glyphCount();
-@@ -162,6 +175,7 @@ protected:
+     }
  
      void* onGetCTFontRef() const override {
          SK_ABORT("Should never be called.");
@@ -156,11 +216,20 @@
      }
  
  private:
-Index: firefox-115.0/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp
-===================================================================
---- firefox-115.0.orig/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp
-+++ firefox-115.0/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp
-@@ -815,6 +815,7 @@ sk_sp<SkSpecialImage> cpu_blur(
+     const SkTypefaceID                              fTypefaceID;
+     const int                                       fGlyphCount;
+     const bool                                      fIsLogging;
+     const bool                                      fGlyphMaskNeedsCurrentColor;
+     sk_sp<SkStrikeClient::DiscardableHandleManager> fDiscardableManager;
+diff --git a/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp b/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp
+--- a/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp
++++ b/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp
+@@ -810,16 +810,17 @@ sk_sp<SkSpecialImage> cpu_blur(
+         SkASSERT(0 <= sigma && sigma <= 2183); // should be guaranteed after map_sigma
+         if (PassMaker* maker = GaussPass::MakeMaker(sigma, &alloc)) {
+             return maker;
+         }
+         if (PassMaker* maker = TentPass::MakeMaker(sigma, &alloc)) {
              return maker;
          }
          SK_ABORT("Sigma is out of range.");
@@ -168,11 +237,20 @@
      };
  
      PassMaker* makerX = makeMaker(sigma.x());
-Index: firefox-115.0/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp
-===================================================================
---- firefox-115.0.orig/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp
-+++ firefox-115.0/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp
-@@ -69,6 +69,7 @@ void SkFontMgr_Indirect::onGetFamilyName
+     PassMaker* makerY = makeMaker(sigma.y());
+ 
+     if (makerX->window() <= 1 && makerY->window() <= 1) {
+         return copy_image_with_bounds(ctx, input, srcBounds, dstBounds);
+     }
+diff --git a/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp b/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp
+--- a/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp
++++ b/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp
+@@ -64,16 +64,17 @@ int SkFontMgr_Indirect::onCountFamilies(
+ }
+ 
+ void SkFontMgr_Indirect::onGetFamilyName(int index, SkString* familyName) const {
+     SK_ABORT("Not implemented");
+ }
  
  SkFontStyleSet* SkFontMgr_Indirect::onCreateStyleSet(int index) const {
      SK_ABORT("Not implemented");
@@ -180,11 +258,20 @@
  }
  
  SkFontStyleSet* SkFontMgr_Indirect::onMatchFamily(const char familyName[]) const {
-Index: firefox-115.0/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp
-===================================================================
---- firefox-115.0.orig/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp
-+++ firefox-115.0/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp
-@@ -162,18 +162,22 @@ public:
+     return new SkStyleSet_Indirect(this, -1, fProxy->matchName(familyName));
+ }
+ 
+ SkTypeface* SkFontMgr_Indirect::createTypefaceFromFontId(const SkFontIdentity& id) const {
+     if (id.fDataId == SkFontIdentity::kInvalidDataId) {
+diff --git a/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp b/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp
+--- a/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp
++++ b/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp
+@@ -157,28 +157,32 @@ public:
+     SkFontMgr_FCI(sk_sp<SkFontConfigInterface> fci)
+         : fFCI(std::move(fci))
+         , fCache(kMaxSize)
+     {}
+ 
  protected:
      int onCountFamilies() const override {
          SK_ABORT("Not implemented.");
@@ -207,11 +294,20 @@
      }
  
      SkTypeface* onMatchFamilyStyle(const char requestedFamilyName[],
-Index: firefox-115.0/gfx/skia/skia/src/sksl/SkSLCompiler.cpp
-===================================================================
---- firefox-115.0.orig/gfx/skia/skia/src/sksl/SkSLCompiler.cpp
-+++ firefox-115.0/gfx/skia/skia/src/sksl/SkSLCompiler.cpp
-@@ -277,6 +277,7 @@ std::unique_ptr<Expression> Compiler::co
+                                    const SkFontStyle& requestedStyle) const override
+     {
+         SkAutoMutexExclusive ama(fMutex);
+ 
+         SkFontConfigInterface::FontIdentity identity;
+diff --git a/gfx/skia/skia/src/sksl/SkSLCompiler.cpp b/gfx/skia/skia/src/sksl/SkSLCompiler.cpp
+--- a/gfx/skia/skia/src/sksl/SkSLCompiler.cpp
++++ b/gfx/skia/skia/src/sksl/SkSLCompiler.cpp
+@@ -272,16 +272,17 @@ std::unique_ptr<Expression> Compiler::co
+         case Symbol::Kind::kType: {
+             // go through DSLType so we report errors on private types
+             dsl::DSLModifiers modifiers;
+             dsl::DSLType dslType(result->name(), &modifiers, pos);
+             return TypeReference::Convert(*fContext, pos, &dslType.skslType());
          }
          default:
              SK_ABORT("unsupported symbol type %d\n", (int) result->kind());
@@ -219,11 +315,20 @@
      }
  }
  
-Index: firefox-115.0/gfx/skia/skia/src/sksl/SkSLOperator.cpp
-===================================================================
---- firefox-115.0.orig/gfx/skia/skia/src/sksl/SkSLOperator.cpp
-+++ firefox-115.0/gfx/skia/skia/src/sksl/SkSLOperator.cpp
-@@ -51,7 +51,7 @@ OperatorPrecedence Operator::getBinaryPr
+ bool Compiler::optimizeModuleBeforeMinifying(ProgramKind kind, Module& module) {
+     SkASSERT(this->errorCount() == 0);
+ 
+     auto m = SkSL::ModuleLoader::Get();
+ 
+diff --git a/gfx/skia/skia/src/sksl/SkSLOperator.cpp b/gfx/skia/skia/src/sksl/SkSLOperator.cpp
+--- a/gfx/skia/skia/src/sksl/SkSLOperator.cpp
++++ b/gfx/skia/skia/src/sksl/SkSLOperator.cpp
+@@ -46,17 +46,17 @@ OperatorPrecedence Operator::getBinaryPr
+         case Kind::SLASHEQ:      // fall through
+         case Kind::PERCENTEQ:    // fall through
+         case Kind::SHLEQ:        // fall through
+         case Kind::SHREQ:        // fall through
+         case Kind::BITWISEANDEQ: // fall through
          case Kind::BITWISEXOREQ: // fall through
          case Kind::BITWISEOREQ:  return OperatorPrecedence::kAssignment;
          case Kind::COMMA:        return OperatorPrecedence::kSequence;
@@ -232,11 +337,20 @@
      }
  }
  
-Index: firefox-115.0/gfx/skia/skia/src/sksl/ir/SkSLType.h
-===================================================================
---- firefox-115.0.orig/gfx/skia/skia/src/sksl/ir/SkSLType.h
-+++ firefox-115.0/gfx/skia/skia/src/sksl/ir/SkSLType.h
-@@ -422,6 +422,7 @@ public:
+ const char* Operator::operatorName() const {
+     switch (this->kind()) {
+         case Kind::PLUS:         return " + ";
+         case Kind::MINUS:        return " - ";
+         case Kind::STAR:         return " * ";
+diff --git a/gfx/skia/skia/src/sksl/ir/SkSLType.h b/gfx/skia/skia/src/sksl/ir/SkSLType.h
+--- a/gfx/skia/skia/src/sksl/ir/SkSLType.h
++++ b/gfx/skia/skia/src/sksl/ir/SkSLType.h
+@@ -417,16 +417,17 @@ public:
+      * Returns the number of scalars needed to hold this type.
+      */
+     virtual size_t slotCount() const {
+         return 0;
+     }
  
      virtual const std::vector<Field>& fields() const {
          SK_ABORT("Internal error: not a struct");
@@ -244,11 +358,20 @@
      }
  
      /**
-Index: firefox-115.0/gfx/skia/skia/src/utils/SkShadowUtils.cpp
-===================================================================
---- firefox-115.0.orig/gfx/skia/skia/src/utils/SkShadowUtils.cpp
-+++ firefox-115.0/gfx/skia/skia/src/utils/SkShadowUtils.cpp
-@@ -140,6 +140,7 @@ struct SpotVerticesFactory {
+      * For generic types, returns the types that this generic type can substitute for.
+      */
+     virtual SkSpan<const Type* const> coercibleTypes() const {
+         SkDEBUGFAIL("Internal error: not a generic type");
+         return {};
+diff --git a/gfx/skia/skia/src/utils/SkShadowUtils.cpp b/gfx/skia/skia/src/utils/SkShadowUtils.cpp
+--- a/gfx/skia/skia/src/utils/SkShadowUtils.cpp
++++ b/gfx/skia/skia/src/utils/SkShadowUtils.cpp
+@@ -135,16 +135,17 @@ struct SpotVerticesFactory {
+                 }
+                 return false;
+             case OccluderType::kDirectional:
+             case OccluderType::kDirectionalTransparent:
+                 *translate = that.fOffset - fOffset;
                  return true;
          }
          SK_ABORT("Uninitialized occluder type?");
@@ -256,11 +379,20 @@
      }
  
      sk_sp<SkVertices> makeVertices(const SkPath& path, const SkMatrix& ctm,
-Index: firefox-115.0/intl/icu/source/i18n/number_rounding.cpp
-===================================================================
---- firefox-115.0.orig/intl/icu/source/i18n/number_rounding.cpp
-+++ firefox-115.0/intl/icu/source/i18n/number_rounding.cpp
-@@ -283,6 +283,7 @@ FractionPrecision Precision::constructFr
+                                    SkVector* translate) const {
+         bool transparent = fOccluderType == OccluderType::kPointTransparent ||
+                            fOccluderType == OccluderType::kDirectionalTransparent;
+         bool directional = fOccluderType == OccluderType::kDirectional ||
+                            fOccluderType == OccluderType::kDirectionalTransparent;
+diff --git a/intl/icu/source/i18n/number_rounding.cpp b/intl/icu/source/i18n/number_rounding.cpp
+--- a/intl/icu/source/i18n/number_rounding.cpp
++++ b/intl/icu/source/i18n/number_rounding.cpp
+@@ -278,27 +278,29 @@ Precision IncrementPrecision::withMinFra
+ }
+ 
+ FractionPrecision Precision::constructFraction(int32_t minFrac, int32_t maxFrac) {
+     FractionSignificantSettings settings;
+     settings.fMinFrac = static_cast<digits_t>(minFrac);
      settings.fMaxFrac = static_cast<digits_t>(maxFrac);
      settings.fMinSig = -1;
      settings.fMaxSig = -1;
@@ -268,7 +400,11 @@
      PrecisionUnion union_;
      union_.fracSig = settings;
      return {RND_FRACTION, union_};
-@@ -294,6 +295,7 @@ Precision Precision::constructSignifican
+ }
+ 
+ Precision Precision::constructSignificant(int32_t minSig, int32_t maxSig) {
+     FractionSignificantSettings settings;
+     settings.fMinFrac = -1;
      settings.fMaxFrac = -1;
      settings.fMinSig = static_cast<digits_t>(minSig);
      settings.fMaxSig = static_cast<digits_t>(maxSig);
@@ -276,11 +412,20 @@
      PrecisionUnion union_;
      union_.fracSig = settings;
      return {RND_SIGNIFICANT, union_};
-Index: firefox-115.0/js/src/irregexp/imported/regexp-parser.cc
-===================================================================
---- firefox-115.0.orig/js/src/irregexp/imported/regexp-parser.cc
-+++ firefox-115.0/js/src/irregexp/imported/regexp-parser.cc
-@@ -2656,6 +2656,7 @@ bool MayContainStrings(ClassSetOperandTy
+ }
+ 
+ Precision
+ Precision::constructFractionSignificant(
+         const FractionPrecision &base,
+diff --git a/js/src/irregexp/imported/regexp-parser.cc b/js/src/irregexp/imported/regexp-parser.cc
+--- a/js/src/irregexp/imported/regexp-parser.cc
++++ b/js/src/irregexp/imported/regexp-parser.cc
+@@ -2644,16 +2644,17 @@ bool MayContainStrings(ClassSetOperandTy
+       return false;
+     case ClassSetOperandType::kCharacterClassEscape:
+     case ClassSetOperandType::kClassStringDisjunction:
+       return operand->AsClassSetOperand()->has_strings();
+     case ClassSetOperandType::kNestedClass:
        if (operand->IsClassRanges()) return false;
        return operand->AsClassSetExpression()->may_contain_strings();
    }
@@ -288,11 +433,20 @@
  }
  
  }  // namespace
-Index: firefox-115.0/third_party/libwebrtc/api/adaptation/resource.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/api/adaptation/resource.cc
-+++ firefox-115.0/third_party/libwebrtc/api/adaptation/resource.cc
-@@ -22,6 +22,7 @@ const char* ResourceUsageStateToString(R
+ 
+ // TODO(v8:11935): Change permalink once proposal is in stage 4.
+ // https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#prod-ClassUnion
+ template <class CharT>
+ RegExpTree* RegExpParserImpl<CharT>::ParseClassUnion(
+diff --git a/third_party/libwebrtc/api/adaptation/resource.cc b/third_party/libwebrtc/api/adaptation/resource.cc
+--- a/third_party/libwebrtc/api/adaptation/resource.cc
++++ b/third_party/libwebrtc/api/adaptation/resource.cc
+@@ -17,16 +17,17 @@ namespace webrtc {
+ const char* ResourceUsageStateToString(ResourceUsageState usage_state) {
+   switch (usage_state) {
+     case ResourceUsageState::kOveruse:
+       return "kOveruse";
+     case ResourceUsageState::kUnderuse:
        return "kUnderuse";
    }
    RTC_CHECK_NOTREACHED();
@@ -300,11 +454,20 @@
  }
  
  ResourceListener::~ResourceListener() {}
-Index: firefox-115.0/third_party/libwebrtc/api/rtp_parameters.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/api/rtp_parameters.cc
-+++ firefox-115.0/third_party/libwebrtc/api/rtp_parameters.cc
-@@ -32,6 +32,7 @@ const char* DegradationPreferenceToStrin
+ 
+ Resource::Resource() {}
+ 
+ Resource::~Resource() {}
+ 
+diff --git a/third_party/libwebrtc/api/rtp_parameters.cc b/third_party/libwebrtc/api/rtp_parameters.cc
+--- a/third_party/libwebrtc/api/rtp_parameters.cc
++++ b/third_party/libwebrtc/api/rtp_parameters.cc
+@@ -27,16 +27,17 @@ const char* DegradationPreferenceToStrin
+     case DegradationPreference::MAINTAIN_FRAMERATE:
+       return "maintain-framerate";
+     case DegradationPreference::MAINTAIN_RESOLUTION:
+       return "maintain-resolution";
+     case DegradationPreference::BALANCED:
        return "balanced";
    }
    RTC_CHECK_NOTREACHED();
@@ -312,11 +475,20 @@
  }
  
  const double kDefaultBitratePriority = 1.0;
-Index: firefox-115.0/third_party/libwebrtc/api/video/video_frame_buffer.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/api/video/video_frame_buffer.cc
-+++ firefox-115.0/third_party/libwebrtc/api/video/video_frame_buffer.cc
-@@ -106,6 +106,8 @@ const char* VideoFrameBufferTypeToString
+ 
+ RtcpFeedback::RtcpFeedback() = default;
+ RtcpFeedback::RtcpFeedback(RtcpFeedbackType type) : type(type) {}
+ RtcpFeedback::RtcpFeedback(RtcpFeedbackType type,
+                            RtcpFeedbackMessageType message_type)
+diff --git a/third_party/libwebrtc/api/video/video_frame_buffer.cc b/third_party/libwebrtc/api/video/video_frame_buffer.cc
+--- a/third_party/libwebrtc/api/video/video_frame_buffer.cc
++++ b/third_party/libwebrtc/api/video/video_frame_buffer.cc
+@@ -101,16 +101,18 @@ const char* VideoFrameBufferTypeToString
+       return "kI210";
+     case VideoFrameBuffer::Type::kI410:
+       return "kI410";
+     case VideoFrameBuffer::Type::kNV12:
+       return "kNV12";
      default:
        RTC_DCHECK_NOTREACHED();
    }
@@ -325,11 +497,20 @@
  }
  
  int I420BufferInterface::ChromaWidth() const {
-Index: firefox-115.0/third_party/libwebrtc/api/video_codecs/video_codec.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/api/video_codecs/video_codec.cc
-+++ firefox-115.0/third_party/libwebrtc/api/video_codecs/video_codec.cc
-@@ -118,6 +118,7 @@ const char* CodecTypeToPayloadString(Vid
+   return (width() + 1) / 2;
+ }
+ 
+ int I420BufferInterface::ChromaHeight() const {
+   return (height() + 1) / 2;
+diff --git a/third_party/libwebrtc/api/video_codecs/video_codec.cc b/third_party/libwebrtc/api/video_codecs/video_codec.cc
+--- a/third_party/libwebrtc/api/video_codecs/video_codec.cc
++++ b/third_party/libwebrtc/api/video_codecs/video_codec.cc
+@@ -113,16 +113,17 @@ const char* CodecTypeToPayloadString(Vid
+     case kVideoCodecH264:
+       return kPayloadNameH264;
+     case kVideoCodecMultiplex:
+       return kPayloadNameMultiplex;
+     case kVideoCodecGeneric:
        return kPayloadNameGeneric;
    }
    RTC_CHECK_NOTREACHED();
@@ -337,11 +518,20 @@
  }
  
  VideoCodecType PayloadStringToCodecType(const std::string& name) {
-Index: firefox-115.0/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc
-+++ firefox-115.0/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc
-@@ -163,6 +163,7 @@ class VideoEncoderSoftwareFallbackWrappe
+   if (absl::EqualsIgnoreCase(name, kPayloadNameVp8))
+     return kVideoCodecVP8;
+   if (absl::EqualsIgnoreCase(name, kPayloadNameVp9))
+     return kVideoCodecVP9;
+   if (absl::EqualsIgnoreCase(name, kPayloadNameAv1) ||
+diff --git a/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc b/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc
+--- a/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc
++++ b/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc
+@@ -158,16 +158,17 @@ class VideoEncoderSoftwareFallbackWrappe
+         [[fallthrough]];
+       case EncoderState::kMainEncoderUsed:
+         return encoder_.get();
+       case EncoderState::kFallbackDueToFailure:
+       case EncoderState::kForcedFallback:
          return fallback_encoder_.get();
      }
      RTC_CHECK_NOTREACHED();
@@ -349,7 +539,17 @@
    }
  
    // Updates encoder with last observed parameters, such as callbacks, rates,
-@@ -343,6 +344,7 @@ int32_t VideoEncoderSoftwareFallbackWrap
+   // etc.
+   void PrimeEncoder(VideoEncoder* encoder) const;
+ 
+   // Settings used in the last InitEncode call and used if a dynamic fallback to
+   // software is required.
+@@ -338,16 +339,17 @@ int32_t VideoEncoderSoftwareFallbackWrap
+     case EncoderState::kMainEncoderUsed: {
+       return EncodeWithMainEncoder(frame, frame_types);
+     }
+     case EncoderState::kFallbackDueToFailure:
+     case EncoderState::kForcedFallback:
        return fallback_encoder_->Encode(frame, frame_types);
    }
    RTC_CHECK_NOTREACHED();
@@ -357,11 +557,20 @@
  }
  
  int32_t VideoEncoderSoftwareFallbackWrapper::EncodeWithMainEncoder(
-Index: firefox-115.0/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc
-+++ firefox-115.0/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc
-@@ -168,6 +168,7 @@ const char* Adaptation::StatusToString(A
+     const VideoFrame& frame,
+     const std::vector<VideoFrameType>* frame_types) {
+   int32_t ret = encoder_->Encode(frame, frame_types);
+   // If requested, try a software fallback.
+   bool fallback_requested = (ret == WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE);
+diff --git a/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc b/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc
+--- a/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc
++++ b/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc
+@@ -164,16 +164,17 @@ const char* Adaptation::StatusToString(A
+     case Status::kInsufficientInput:
+       return "kInsufficientInput";
+     case Status::kAdaptationDisabled:
+       return "kAdaptationDisabled";
+     case Status::kRejectedByConstraint:
        return "kRejectedByConstraint";
    }
    RTC_CHECK_NOTREACHED();
@@ -369,7 +578,17 @@
  }
  
  Adaptation::Adaptation(int validation_id,
-@@ -390,6 +391,7 @@ VideoStreamAdapter::RestrictionsOrState
+                        VideoSourceRestrictions restrictions,
+                        VideoAdaptationCounters counters,
+                        VideoStreamInputState input_state)
+     : validation_id_(validation_id),
+       status_(Status::kValid),
+@@ -386,16 +387,17 @@ VideoStreamAdapter::RestrictionsOrState 
+     case DegradationPreference::MAINTAIN_RESOLUTION: {
+       // Scale up framerate.
+       return IncreaseFramerate(input_state, current_restrictions_);
+     }
+     case DegradationPreference::DISABLED:
        return Adaptation::Status::kAdaptationDisabled;
    }
    RTC_CHECK_NOTREACHED();
@@ -377,7 +596,17 @@
  }
  
  Adaptation VideoStreamAdapter::GetAdaptationDown() {
-@@ -472,6 +474,7 @@ VideoStreamAdapter::GetAdaptationDownSte
+   RTC_DCHECK_RUN_ON(&sequence_checker_);
+   VideoStreamInputState input_state = input_state_provider_->InputState();
+   ++adaptation_validation_id_;
+   RestrictionsOrState restrictions_or_state =
+       GetAdaptationDownStep(input_state, current_restrictions_);
+@@ -468,16 +470,17 @@ VideoStreamAdapter::GetAdaptationDownSte
+     }
+     case DegradationPreference::MAINTAIN_RESOLUTION: {
+       return DecreaseFramerate(input_state, current_restrictions);
+     }
+     case DegradationPreference::DISABLED:
        return Adaptation::Status::kAdaptationDisabled;
    }
    RTC_CHECK_NOTREACHED();
@@ -385,7 +614,17 @@
  }
  
  VideoStreamAdapter::RestrictionsOrState VideoStreamAdapter::DecreaseResolution(
-@@ -625,6 +628,8 @@ Adaptation VideoStreamAdapter::GetAdaptD
+     const VideoStreamInputState& input_state,
+     const RestrictionsWithCounters& current_restrictions) {
+   int target_pixels =
+       GetLowerResolutionThan(input_state.frame_size_pixels().value());
+   // Use single active stream if set, this stream could be lower than the input.
+@@ -621,16 +624,18 @@ Adaptation VideoStreamAdapter::GetAdaptD
+     case DegradationPreference::MAINTAIN_FRAMERATE:
+       return GetAdaptationDown();
+     case DegradationPreference::BALANCED: {
+       return RestrictionsOrStateToAdaptation(
+           GetAdaptDownResolutionStepForBalanced(input_state), input_state);
      }
    }
    RTC_CHECK_NOTREACHED();
@@ -394,11 +633,20 @@
  }
  
  VideoStreamAdapter::RestrictionsOrState
-Index: firefox-115.0/third_party/libwebrtc/call/rtp_payload_params.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/call/rtp_payload_params.cc
-+++ firefox-115.0/third_party/libwebrtc/call/rtp_payload_params.cc
-@@ -407,7 +407,7 @@ absl::optional<FrameDependencyStructure>
+ VideoStreamAdapter::GetAdaptDownResolutionStepForBalanced(
+     const VideoStreamInputState& input_state) const {
+   // Adapt twice if the first adaptation did not decrease resolution.
+   auto first_step = GetAdaptationDownStep(input_state, current_restrictions_);
+   if (!absl::holds_alternative<RestrictionsWithCounters>(first_step)) {
+diff --git a/third_party/libwebrtc/call/rtp_payload_params.cc b/third_party/libwebrtc/call/rtp_payload_params.cc
+--- a/third_party/libwebrtc/call/rtp_payload_params.cc
++++ b/third_party/libwebrtc/call/rtp_payload_params.cc
+@@ -400,17 +400,17 @@ absl::optional<FrameDependencyStructure>
+       }
+       return structure;
+     }
+     case VideoCodecType::kVideoCodecAV1:
+     case VideoCodecType::kVideoCodecH264:
      case VideoCodecType::kVideoCodecMultiplex:
        return absl::nullopt;
    }
@@ -407,11 +655,20 @@
  }
  
  void RtpPayloadParams::GenericToGeneric(int64_t shared_frame_id,
-Index: firefox-115.0/third_party/libwebrtc/call/video_send_stream.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/call/video_send_stream.cc
-+++ firefox-115.0/third_party/libwebrtc/call/video_send_stream.cc
-@@ -30,6 +30,7 @@ const char* StreamTypeToString(VideoSend
+                                         bool is_keyframe,
+                                         RTPVideoHeader* rtp_video_header) {
+   RTPVideoHeader::GenericDescriptorInfo& generic =
+       rtp_video_header->generic.emplace();
+ 
+diff --git a/third_party/libwebrtc/call/video_send_stream.cc b/third_party/libwebrtc/call/video_send_stream.cc
+--- a/third_party/libwebrtc/call/video_send_stream.cc
++++ b/third_party/libwebrtc/call/video_send_stream.cc
+@@ -25,16 +25,17 @@ const char* StreamTypeToString(VideoSend
+     case VideoSendStream::StreamStats::StreamType::kMedia:
+       return "media";
+     case VideoSendStream::StreamStats::StreamType::kRtx:
+       return "rtx";
+     case VideoSendStream::StreamStats::StreamType::kFlexfec:
        return "flexfec";
    }
    RTC_CHECK_NOTREACHED();
@@ -419,11 +676,20 @@
  }
  
  }  // namespace
-Index: firefox-115.0/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc
-+++ firefox-115.0/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc
-@@ -378,7 +378,7 @@ std::unique_ptr<ClippingPredictor> Creat
+ 
+ VideoSendStream::StreamStats::StreamStats() = default;
+ VideoSendStream::StreamStats::~StreamStats() = default;
+ 
+ std::string VideoSendStream::StreamStats::ToString() const {
+diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc b/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc
+--- a/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc
++++ b/third_party/libwebrtc/modules/audio_processing/agc2/clipping_predictor.cc
+@@ -373,12 +373,12 @@ std::unique_ptr<ClippingPredictor> Creat
+           config.reference_window_delay, config.clipping_threshold,
+           /*adaptive_step_estimation=*/true);
+     case ClippingPredictorMode::kFixedStepClippingPeakPrediction:
+       return std::make_unique<ClippingPeakPredictor>(
+           num_channels, config.window_length, config.reference_window_length,
            config.reference_window_delay, config.clipping_threshold,
            /*adaptive_step_estimation=*/false);
    }
@@ -432,11 +698,15 @@
  }
  
  }  // namespace webrtc
-Index: firefox-115.0/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc
-+++ firefox-115.0/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc
-@@ -48,6 +48,7 @@ constexpr absl::string_view MetricNamePr
+diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc b/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc
+--- a/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc
++++ b/third_party/libwebrtc/modules/audio_processing/agc2/input_volume_stats_reporter.cc
+@@ -43,16 +43,17 @@ int ComputeAverageUpdate(int sum_updates
+ constexpr absl::string_view MetricNamePrefix(
+     InputVolumeType input_volume_type) {
+   switch (input_volume_type) {
+     case InputVolumeType::kApplied:
+       return "WebRTC.Audio.Apm.AppliedInputVolume.";
      case InputVolumeType::kRecommended:
        return "WebRTC.Audio.Apm.RecommendedInputVolume.";
    }
@@ -444,11 +714,20 @@
  }
  
  metrics::Histogram* CreateVolumeHistogram(InputVolumeType input_volume_type) {
-Index: firefox-115.0/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc
-+++ firefox-115.0/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc
-@@ -59,6 +59,8 @@ rtc::FunctionView<float(float)> GetActiv
+   char buffer[64];
+   rtc::SimpleStringBuilder builder(buffer);
+   builder << MetricNamePrefix(input_volume_type) << "OnChange";
+   return metrics::HistogramFactoryGetCountsLinear(/*name=*/builder.str(),
+                                                   /*min=*/1,
+diff --git a/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc b/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc
+--- a/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc
++++ b/third_party/libwebrtc/modules/audio_processing/agc2/rnn_vad/rnn_fc.cc
+@@ -54,16 +54,18 @@ std::vector<float> PreprocessWeights(rtc
+ rtc::FunctionView<float(float)> GetActivationFunction(
+     ActivationFunction activation_function) {
+   switch (activation_function) {
+     case ActivationFunction::kTansigApproximated:
+       return ::rnnoise::TansigApproximated;
      case ActivationFunction::kSigmoidApproximated:
        return ::rnnoise::SigmoidApproximated;
    }
@@ -457,11 +736,20 @@
  }
  
  }  // namespace
-Index: firefox-115.0/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc
-+++ firefox-115.0/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc
-@@ -99,6 +99,7 @@ GainControl::Mode Agc1ConfigModeToInterf
+ 
+ FullyConnectedLayer::FullyConnectedLayer(
+     const int input_size,
+     const int output_size,
+     const rtc::ArrayView<const int8_t> bias,
+diff --git a/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc b/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc
+--- a/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc
++++ b/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc
+@@ -94,16 +94,17 @@ GainControl::Mode Agc1ConfigModeToInterf
+     case Agc1Config::kAdaptiveAnalog:
+       return GainControl::kAdaptiveAnalog;
+     case Agc1Config::kAdaptiveDigital:
+       return GainControl::kAdaptiveDigital;
+     case Agc1Config::kFixedDigital:
        return GainControl::kFixedDigital;
    }
    RTC_CHECK_NOTREACHED();
@@ -469,7 +757,17 @@
  }
  
  bool MinimizeProcessingForUnusedOutput() {
-@@ -166,7 +167,7 @@ int AudioFormatValidityToErrorCode(Audio
+   return !field_trial::IsEnabled("WebRTC-MutedStateKillSwitch");
+ }
+ 
+ // Maximum lengths that frame of samples being passed from the render side to
+ // the capture side can have (does not apply to AEC3).
+@@ -161,17 +162,17 @@ int AudioFormatValidityToErrorCode(Audio
+     case AudioFormatValidity::kValidAndSupported:
+       return AudioProcessing::kNoError;
+     case AudioFormatValidity::kValidButUnsupportedSampleRate:  // fall-through
+     case AudioFormatValidity::kInvalidSampleRate:
+       return AudioProcessing::kBadSampleRateError;
      case AudioFormatValidity::kInvalidChannelCount:
        return AudioProcessing::kBadNumberChannelsError;
    }
@@ -478,7 +776,17 @@
  }
  
  // Returns an AudioProcessing::Error together with the best possible option for
-@@ -2421,6 +2422,7 @@ void AudioProcessingImpl::InitializeNois
+ // output audio content.
+ std::pair<int, FormatErrorOutputOption> ChooseErrorOutputOption(
+     const StreamConfig& input_config,
+     const StreamConfig& output_config) {
+   AudioFormatValidity input_validity = ValidateAudioFormat(input_config);
+@@ -2416,16 +2417,17 @@ void AudioProcessingImpl::InitializeNois
+             case NoiseSuppresionConfig::kModerate:
+               return NsConfig::SuppressionLevel::k12dB;
+             case NoiseSuppresionConfig::kHigh:
+               return NsConfig::SuppressionLevel::k18dB;
+             case NoiseSuppresionConfig::kVeryHigh:
                return NsConfig::SuppressionLevel::k21dB;
            }
            RTC_CHECK_NOTREACHED();
@@ -486,11 +794,20 @@
          };
  
      NsConfig cfg;
-Index: firefox-115.0/third_party/libwebrtc/modules/audio_processing/include/audio_processing.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/modules/audio_processing/include/audio_processing.cc
-+++ firefox-115.0/third_party/libwebrtc/modules/audio_processing/include/audio_processing.cc
-@@ -32,6 +32,7 @@ std::string NoiseSuppressionLevelToStrin
+     cfg.target_level = map_level(config_.noise_suppression.level);
+     submodules_.noise_suppressor = std::make_unique<NoiseSuppressor>(
+         cfg, proc_sample_rate_hz(), num_proc_channels());
+   }
+ }
+diff --git a/third_party/libwebrtc/modules/audio_processing/include/audio_processing.cc b/third_party/libwebrtc/modules/audio_processing/include/audio_processing.cc
+--- a/third_party/libwebrtc/modules/audio_processing/include/audio_processing.cc
++++ b/third_party/libwebrtc/modules/audio_processing/include/audio_processing.cc
+@@ -27,28 +27,30 @@ std::string NoiseSuppressionLevelToStrin
+     case AudioProcessing::Config::NoiseSuppression::Level::kModerate:
+       return "Moderate";
+     case AudioProcessing::Config::NoiseSuppression::Level::kHigh:
+       return "High";
+     case AudioProcessing::Config::NoiseSuppression::Level::kVeryHigh:
        return "VeryHigh";
    }
    RTC_CHECK_NOTREACHED();
@@ -498,7 +815,12 @@
  }
  
  std::string GainController1ModeToString(const Agc1Config::Mode& mode) {
-@@ -44,6 +45,7 @@ std::string GainController1ModeToString(
+   switch (mode) {
+     case Agc1Config::Mode::kAdaptiveAnalog:
+       return "AdaptiveAnalog";
+     case Agc1Config::Mode::kAdaptiveDigital:
+       return "AdaptiveDigital";
+     case Agc1Config::Mode::kFixedDigital:
        return "FixedDigital";
    }
    RTC_CHECK_NOTREACHED();
@@ -506,11 +828,20 @@
  }
  
  }  // namespace
-Index: firefox-115.0/third_party/libwebrtc/modules/audio_processing/transient/transient_suppressor_impl.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/modules/audio_processing/transient/transient_suppressor_impl.cc
-+++ firefox-115.0/third_party/libwebrtc/modules/audio_processing/transient/transient_suppressor_impl.cc
-@@ -53,6 +53,7 @@ std::string GetVadModeLabel(TransientSup
+ 
+ constexpr int AudioProcessing::kNativeSampleRatesHz[];
+ 
+ void CustomProcessing::SetRuntimeSetting(
+     AudioProcessing::RuntimeSetting setting) {}
+diff --git a/third_party/libwebrtc/modules/audio_processing/transient/transient_suppressor_impl.cc b/third_party/libwebrtc/modules/audio_processing/transient/transient_suppressor_impl.cc
+--- a/third_party/libwebrtc/modules/audio_processing/transient/transient_suppressor_impl.cc
++++ b/third_party/libwebrtc/modules/audio_processing/transient/transient_suppressor_impl.cc
+@@ -48,16 +48,17 @@ std::string GetVadModeLabel(TransientSup
+   switch (vad_mode) {
+     case TransientSuppressor::VadMode::kDefault:
+       return "default";
+     case TransientSuppressor::VadMode::kRnnVad:
+       return "RNN VAD";
      case TransientSuppressor::VadMode::kNoVad:
        return "no VAD";
    }
@@ -518,11 +849,20 @@
  }
  
  }  // namespace
-Index: firefox-115.0/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc
-+++ firefox-115.0/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc
-@@ -44,6 +44,7 @@ ScreenCastPortal::CaptureSourceType Scre
+ 
+ TransientSuppressorImpl::TransientSuppressorImpl(VadMode vad_mode,
+                                                  int sample_rate_hz,
+                                                  int detector_rate_hz,
+                                                  int num_channels)
+diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc
+--- a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc
++++ b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/screencast_portal.cc
+@@ -39,16 +39,17 @@ ScreenCastPortal::CaptureSourceType Scre
+   switch (type) {
+     case CaptureType::kScreen:
+       return ScreenCastPortal::CaptureSourceType::kScreen;
+     case CaptureType::kWindow:
+       return ScreenCastPortal::CaptureSourceType::kWindow;
      case CaptureType::kAnyScreenContent:
        return ScreenCastPortal::CaptureSourceType::kAnyScreenContent;
    }
@@ -530,11 +870,41 @@
  }
  
  ScreenCastPortal::ScreenCastPortal(CaptureType type, PortalNotifier* notifier)
-Index: firefox-115.0/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc
-+++ firefox-115.0/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc
-@@ -38,6 +38,7 @@ std::unique_ptr<VideoRtpDepacketizer> Cr
+     : ScreenCastPortal(type,
+                        notifier,
+                        OnProxyRequested,
+                        OnSourcesRequestResponseSignal,
+                        this) {}
+diff --git a/third_party/libwebrtc/modules/pacing/bitrate_prober.cc b/third_party/libwebrtc/modules/pacing/bitrate_prober.cc
+--- a/third_party/libwebrtc/modules/pacing/bitrate_prober.cc
++++ b/third_party/libwebrtc/modules/pacing/bitrate_prober.cc
+@@ -64,16 +64,17 @@ bool BitrateProber::ReadyToSetActiveStat
+       return false;
+     case ProbingState::kInactive:
+       // If config_.min_packet_size > 0, a "large enough" packet must be sent
+       // first, before a probe can be generated and sent. Otherwise, send the
+       // probe asap.
+       return packet_size >=
+              std::min(RecommendedMinProbeSize(), config_.min_packet_size.Get());
+   }
++  RTC_CHECK_NOTREACHED();
+ }
+ 
+ void BitrateProber::OnIncomingPacket(DataSize packet_size) {
+   if (ReadyToSetActiveState(packet_size)) {
+     next_probe_time_ = Timestamp::MinusInfinity();
+     probing_state_ = ProbingState::kActive;
+   }
+ }
+diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc b/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc
+--- a/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc
++++ b/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc
+@@ -33,11 +33,12 @@ std::unique_ptr<VideoRtpDepacketizer> Cr
+       return std::make_unique<VideoRtpDepacketizerVp9>();
+     case kVideoCodecAV1:
+       return std::make_unique<VideoRtpDepacketizerAv1>();
+     case kVideoCodecGeneric:
+     case kVideoCodecMultiplex:
        return std::make_unique<VideoRtpDepacketizerGeneric>();
    }
    RTC_CHECK_NOTREACHED();
@@ -542,11 +912,15 @@
  }
  
  }  // namespace webrtc
-Index: firefox-115.0/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc
-+++ firefox-115.0/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc
-@@ -142,6 +142,7 @@ bool IsNonVolatile(RTPExtensionType type
+diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc
+--- a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc
++++ b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc
+@@ -135,16 +135,17 @@ bool IsNonVolatile(RTPExtensionType type
+ #if defined(WEBRTC_MOZILLA_BUILD)
+     case kRtpExtensionCsrcAudioLevel:
+       // TODO: Mozilla implement for CsrcAudioLevel
+       RTC_CHECK(false);
+       return false;
  #endif
    }
    RTC_CHECK_NOTREACHED();
@@ -554,11 +928,20 @@
  }
  
  bool HasBweExtension(const RtpHeaderExtensionMap& extensions_map) {
-Index: firefox-115.0/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
-+++ firefox-115.0/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
-@@ -45,6 +45,7 @@ namespace {
+   return extensions_map.IsRegistered(kRtpExtensionTransportSequenceNumber) ||
+          extensions_map.IsRegistered(kRtpExtensionTransportSequenceNumber02) ||
+          extensions_map.IsRegistered(kRtpExtensionAbsoluteSendTime) ||
+          extensions_map.IsRegistered(kRtpExtensionTransmissionTimeOffset);
+ }
+diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
+--- a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
++++ b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
+@@ -40,16 +40,17 @@ namespace {
+     case AudioFrameType::kEmptyFrame:
+       return "empty";
+     case AudioFrameType::kAudioFrameSpeech:
+       return "audio_speech";
+     case AudioFrameType::kAudioFrameCN:
        return "audio_cn";
    }
    RTC_CHECK_NOTREACHED();
@@ -566,11 +949,20 @@
  }
  
  constexpr char kIncludeCaptureClockOffset[] =
-Index: firefox-115.0/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc
-+++ firefox-115.0/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc
-@@ -110,6 +110,7 @@ size_t BufferToIndex(Vp8BufferReference
+     "WebRTC-IncludeCaptureClockOffset";
+ 
+ }  // namespace
+ 
+ RTPSenderAudio::RTPSenderAudio(Clock* clock, RTPSender* rtp_sender)
+diff --git a/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc b/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc
+--- a/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc
++++ b/third_party/libwebrtc/modules/video_coding/codecs/vp8/default_temporal_layers.cc
+@@ -105,16 +105,17 @@ size_t BufferToIndex(Vp8BufferReference 
+       return 0;
+     case Vp8FrameConfig::Vp8BufferReference::kGolden:
+       return 1;
+     case Vp8FrameConfig::Vp8BufferReference::kAltref:
+       return 2;
      case Vp8FrameConfig::Vp8BufferReference::kNone:
        RTC_CHECK_NOTREACHED();
    }
@@ -578,11 +970,20 @@
  }
  
  }  // namespace
-Index: firefox-115.0/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc
-+++ firefox-115.0/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc
-@@ -30,6 +30,7 @@ TemporalLayersChecker::CreateTemporalLay
+ 
+ constexpr size_t DefaultTemporalLayers::kNumReferenceBuffers;
+ 
+ std::vector<DefaultTemporalLayers::DependencyInfo>
+ DefaultTemporalLayers::GetDependencyInfo(size_t num_layers) {
+diff --git a/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc b/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc
+--- a/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc
++++ b/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc
+@@ -25,16 +25,17 @@ TemporalLayersChecker::CreateTemporalLay
+     case Vp8TemporalLayersType::kFixedPattern:
+       return std::make_unique<DefaultTemporalLayersChecker>(
+           num_temporal_layers);
+     case Vp8TemporalLayersType::kBitrateDynamic:
+       // Conference mode temporal layering for screen content in base stream.
        return std::make_unique<TemporalLayersChecker>(num_temporal_layers);
    }
    RTC_CHECK_NOTREACHED();
@@ -590,11 +991,20 @@
  }
  
  TemporalLayersChecker::TemporalLayersChecker(int num_temporal_layers)
-Index: firefox-115.0/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc
-===================================================================
---- firefox-115.0.orig/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc
-+++ firefox-115.0/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc
-@@ -63,6 +63,7 @@ std::string ToString(VideoAdaptationReas
+     : num_temporal_layers_(num_temporal_layers),
+       sequence_number_(0),
+       last_sync_sequence_number_(0),
+       last_tl0_sequence_number_(0) {}
+ 
+diff --git a/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc b/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc
+--- a/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc
++++ b/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc
+@@ -58,16 +58,17 @@ bool IsFramerateScalingEnabled(Degradati
+ std::string ToString(VideoAdaptationReason reason) {
+   switch (reason) {
+     case VideoAdaptationReason::kQuality:
+       return "quality";
+     case VideoAdaptationReason::kCpu:
        return "cpu";
    }
    RTC_CHECK_NOTREACHED();
@@ -602,3 +1012,8 @@
  }
  
  std::vector<bool> GetActiveLayersFlags(const VideoCodec& codec) {
+   std::vector<bool> flags;
+   if (codec.codecType == VideoCodecType::kVideoCodecVP9) {
+     flags.resize(codec.VP9().numberOfSpatialLayers);
+     for (size_t i = 0; i < flags.size(); ++i) {
+       flags[i] = codec.spatialLayers[i].active;
--- a/series	Sun Aug 27 10:23:20 2023 +0200
+++ b/series	Sat Sep 23 09:32:28 2023 +0200
@@ -10,7 +10,6 @@
 mozilla-bmo1504834-part1.patch
 mozilla-bmo1504834-part3.patch
 mozilla-bmo1512162.patch
-mozilla-fix-top-level-asm.patch
 mozilla-bmo849632.patch
 mozilla-bmo998749.patch
 mozilla-libavcodec58_91.patch
@@ -19,8 +18,8 @@
 one_swizzle_to_rule_them_all.patch
 svg-rendering.patch
 mozilla-partial-revert-1768632.patch
-mozilla-bmo1775202.patch
 mozilla-rust-disable-future-incompat.patch
+mozilla-bmo1822730.patch
 
 # Firefox patches
 firefox-kde.patch