Pārlūkot izejas kodu

uppkg -> 25.6.0-1

Noah Vogt 1 gadu atpakaļ
vecāks
revīzija
8a0aa5e664

+ 16 - 33
.SRCINFO

@@ -1,6 +1,6 @@
-pkgbase = electron-xdg
+pkgbase = electron25-xdg
 	pkgdesc = Build cross platform desktop apps with web technologies - without creating a useless ~/.pki directory
-	pkgver = 22.3.3
+	pkgver = 25.6.0
 	pkgrel = 1
 	url = https://electronjs.org/
 	arch = x86_64
@@ -12,8 +12,8 @@ pkgbase = electron-xdg
 	makedepends = gperf
 	makedepends = harfbuzz-icu
 	makedepends = http-parser
+	makedepends = qt5-base
 	makedepends = java-runtime-headless
-	makedepends = jsoncpp
 	makedepends = libnotify
 	makedepends = lld
 	makedepends = llvm
@@ -23,22 +23,18 @@ pkgbase = electron-xdg
 	makedepends = pipewire
 	makedepends = python
 	makedepends = python-httplib2
+	makedepends = python-requests
 	makedepends = python-pyparsing
 	makedepends = python-six
 	makedepends = wget
 	makedepends = yarn
 	depends = c-ares
-	depends = ffmpeg
 	depends = gtk3
 	depends = libevent
-	depends = libxslt
-	depends = minizip
 	depends = nss
-	depends = re2
-	depends = snappy
+	depends = libffi
 	depends = fontconfig
 	depends = woff2
-	depends = aom
 	depends = brotli
 	depends = libjpeg
 	depends = icu
@@ -51,54 +47,41 @@ pkgbase = electron-xdg
 	depends = minizip
 	depends = opus
 	depends = harfbuzz
-	depends = re2
-	depends = libavif
 	depends = jsoncpp
 	depends = libxslt
 	depends = libpng
 	depends = freetype2
 	optdepends = kde-cli-tools: file deletion support (kioclient5)
-	optdepends = libappindicator-gtk3: StatusNotifierItem support
 	optdepends = pipewire: WebRTC desktop sharing under Wayland
 	optdepends = qt5-base: enable Qt5 with --enable-features=AllowQt
 	optdepends = trash-cli: file deletion support (trash-put)
 	optdepends = xdg-utils: open URLs with desktop’s default (xdg-email, xdg-open)
-	provides = electron22
-	provides = electron
-	conflicts = electron22
-	conflicts = electron
 	options = !lto
-	source = git+https://github.com/electron/electron.git
+	source = git+https://github.com/electron/electron.git#tag=v25.6.0
 	source = git+https://chromium.googlesource.com/chromium/tools/depot_tools.git#branch=main
-	source = https://github.com/stha09/chromium-patches/releases/download/chromium-108-patchset-2/chromium-108-patchset-2.tar.xz
+	source = chromium-mirror::git+https://github.com/chromium/chromium.git#tag=
 	source = electron-launcher.sh
 	source = electron.desktop
 	source = default_app-icon.patch
 	source = jinja-python-3.10.patch
 	source = use-system-libraries-in-node.patch
 	source = std-vector-non-const.patch
-	source = re-fix-TFLite-build-error-on-linux-with-system-zlib.patch
-	source = chromium-icu72.patch
-	source = v8-enhance-Date-parser-to-take-Unicode-SPACE.patch
-	source = REVERT-roll-src-third_party-ffmpeg-m102.patch
-	source = REVERT-roll-src-third_party-ffmpeg-m106.patch
-	source = angle-wayland-include-protocol.patch
+	source = add-some-typename-s-that-are-required-in-C-17.patch
+	source = REVERT-disable-autoupgrading-debug-info.patch
+	source = random-fixes-for-gcc13.patch
 	source = xdg-basedir.patch
 	sha256sums = SKIP
 	sha256sums = SKIP
-	sha256sums = 40ef8af65e78901bb8554eddbbb5ebc55c0b8e7927f6ca51b2a353d1c7c50652
-	sha256sums = 77817939c9833f8dda74a8c75620c15747170551ffa6f14f7c5b4071599e8831
+	sha256sums = SKIP
+	sha256sums = b0ac3422a6ab04859b40d4d7c0fd5f703c893c9ec145c9894c468fbc0a4d457c
 	sha256sums = 4484200d90b76830b69eea3a471c103999a3ce86bb2c29e6c14c945bf4102bae
 	sha256sums = dd2d248831dd4944d385ebf008426e66efe61d6fdf66f8932c963a12167947b4
 	sha256sums = 55dbe71dbc1f3ab60bf1fa79f7aea7ef1fe76436b1d7df48728a1f8227d2134e
 	sha256sums = ff588a8a4fd2f79eb8a4f11cf1aa151298ffb895be566c57cc355d47f161f53f
 	sha256sums = 893bc04c7fceba2f0a7195ed48551d55f066bbc530ec934c89c55768e6f3949c
-	sha256sums = 9015b9d6d5b4c1e7248d6477a4b4b6bd6a3ebdc57225d2d8efcd79fc61790716
-	sha256sums = dabb5ab204b63be73d3c5c8b7c1fa74053105a285852ba3bbc4fb77646608572
-	sha256sums = b83406a881d66627757d9cbc05e345cbb2bd395a48b6d4c970e5e1cb3f6ed454
-	sha256sums = 30df59a9e2d95dcb720357ec4a83d9be51e59cc5551365da4c0073e68ccdec44
-	sha256sums = 4c12d31d020799d31355faa7d1fe2a5a807f7458e7f0c374adf55edb37032152
-	sha256sums = cd0d9d2a1d6a522d47c3c0891dabe4ad72eabbebc0fe5642b9e22efa3d5ee572
+	sha256sums = 621ed210d75d0e846192c1571bb30db988721224a41572c27769c0288d361c11
+	sha256sums = 1b782b0f6d4f645e4e0daa8a4852d63f0c972aa0473319216ff04613a0592a69
+	sha256sums = ba4dd0a25a4fc3267ed19ccb39f28b28176ca3f97f53a4e9f5e9215280040ea0
 	sha256sums = cd844867b5b2197ad097662fee32579a7091dfba1d46cb438c4c7e696690440a
 
-pkgname = electron-xdg
+pkgname = electron25-xdg

+ 41 - 63
PKGBUILD

@@ -2,11 +2,9 @@
 # Maintainer: Bruno Pagani <archange@archlinux.org>
 
 # Remember to handle https://bugs.archlinux.org/task/74324 on major upgrades
-_use_suffix=0
-pkgver=22.3.3
-_commit=a831d69dfdd74655e95f93130c286662e1ba343d
-_chromiumver=108.0.5359.215
-_gcc_patchset=2
+_use_suffix=1
+pkgver=25.6.0
+_chromiumver=
 # shellcheck disable=SC2034
 pkgrel=1
 
@@ -25,64 +23,56 @@ url='https://electronjs.org/'
 # shellcheck disable=SC2034
 license=('MIT' 'custom')
 # shellcheck disable=SC2034
-depends=('c-ares' 'ffmpeg' 'gtk3' 'libevent' 'libxslt' 'minizip' 'nss' 're2'
-         'snappy')
+depends=('c-ares' 'gtk3' 'libevent' 'nss' 'libffi')
 # shellcheck disable=SC2034
 makedepends=('clang' 'git' 'gn' 'gperf' 'harfbuzz-icu' 'http-parser'
-             'java-runtime-headless' 'jsoncpp' 'libnotify' 'lld' 'llvm' 'ninja'
-             'npm' 'pciutils' 'pipewire' 'python' 'python-httplib2'
-             'python-pyparsing' 'python-six' 'wget' 'yarn')
+             'qt5-base' 'java-runtime-headless' 'libnotify' 'lld' 'llvm'
+             'ninja' 'npm' 'pciutils' 'pipewire' 'python' 'python-httplib2'
+             'python-requests' 'python-pyparsing' 'python-six' 'wget' 'yarn')
 # shellcheck disable=SC2034
 optdepends=('kde-cli-tools: file deletion support (kioclient5)'
-            'libappindicator-gtk3: StatusNotifierItem support'
             'pipewire: WebRTC desktop sharing under Wayland'
             'qt5-base: enable Qt5 with --enable-features=AllowQt'
             'trash-cli: file deletion support (trash-put)'
             'xdg-utils: open URLs with desktop’s default (xdg-email, xdg-open)')
 if [[ ${_use_suffix} == 0 ]]; then
   # shellcheck disable=SC2034
-  conflicts=("electron${_major_ver}" "electron")
+  conflicts=("electron${_major_ver}")
   # shellcheck disable=SC2034
-  provides=("electron${_major_ver}" "electron")
-else
-  provides=("electron")
-  conflicts=("electron")
+  provides=("electron${_major_ver}")
+  replaces=("electron${_major_ver}")
 fi
 # shellcheck disable=SC2034
 options=('!lto') # Electron adds its own flags for ThinLTO
 # shellcheck disable=SC2034
-source=('git+https://github.com/electron/electron.git'
+source=("git+https://github.com/electron/electron.git#tag=v$pkgver"
         'git+https://chromium.googlesource.com/chromium/tools/depot_tools.git#branch=main'
-        "https://github.com/stha09/chromium-patches/releases/download/chromium-${_chromiumver%%.*}-patchset-${_gcc_patchset}/chromium-${_chromiumver%%.*}-patchset-${_gcc_patchset}.tar.xz"
+        "chromium-mirror::git+https://github.com/chromium/chromium.git#tag=$_chromiumver"
         "electron-launcher.sh"
         "electron.desktop"
         'default_app-icon.patch'
         'jinja-python-3.10.patch'
         'use-system-libraries-in-node.patch'
         'std-vector-non-const.patch'
-        're-fix-TFLite-build-error-on-linux-with-system-zlib.patch'
-        'chromium-icu72.patch'
-        'v8-enhance-Date-parser-to-take-Unicode-SPACE.patch'
-        'REVERT-roll-src-third_party-ffmpeg-m102.patch'
-        'REVERT-roll-src-third_party-ffmpeg-m106.patch'
-        'angle-wayland-include-protocol.patch'
+        'add-some-typename-s-that-are-required-in-C-17.patch'
+        'REVERT-disable-autoupgrading-debug-info.patch'
+        'random-fixes-for-gcc13.patch'
+
        )
 # shellcheck disable=SC2034
 sha256sums=('SKIP'
             'SKIP'
-            '40ef8af65e78901bb8554eddbbb5ebc55c0b8e7927f6ca51b2a353d1c7c50652'
-            '77817939c9833f8dda74a8c75620c15747170551ffa6f14f7c5b4071599e8831'
+            'SKIP'
+            'b0ac3422a6ab04859b40d4d7c0fd5f703c893c9ec145c9894c468fbc0a4d457c'
             '4484200d90b76830b69eea3a471c103999a3ce86bb2c29e6c14c945bf4102bae'
             'dd2d248831dd4944d385ebf008426e66efe61d6fdf66f8932c963a12167947b4'
             '55dbe71dbc1f3ab60bf1fa79f7aea7ef1fe76436b1d7df48728a1f8227d2134e'
             'ff588a8a4fd2f79eb8a4f11cf1aa151298ffb895be566c57cc355d47f161f53f'
             '893bc04c7fceba2f0a7195ed48551d55f066bbc530ec934c89c55768e6f3949c'
-            '9015b9d6d5b4c1e7248d6477a4b4b6bd6a3ebdc57225d2d8efcd79fc61790716'
-            'dabb5ab204b63be73d3c5c8b7c1fa74053105a285852ba3bbc4fb77646608572'
-            'b83406a881d66627757d9cbc05e345cbb2bd395a48b6d4c970e5e1cb3f6ed454'
-            '30df59a9e2d95dcb720357ec4a83d9be51e59cc5551365da4c0073e68ccdec44'
-            '4c12d31d020799d31355faa7d1fe2a5a807f7458e7f0c374adf55edb37032152'
-            'cd0d9d2a1d6a522d47c3c0891dabe4ad72eabbebc0fe5642b9e22efa3d5ee572')
+            '621ed210d75d0e846192c1571bb30db988721224a41572c27769c0288d361c11'
+            '1b782b0f6d4f645e4e0daa8a4852d63f0c972aa0473319216ff04613a0592a69'
+            'ba4dd0a25a4fc3267ed19ccb39f28b28176ca3f97f53a4e9f5e9215280040ea0')
+
 
 # Possible replacements are listed in build/linux/unbundle/replace_gn_files.py
 # Keys are the names in the above script; values are the dependencies in Arch
@@ -96,8 +86,8 @@ declare -gA _system_libs=(
   [harfbuzz-ng]=harfbuzz
   [icu]=icu
   [jsoncpp]=jsoncpp
-  [libaom]=aom
-  [libavif]=libavif
+  # [libaom]=aom
+  #[libavif]=libavif # https://github.com/AOMediaCodec/libavif/commit/4d2776a3
   [libdrm]=
   [libjpeg]=libjpeg
   [libpng]=libpng
@@ -106,11 +96,12 @@ declare -gA _system_libs=(
   [libxml]=libxml2
   [libxslt]=libxslt
   [opus]=opus
-  [re2]=re2
+  #[re2]=re2
   [snappy]=snappy
   [woff2]=woff2
   [zlib]=minizip
 )
+
 _unwanted_bundled_libs=(
   $(printf "%s\n" ${!_system_libs[@]} | sed 's/^libjpeg$/&_turbo/')
 )
@@ -132,11 +123,7 @@ prepare() {
     sed -i "s|@ELECTRON_NAME@|Electron|" electron.desktop
   fi
 
-  export PATH="${PATH}:${srcdir:?}/depot_tools"
-
-  echo "Fetching chromium..."
-  git clone --branch=${_chromiumver} --depth=1 \
-      https://chromium.googlesource.com/chromium/src.git
+  sed --in-place "/'chromium_version':/{n;s/'[0-9.]\+',/'${_chromiumver}',/}" "${srcdir}/electron/DEPS"
 
   cat >.gclient <<EOF
 solutions = [
@@ -156,8 +143,8 @@ EOF
   export PATH+=":$PWD/depot_tools" DEPOT_TOOLS_UPDATE=0
   export VPYTHON_BYPASS='manually managed python not supported by chrome operations'
 
-  echo "Fetching chromium..."
-  git clone -b ${_chromiumver} --depth=2 https://chromium.googlesource.com/chromium/src
+  echo "Linking chromium from sources..."
+  ln -s chromium-mirror src
 
   depot_tools/gclient.py sync -D \
       --nohooks \
@@ -200,27 +187,18 @@ EOF
   patch -p1 -i ../xdg-basedir.patch
 
   # Upstream fixes
-  patch -Np1 -i ../re-fix-TFLite-build-error-on-linux-with-system-zlib.patch
-  patch -Np1 -i ../chromium-icu72.patch
-  patch -Np1 -d v8 <../v8-enhance-Date-parser-to-take-Unicode-SPACE.patch
+  patch -Np1 -i "${srcdir}/add-some-typename-s-that-are-required-in-C-17.patch"
 
-  # Revert ffmpeg roll requiring new channel layout API support
-  # https://crbug.com/1325301
-  patch -Rp1 -i ../REVERT-roll-src-third_party-ffmpeg-m102.patch
-  # Revert switch from AVFrame::pkt_duration to AVFrame::duration
-  patch -Rp1 -i ../REVERT-roll-src-third_party-ffmpeg-m106.patch
+  # Revert addition of compiler flag that needs newer clang
+  patch -Rp1 -i "${srcdir}/REVERT-disable-autoupgrading-debug-info.patch"
 
-  # https://crbug.com/angleproject/7582
-  patch -Np0 -i ../angle-wayland-include-protocol.patch
-
-  # Fixes for building with libstdc++ instead of libc++
-  patch -Np1 -i ../patches/chromium-103-VirtualCursor-std-layout.patch
+  # GCC13 patches for chromium (https://github.com/archlinux/svntogit-packages/commit/470e5cbc7b58b4955664cdae386161d22c17d980)
+  patch -Np1 -i "${srcdir}/random-fixes-for-gcc13.patch"
 
   # Electron specific fixes
-  patch -d third_party/electron_node/tools/inspector_protocol/jinja2 \
-    -Np1 -i ../../../../../../jinja-python-3.10.patch
-  patch -Np1 -i ../use-system-libraries-in-node.patch
-  patch -Np1 -i ../default_app-icon.patch  # Icon from .desktop file
+  patch -Np1 -i "${srcdir}/jinja-python-3.10.patch" -d "third_party/electron_node/tools/inspector_protocol/jinja2"
+  patch -Np1 -i "${srcdir}/use-system-libraries-in-node.patch"
+  patch -Np1 -i "${srcdir}/default_app-icon.patch"  # Icon from .desktop file
 
   # Allow building against system libraries in official builds
   echo "Patching Chromium for using system libraries..."
@@ -289,13 +267,13 @@ build() {
 
   cd src || exit
   export CHROMIUM_BUILDTOOLS_PATH="${PWD}/buildtools"
-  GN_EXTRA_ARGS='
+   GN_EXTRA_ARGS='
     custom_toolchain = "//build/toolchain/linux/unbundle:default"
     host_toolchain = "//build/toolchain/linux/unbundle:default"
     clang_base_path = "/usr"
     clang_use_chrome_plugins = false
     symbol_level = 0 # sufficient for backtraces on x86(_64)
-    chrome_pgo_phase = 2
+    chrome_pgo_phase = 0
     treat_warnings_as_errors = false
     disable_fieldtrial_testing_config = true
     blink_enable_generated_code_formatting = false
@@ -305,11 +283,11 @@ build() {
     use_custom_libcxx = false
     use_gnome_keyring = false
     use_sysroot = false
-    use_system_libwayland = true
-    use_system_wayland_scanner = true
+    use_system_libffi = true
     icu_use_data_file = false
     is_component_ffmpeg = false
   '
+
   gn gen out/Release \
       --args="import(\"//electron/build/args/release.gn\") ${GN_EXTRA_ARGS}"
   ninja -C out/Release electron

+ 49 - 0
REVERT-disable-autoupgrading-debug-info.patch

@@ -0,0 +1,49 @@
+From 54969766fd2029c506befc46e9ce14d67c7ed02a Mon Sep 17 00:00:00 2001
+From: Arthur Eubanks <aeubanks@google.com>
+Date: Tue, 25 Apr 2023 03:05:19 +0000
+Subject: [PATCH] Reland [clang] Disable autoupgrading debug info in ThinLTO
+ builds
+
+ThinLTO reads bitcode many times and attempts to upgrade the debug info every time. This is expensive since it calls the verifier. We don't need this given all LLVM bitcode producers are from the same version of LLVM.
+
+For just the build step that runs ThinLTO and links official Chrome, measured 34T -> 32T instructions via perf stat.
+
+Reland disables adding flag for ChromeOS since that toolchain is too old to have this flag.
+
+Bug: 972449
+Change-Id: I44552dd6c9dc71683c002d0c885e78b2a4341659
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4470209
+Reviewed-by: Nico Weber <thakis@chromium.org>
+Commit-Queue: Arthur Eubanks <aeubanks@google.com>
+Cr-Commit-Position: refs/heads/main@{#1135007}
+---
+ build/config/compiler/BUILD.gn | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
+index 1c13bc80f0f..53db095c1b1 100644
+--- a/build/config/compiler/BUILD.gn
++++ b/build/config/compiler/BUILD.gn
+@@ -685,6 +685,7 @@ config("compiler") {
+         "/lldltocache:" +
+             rebase_path("$root_out_dir/thinlto-cache", root_build_dir),
+         "/lldltocachepolicy:$cache_policy",
++        "-mllvm:-disable-auto-upgrade-debug-info",
+       ]
+     } else {
+       ldflags += [ "-flto=thin" ]
+@@ -725,6 +726,14 @@ config("compiler") {
+       }
+ 
+       ldflags += [ "-Wl,-mllvm,-import-instr-limit=$import_instr_limit" ]
++
++      if (!is_chromeos) {
++        # TODO(https://crbug.com/972449): turn on for ChromeOS when that
++        # toolchain has this flag.
++        # We only use one version of LLVM within a build so there's no need to
++        # upgrade debug info, which can be expensive since it runs the verifier.
++        ldflags += [ "-Wl,-mllvm,-disable-auto-upgrade-debug-info" ]
++      }
+     }
+ 
+     # TODO(https://crbug.com/1211155): investigate why this isn't effective on

+ 0 - 333
REVERT-roll-src-third_party-ffmpeg-m102.patch

@@ -1,333 +0,0 @@
-From 6e554a30893150793c2638e3689cf208ffc8e375 Mon Sep 17 00:00:00 2001
-From: Dale Curtis <dalecurtis@chromium.org>
-Date: Sat, 2 Apr 2022 05:13:53 +0000
-Subject: [PATCH] Roll src/third_party/ffmpeg/ 574c39cce..32b2d1d526 (1125
- commits)
-
-https://chromium.googlesource.com/chromium/third_party/ffmpeg.git/+log/574c39cce323..32b2d1d526
-
-Created with:
-  roll-dep src/third_party/ffmpeg
-
-Fixed: 1293918
-Cq-Include-Trybots: luci.chromium.try:mac_chromium_asan_rel_ng,linux_chromium_asan_rel_ng,linux_chromium_chromeos_asan_rel_ng
-Change-Id: I41945d0f963e3d1f65940067bac22f63b68e37d2
-Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3565647
-Auto-Submit: Dale Curtis <dalecurtis@chromium.org>
-Reviewed-by: Dan Sanders <sandersd@chromium.org>
-Commit-Queue: Dale Curtis <dalecurtis@chromium.org>
-Cr-Commit-Position: refs/heads/main@{#988253}
----
- .../clear_key_cdm/ffmpeg_cdm_audio_decoder.cc | 29 ++++++++++---------
- media/ffmpeg/ffmpeg_common.cc                 | 11 +++----
- media/filters/audio_file_reader.cc            |  9 +++---
- media/filters/audio_file_reader_unittest.cc   |  6 ++--
- .../filters/audio_video_metadata_extractor.cc | 11 +++++--
- .../filters/ffmpeg_aac_bitstream_converter.cc |  7 +++--
- ...ffmpeg_aac_bitstream_converter_unittest.cc |  2 +-
- media/filters/ffmpeg_audio_decoder.cc         | 13 +++++----
- 8 files changed, 51 insertions(+), 37 deletions(-)
-
-diff --git a/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc b/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc
-index e4fc3f460e2..9b1ad9f7675 100644
---- a/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc
-+++ b/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc
-@@ -74,7 +74,7 @@ void CdmAudioDecoderConfigToAVCodecContext(
-       codec_context->sample_fmt = AV_SAMPLE_FMT_NONE;
-   }
- 
--  codec_context->channels = config.channel_count;
-+  codec_context->ch_layout.nb_channels = config.channel_count;
-   codec_context->sample_rate = config.samples_per_second;
- 
-   if (config.extra_data) {
-@@ -124,8 +124,8 @@ void CopySamples(cdm::AudioFormat cdm_format,
-     case cdm::kAudioFormatPlanarS16:
-     case cdm::kAudioFormatPlanarF32: {
-       const int decoded_size_per_channel =
--          decoded_audio_size / av_frame.channels;
--      for (int i = 0; i < av_frame.channels; ++i) {
-+          decoded_audio_size / av_frame.ch_layout.nb_channels;
-+      for (int i = 0; i < av_frame.ch_layout.nb_channels; ++i) {
-         memcpy(output_buffer, av_frame.extended_data[i],
-                decoded_size_per_channel);
-         output_buffer += decoded_size_per_channel;
-@@ -185,13 +185,14 @@ bool FFmpegCdmAudioDecoder::Initialize(
-   // Success!
-   decoding_loop_ = std::make_unique<FFmpegDecodingLoop>(codec_context_.get());
-   samples_per_second_ = config.samples_per_second;
--  bytes_per_frame_ = codec_context_->channels * config.bits_per_channel / 8;
-+  bytes_per_frame_ =
-+      codec_context_->ch_layout.nb_channels * config.bits_per_channel / 8;
-   output_timestamp_helper_ =
-       std::make_unique<AudioTimestampHelper>(config.samples_per_second);
-   is_initialized_ = true;
- 
-   // Store initial values to guard against midstream configuration changes.
--  channels_ = codec_context_->channels;
-+  channels_ = codec_context_->ch_layout.nb_channels;
-   av_sample_format_ = codec_context_->sample_fmt;
- 
-   return true;
-@@ -291,17 +292,19 @@ cdm::Status FFmpegCdmAudioDecoder::DecodeBuffer(
-   for (auto& frame : audio_frames) {
-     int decoded_audio_size = 0;
-     if (frame->sample_rate != samples_per_second_ ||
--        frame->channels != channels_ || frame->format != av_sample_format_) {
-+        frame->ch_layout.nb_channels != channels_ ||
-+        frame->format != av_sample_format_) {
-       DLOG(ERROR) << "Unsupported midstream configuration change!"
-                   << " Sample Rate: " << frame->sample_rate << " vs "
--                  << samples_per_second_ << ", Channels: " << frame->channels
--                  << " vs " << channels_ << ", Sample Format: " << frame->format
--                  << " vs " << av_sample_format_;
-+                  << samples_per_second_
-+                  << ", Channels: " << frame->ch_layout.nb_channels << " vs "
-+                  << channels_ << ", Sample Format: " << frame->format << " vs "
-+                  << av_sample_format_;
-       return cdm::kDecodeError;
-     }
- 
-     decoded_audio_size = av_samples_get_buffer_size(
--        nullptr, codec_context_->channels, frame->nb_samples,
-+        nullptr, codec_context_->ch_layout.nb_channels, frame->nb_samples,
-         codec_context_->sample_fmt, 1);
-     if (!decoded_audio_size)
-       continue;
-@@ -320,9 +323,9 @@ bool FFmpegCdmAudioDecoder::OnNewFrame(
-     size_t* total_size,
-     std::vector<std::unique_ptr<AVFrame, ScopedPtrAVFreeFrame>>* audio_frames,
-     AVFrame* frame) {
--  *total_size += av_samples_get_buffer_size(nullptr, codec_context_->channels,
--                                            frame->nb_samples,
--                                            codec_context_->sample_fmt, 1);
-+  *total_size += av_samples_get_buffer_size(
-+      nullptr, codec_context_->ch_layout.nb_channels, frame->nb_samples,
-+      codec_context_->sample_fmt, 1);
-   audio_frames->emplace_back(av_frame_clone(frame));
-   return true;
- }
-diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc
-index 87ca8969626..76f03d6608e 100644
---- a/media/ffmpeg/ffmpeg_common.cc
-+++ b/media/ffmpeg/ffmpeg_common.cc
-@@ -345,10 +345,11 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context,
-       codec_context->sample_fmt, codec_context->codec_id);
- 
-   ChannelLayout channel_layout =
--      codec_context->channels > 8
-+      codec_context->ch_layout.nb_channels > 8
-           ? CHANNEL_LAYOUT_DISCRETE
--          : ChannelLayoutToChromeChannelLayout(codec_context->channel_layout,
--                                               codec_context->channels);
-+          : ChannelLayoutToChromeChannelLayout(
-+                codec_context->ch_layout.u.mask,
-+                codec_context->ch_layout.nb_channels);
- 
-   int sample_rate = codec_context->sample_rate;
-   switch (codec) {
-@@ -401,7 +402,7 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context,
-                      extra_data, encryption_scheme, seek_preroll,
-                      codec_context->delay);
-   if (channel_layout == CHANNEL_LAYOUT_DISCRETE)
--    config->SetChannelsForDiscrete(codec_context->channels);
-+    config->SetChannelsForDiscrete(codec_context->ch_layout.nb_channels);
- 
- #if BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)
-   // These are bitstream formats unknown to ffmpeg, so they don't have
-@@ -470,7 +471,7 @@ void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config,
- 
-   // TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses
-   // said information to decode.
--  codec_context->channels = config.channels();
-+  codec_context->ch_layout.nb_channels = config.channels();
-   codec_context->sample_rate = config.samples_per_second();
- 
-   if (config.extra_data().empty()) {
-diff --git a/media/filters/audio_file_reader.cc b/media/filters/audio_file_reader.cc
-index 5f257bdfaa6..e1be5aa9a5b 100644
---- a/media/filters/audio_file_reader.cc
-+++ b/media/filters/audio_file_reader.cc
-@@ -113,14 +113,15 @@ bool AudioFileReader::OpenDecoder() {
- 
-   // Verify the channel layout is supported by Chrome.  Acts as a sanity check
-   // against invalid files.  See http://crbug.com/171962
--  if (ChannelLayoutToChromeChannelLayout(codec_context_->channel_layout,
--                                         codec_context_->channels) ==
-+  if (ChannelLayoutToChromeChannelLayout(
-+          codec_context_->ch_layout.u.mask,
-+          codec_context_->ch_layout.nb_channels) ==
-       CHANNEL_LAYOUT_UNSUPPORTED) {
-     return false;
-   }
- 
-   // Store initial values to guard against midstream configuration changes.
--  channels_ = codec_context_->channels;
-+  channels_ = codec_context_->ch_layout.nb_channels;
-   audio_codec_ = CodecIDToAudioCodec(codec_context_->codec_id);
-   sample_rate_ = codec_context_->sample_rate;
-   av_sample_format_ = codec_context_->sample_fmt;
-@@ -223,7 +224,7 @@ bool AudioFileReader::OnNewFrame(
-   if (frames_read < 0)
-     return false;
- 
--  const int channels = frame->channels;
-+  const int channels = frame->ch_layout.nb_channels;
-   if (frame->sample_rate != sample_rate_ || channels != channels_ ||
-       frame->format != av_sample_format_) {
-     DLOG(ERROR) << "Unsupported midstream configuration change!"
-diff --git a/media/filters/audio_file_reader_unittest.cc b/media/filters/audio_file_reader_unittest.cc
-index 2aba7927a31..1f45a50cace 100644
---- a/media/filters/audio_file_reader_unittest.cc
-+++ b/media/filters/audio_file_reader_unittest.cc
-@@ -121,11 +121,11 @@ class AudioFileReaderTest : public testing::Test {
-     EXPECT_FALSE(reader_->Open());
-   }
- 
--  void RunTestFailingDecode(const char* fn) {
-+  void RunTestFailingDecode(const char* fn, int expect_read = 0) {
-     Initialize(fn);
-     EXPECT_TRUE(reader_->Open());
-     std::vector<std::unique_ptr<AudioBus>> decoded_audio_packets;
--    EXPECT_EQ(reader_->Read(&decoded_audio_packets), 0);
-+    EXPECT_EQ(reader_->Read(&decoded_audio_packets), expect_read);
-   }
- 
-   void RunTestPartialDecode(const char* fn) {
-@@ -219,7 +219,7 @@ TEST_F(AudioFileReaderTest, AAC_ADTS) {
- }
- 
- TEST_F(AudioFileReaderTest, MidStreamConfigChangesFail) {
--  RunTestFailingDecode("midstream_config_change.mp3");
-+  RunTestFailingDecode("midstream_config_change.mp3", 42624);
- }
- #endif
- 
-diff --git a/media/filters/audio_video_metadata_extractor.cc b/media/filters/audio_video_metadata_extractor.cc
-index 185819eb936..69ff508c221 100644
---- a/media/filters/audio_video_metadata_extractor.cc
-+++ b/media/filters/audio_video_metadata_extractor.cc
-@@ -113,6 +113,15 @@ bool AudioVideoMetadataExtractor::Extract(DataSource* source,
-     if (!stream)
-       continue;
- 
-+    void* display_matrix =
-+        av_stream_get_side_data(stream, AV_PKT_DATA_DISPLAYMATRIX, nullptr);
-+    if (display_matrix) {
-+      rotation_ = VideoTransformation::FromFFmpegDisplayMatrix(
-+                      static_cast<int32_t*>(display_matrix))
-+                      .rotation;
-+      info.tags["rotate"] = base::NumberToString(rotation_);
-+    }
-+
-     // Extract dictionary from streams also. Needed for containers that attach
-     // metadata to contained streams instead the container itself, like OGG.
-     ExtractDictionary(stream->metadata, &info.tags);
-@@ -255,8 +264,6 @@ void AudioVideoMetadataExtractor::ExtractDictionary(AVDictionary* metadata,
-     if (raw_tags->find(tag->key) == raw_tags->end())
-       (*raw_tags)[tag->key] = tag->value;
- 
--    if (ExtractInt(tag, "rotate", &rotation_))
--      continue;
-     if (ExtractString(tag, "album", &album_))
-       continue;
-     if (ExtractString(tag, "artist", &artist_))
-diff --git a/media/filters/ffmpeg_aac_bitstream_converter.cc b/media/filters/ffmpeg_aac_bitstream_converter.cc
-index 6f231c85729..ca5e5fb927d 100644
---- a/media/filters/ffmpeg_aac_bitstream_converter.cc
-+++ b/media/filters/ffmpeg_aac_bitstream_converter.cc
-@@ -195,14 +195,15 @@ bool FFmpegAACBitstreamConverter::ConvertPacket(AVPacket* packet) {
-   if (!header_generated_ || codec_ != stream_codec_parameters_->codec_id ||
-       audio_profile_ != stream_codec_parameters_->profile ||
-       sample_rate_index_ != sample_rate_index ||
--      channel_configuration_ != stream_codec_parameters_->channels ||
-+      channel_configuration_ !=
-+          stream_codec_parameters_->ch_layout.nb_channels ||
-       frame_length_ != header_plus_packet_size) {
-     header_generated_ =
-         GenerateAdtsHeader(stream_codec_parameters_->codec_id,
-                            0,  // layer
-                            stream_codec_parameters_->profile, sample_rate_index,
-                            0,  // private stream
--                           stream_codec_parameters_->channels,
-+                           stream_codec_parameters_->ch_layout.nb_channels,
-                            0,  // originality
-                            0,  // home
-                            0,  // copyrighted_stream
-@@ -214,7 +215,7 @@ bool FFmpegAACBitstreamConverter::ConvertPacket(AVPacket* packet) {
-     codec_ = stream_codec_parameters_->codec_id;
-     audio_profile_ = stream_codec_parameters_->profile;
-     sample_rate_index_ = sample_rate_index;
--    channel_configuration_ = stream_codec_parameters_->channels;
-+    channel_configuration_ = stream_codec_parameters_->ch_layout.nb_channels;
-     frame_length_ = header_plus_packet_size;
-   }
- 
-diff --git a/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc b/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc
-index 1fd4c5ccd7d..f59bcd8fdaf 100644
---- a/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc
-+++ b/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc
-@@ -34,7 +34,7 @@ class FFmpegAACBitstreamConverterTest : public testing::Test {
-     memset(&test_parameters_, 0, sizeof(AVCodecParameters));
-     test_parameters_.codec_id = AV_CODEC_ID_AAC;
-     test_parameters_.profile = FF_PROFILE_AAC_MAIN;
--    test_parameters_.channels = 2;
-+    test_parameters_.ch_layout.nb_channels = 2;
-     test_parameters_.extradata = extradata_header_;
-     test_parameters_.extradata_size = sizeof(extradata_header_);
-   }
-diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc
-index 6a56c675f7d..4615fdeb3fb 100644
---- a/media/filters/ffmpeg_audio_decoder.cc
-+++ b/media/filters/ffmpeg_audio_decoder.cc
-@@ -28,7 +28,7 @@ namespace media {
- 
- // Return the number of channels from the data in |frame|.
- static inline int DetermineChannels(AVFrame* frame) {
--  return frame->channels;
-+  return frame->ch_layout.nb_channels;
- }
- 
- // Called by FFmpeg's allocation routine to allocate a buffer. Uses
-@@ -231,7 +231,7 @@ bool FFmpegAudioDecoder::OnNewFrame(const DecoderBuffer& buffer,
-   // Translate unsupported into discrete layouts for discrete configurations;
-   // ffmpeg does not have a labeled discrete configuration internally.
-   ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout(
--      codec_context_->channel_layout, codec_context_->channels);
-+      codec_context_->ch_layout.u.mask, codec_context_->ch_layout.nb_channels);
-   if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED &&
-       config_.channel_layout() == CHANNEL_LAYOUT_DISCRETE) {
-     channel_layout = CHANNEL_LAYOUT_DISCRETE;
-@@ -348,11 +348,11 @@ bool FFmpegAudioDecoder::ConfigureDecoder(const AudioDecoderConfig& config) {
-   // Success!
-   av_sample_format_ = codec_context_->sample_fmt;
- 
--  if (codec_context_->channels != config.channels()) {
-+  if (codec_context_->ch_layout.nb_channels != config.channels()) {
-     MEDIA_LOG(ERROR, media_log_)
-         << "Audio configuration specified " << config.channels()
-         << " channels, but FFmpeg thinks the file contains "
--        << codec_context_->channels << " channels";
-+        << codec_context_->ch_layout.nb_channels << " channels";
-     ReleaseFFmpegResources();
-     state_ = DecoderState::kUninitialized;
-     return false;
-@@ -403,7 +403,7 @@ int FFmpegAudioDecoder::GetAudioBuffer(struct AVCodecContext* s,
-   if (frame->nb_samples <= 0)
-     return AVERROR(EINVAL);
- 
--  if (s->channels != channels) {
-+  if (s->ch_layout.nb_channels != channels) {
-     DLOG(ERROR) << "AVCodecContext and AVFrame disagree on channel count.";
-     return AVERROR(EINVAL);
-   }
-@@ -436,7 +436,8 @@ int FFmpegAudioDecoder::GetAudioBuffer(struct AVCodecContext* s,
-   ChannelLayout channel_layout =
-       config_.channel_layout() == CHANNEL_LAYOUT_DISCRETE
-           ? CHANNEL_LAYOUT_DISCRETE
--          : ChannelLayoutToChromeChannelLayout(s->channel_layout, s->channels);
-+          : ChannelLayoutToChromeChannelLayout(s->ch_layout.u.mask,
-+                                               s->ch_layout.nb_channels);
- 
-   if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED) {
-     DLOG(ERROR) << "Unsupported channel layout.";

+ 0 - 55
REVERT-roll-src-third_party-ffmpeg-m106.patch

@@ -1,55 +0,0 @@
-From ded379824f5de39357b6b1894578101aba5cdf05 Mon Sep 17 00:00:00 2001
-From: Eugene Zemtsov <eugene@chromium.org>
-Date: Fri, 29 Jul 2022 04:41:04 +0000
-Subject: [PATCH] Roll src/third_party/ffmpeg/ 880df5ede..b71ecd02b (279
- commits)
-
-https://chromium.googlesource.com/chromium/third_party/ffmpeg.git/+log/880df5ede50a..b71ecd02b479
-
-$ git log 880df5ede..b71ecd02b --date=short --no-merges --format='%ad %ae %s'
-2022-07-27 eugene Roll for M106
-2022-07-25 andreas.rheinhardt avcodec/x86/pngdsp: Remove obsolete ff_add_bytes_l2_mmx()
-2022-07-22 andreas.rheinhardt avcodec/hevcdec: Output MD5-message in one piece
-2022-07-24 epirat07 configure: properly require libx264 if enabled
-2022-07-24 zane avformat/argo_cvg: expose loop/reverb/checksum via metadata
-(...)
-2022-05-03 leo.izen avcodec/libjxldec: properly tag output colorspace
-2022-06-25 ffmpeg avfilter/Makefile: always make colorspace.o
-2022-03-02 brad avutil/ppc/cpu: Use proper header for OpenBSD PPC CPU detection
-2022-06-24 jamrial avformat/http: include version.h
-2022-05-16 mbonda-at-nvidia.com AV1 VDPAU hwaccel Decode support
-
-Created with:
-  roll-dep src/third_party/ffmpeg
-
-ffmpeg usage fix:
- Switch from AVFrame::pkt_duration to AVFrame::duration,
- AVFrame::pkt_duration is deprecated
-
-Bug: 1344646
-Change-Id: Iaa3abf48ef81dae6d282bca8f0fa2a8dffeeba25
-Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3788638
-Reviewed-by: Will Cassella <cassew@chromium.org>
-Commit-Queue: Eugene Zemtsov <eugene@chromium.org>
-Cr-Commit-Position: refs/heads/main@{#1029623}
----
- media/filters/audio_file_reader.cc | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/media/filters/audio_file_reader.cc b/media/filters/audio_file_reader.cc
-index e1be5aa9a5b..951c003956f 100644
---- a/media/filters/audio_file_reader.cc
-+++ b/media/filters/audio_file_reader.cc
-@@ -243,10 +243,10 @@ bool AudioFileReader::OnNewFrame(
-   // silence from being output. In the case where we are also discarding some
-   // portion of the packet (as indicated by a negative pts), we further want to
-   // adjust the duration downward by however much exists before zero.
--  if (audio_codec_ == AudioCodec::kAAC && frame->pkt_duration) {
-+  if (audio_codec_ == AudioCodec::kAAC && frame->duration) {
-     const base::TimeDelta pkt_duration = ConvertFromTimeBase(
-         glue_->format_context()->streams[stream_index_]->time_base,
--        frame->pkt_duration + std::min(static_cast<int64_t>(0), frame->pts));
-+        frame->duration + std::min(static_cast<int64_t>(0), frame->pts));
-     const base::TimeDelta frame_duration =
-         base::Seconds(frames_read / static_cast<double>(sample_rate_));
- 

+ 45 - 0
add-some-typename-s-that-are-required-in-C-17.patch

@@ -0,0 +1,45 @@
+From 2914039316d4ed3f53c3393dc2ba48f637807689 Mon Sep 17 00:00:00 2001
+From: Peter Kasting <pkasting@chromium.org>
+Date: Fri, 12 May 2023 16:40:53 +0000
+Subject: [PATCH] Add some "typename"s that are required in C++17.
+
+Bug: 1444563
+Change-Id: I7801f5e82a40305c357eeda219678dda558f5752
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4526465
+Commit-Queue: Alan Screen <awscreen@chromium.org>
+Reviewed-by: Alan Screen <awscreen@chromium.org>
+Auto-Submit: Peter Kasting <pkasting@chromium.org>
+Commit-Queue: Peter Kasting <pkasting@chromium.org>
+Code-Coverage: Findit <findit-for-me@appspot.gserviceaccount.com>
+Cr-Commit-Position: refs/heads/main@{#1143319}
+---
+ chrome/browser/printing/print_backend_service_manager.cc | 2 +-
+ chrome/browser/printing/print_backend_service_manager.h  | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/chrome/browser/printing/print_backend_service_manager.cc b/chrome/browser/printing/print_backend_service_manager.cc
+index b5a4b525a2d..224369cd58c 100644
+--- a/chrome/browser/printing/print_backend_service_manager.cc
++++ b/chrome/browser/printing/print_backend_service_manager.cc
+@@ -1477,7 +1477,7 @@ template <class... T>
+ void PrintBackendServiceManager::RunSavedCallbacks(
+     RemoteSavedCallbacks<T...>& saved_callbacks,
+     const RemoteId& remote_id,
+-    std::remove_reference<T>::type... result) {
++    typename std::remove_reference<T>::type... result) {
+   auto found_callbacks_map = saved_callbacks.find(remote_id);
+   if (found_callbacks_map == saved_callbacks.end())
+     return;  // No callbacks to run.
+diff --git a/chrome/browser/printing/print_backend_service_manager.h b/chrome/browser/printing/print_backend_service_manager.h
+index 41788f42a95..6aa7479c1fd 100644
+--- a/chrome/browser/printing/print_backend_service_manager.h
++++ b/chrome/browser/printing/print_backend_service_manager.h
+@@ -588,7 +588,7 @@ class PrintBackendServiceManager {
+   template <class... T>
+   void RunSavedCallbacks(RemoteSavedCallbacks<T...>& saved_callbacks,
+                          const RemoteId& remote_id,
+-                         std::remove_reference<T>::type... result);
++                         typename std::remove_reference<T>::type... result);
+ 
+   // Test support for client ID management.
+   static void SetClientsForTesting(

+ 0 - 38
angle-wayland-include-protocol.patch

@@ -1,38 +0,0 @@
-diff -upr third_party/angle.orig/BUILD.gn third_party/angle/BUILD.gn
---- third_party/angle.orig/BUILD.gn	2022-08-17 19:38:11.000000000 +0000
-+++ third_party/angle/BUILD.gn	2022-08-18 11:04:09.061751111 +0000
-@@ -489,6 +489,12 @@ config("angle_vulkan_wayland_config") {
-   if (angle_enable_vulkan && angle_use_wayland &&
-       defined(vulkan_wayland_include_dirs)) {
-     include_dirs = vulkan_wayland_include_dirs
-+  } else if (angle_enable_vulkan && angle_use_wayland) {
-+    include_dirs = [
-+      "$wayland_gn_dir/src/src",
-+      "$wayland_gn_dir/include/src",
-+      "$wayland_gn_dir/include/protocol",
-+    ]
-   }
- }
- 
-@@ -1073,6 +1079,7 @@ if (angle_use_wayland) {
-     include_dirs = [
-       "$wayland_dir/egl",
-       "$wayland_dir/src",
-+      "$wayland_gn_dir/include/protocol",
-     ]
-   }
- 
-diff -upr third_party/angle.orig/src/third_party/volk/BUILD.gn third_party/angle/src/third_party/volk/BUILD.gn
---- third_party/angle.orig/src/third_party/volk/BUILD.gn	2022-08-17 19:38:12.000000000 +0000
-+++ third_party/angle/src/third_party/volk/BUILD.gn	2022-08-18 11:04:36.499828006 +0000
-@@ -21,6 +21,9 @@ source_set("volk") {
-   configs += [ "$angle_root:angle_no_cfi_icall" ]
-   public_deps = [ "$angle_vulkan_headers_dir:vulkan_headers" ]
-   if (angle_use_wayland) {
--    include_dirs = [ "$wayland_dir/src" ]
-+    include_dirs = [
-+      "$wayland_dir/src",
-+      "$wayland_gn_dir/include/protocol",
-+    ]
-   }
- }

+ 0 - 114
chromium-icu72.patch

@@ -1,114 +0,0 @@
-From 2c4d3c61aa33f3169e7923ea3433c71e3df0952f Mon Sep 17 00:00:00 2001
-From: Frank Tang <ftang@chromium.org>
-Date: Mon, 7 Nov 2022 22:08:05 +0000
-Subject: [PATCH 1/2] Prepare for ICU72 landing
-
-The date format may output U+202F Narrow SPACE between time
-and AM/PM. So switch to use UTF8 and not restrict to ASCII which
-will break when the output is not only ASCII.
-
-Bug: 1371208
-Change-Id: I05f9daadfba5c45d618f15ae23340da373f2f36a
-Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4007076
-Reviewed-by: Daniel Rubery <drubery@chromium.org>
-Commit-Queue: Frank Tang <ftang@chromium.org>
-Cr-Commit-Position: refs/heads/main@{#1068343}
-
-(cherry picked from commit ce2ffed84b95e2b7c068d6f066d86cd034212425)
----
- .../safe_browsing/content/browser/web_ui/safe_browsing_ui.cc    | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc b/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc
-index 92597a9d3a4..e6e7514a082 100644
---- a/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc
-+++ b/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc
-@@ -457,7 +457,7 @@ namespace {
- std::string UserReadableTimeFromMillisSinceEpoch(int64_t time_in_milliseconds) {
-   base::Time time =
-       base::Time::UnixEpoch() + base::Milliseconds(time_in_milliseconds);
--  return base::UTF16ToASCII(base::TimeFormatShortDateAndTime(time));
-+  return base::UTF16ToUTF8(base::TimeFormatShortDateAndTime(time));
- }
- 
- void AddStoreInfo(const DatabaseManagerInfo::DatabaseInfo::StoreInfo store_info,
-
-From 8ba9d96da703978655cddf07d58b0a15f0a43a10 Mon Sep 17 00:00:00 2001
-From: Frank Tang <ftang@chromium.org>
-Date: Tue, 8 Nov 2022 00:13:16 +0000
-Subject: [PATCH 2/2] Prepare the landing of ICU72/Unicode 15
-
-See
-https://www.unicode.org/emoji/charts-15.0/emoji-released.html
-https://www.unicode.org/charts/PDF/U1F680.pdf
-https://www.unicode.org/charts/PDF/U1FA70.pdf
-for the newly added emoji to
-Transport and Map Symbols
-Symbols and Pictographs Extended-A blocks.
-
-Update the kIsCJKIdeographOrSymbolRanges to Unicode 15
-Needed to avoid test breakage of
-CharacterTest.HammerEmojiVsCJKIdeographOrSymbol
-
-Bug: 1371208
-Change-Id: Ic7b319ba18f3aded46b252d8b484e3b1bc43eff4
-Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4007098
-Reviewed-by: Stephen Chenney <schenney@chromium.org>
-Commit-Queue: Frank Tang <ftang@chromium.org>
-Cr-Commit-Position: refs/heads/main@{#1068422}
-
-(cherry picked from commit d93a774bf6fac8ddaaa1041ea6ad2dd8e5ff4539)
----
- .../platform/text/character_property_data.h   | 24 +++++++++----------
- 1 file changed, 12 insertions(+), 12 deletions(-)
-
-diff --git a/third_party/blink/renderer/platform/text/character_property_data.h b/third_party/blink/renderer/platform/text/character_property_data.h
-index 9005c20a379..ee690563c28 100644
---- a/third_party/blink/renderer/platform/text/character_property_data.h
-+++ b/third_party/blink/renderer/platform/text/character_property_data.h
-@@ -107,7 +107,7 @@ static const UChar32 kIsCJKIdeographOrSymbolRanges[] = {
-     0x1F3FB, 0x1F3FF,
- 
-     // Transport
--    0x1F6DD, 0x1F6DF,
-+    0x1F6DC, 0x1F6DF,
- 
-     // Colored circles and squares for use with emoji.
-     0x1F7E0, 0x1F7EB,
-@@ -118,25 +118,25 @@ static const UChar32 kIsCJKIdeographOrSymbolRanges[] = {
-     0x1F900, 0x1F90F,
-     // ZIPPER-MOUTH FACE...SIGN OF THE HORNS
-     0x1F910, 0x1F918, 0x1F919, 0x1F97F, 0x1F980, 0x1F9BF, 0x1F9C0, 0x1F9FF,
--    // Clothing
--    0x1FA70, 0x1FA74,
--    // Medical symbols
--    0x1FA78, 0x1FA7C,
-+    // Clothing, heart and Medical symbols
-+    0x1FA70, 0x1FA7C,
-     // Toys and sport symbols
--    0x1FA80, 0x1FA86,
-+    0x1FA80, 0x1FA88,
-     // Miscellaneous objects
--    0x1FA90, 0x1FAAC,
-     // Animals and nature
--    0x1FAB0, 0x1FABA,
-+    0x1FA90, 0x1FABD,
-+    // Animal
-     // Body parts
-     // People
--    0x1FAC0, 0x1FAC5,
-+    0x1FABF, 0x1FAC5,
-+    // animal-mammal
-+    0x1FACE, 0x1FACF,
-     // Food and drink
--    0x1FAD0, 0x1FAD9,
-+    0x1FAD0, 0x1FADB,
-     // Face
--    0x1FAE0, 0x1FAE7,
-+    0x1FAE0, 0x1FAE8,
-     // Hand
--    0x1FAF0, 0x1FAF6,
-+    0x1FAF0, 0x1FAF8,
-     };
- 
- // https://html.spec.whatwg.org/C/#prod-potentialcustomelementname

+ 0 - 70
chromium-tflite-system-zlib.patch

@@ -1,70 +0,0 @@
---- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_extractor.cc
-+++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_extractor.cc
-@@ -21,8 +21,8 @@ limitations under the License.
- #include "absl/status/status.h"        // from @com_google_absl
- #include "absl/strings/str_format.h"   // from @com_google_absl
- #include "absl/strings/string_view.h"  // from @com_google_absl
--#include "contrib/minizip/ioapi.h"
--#include "contrib/minizip/unzip.h"
-+#include "third_party/zlib/contrib/minizip/ioapi.h"
-+#include "third_party/zlib/contrib/minizip/unzip.h"
- #include "flatbuffers/flatbuffers.h"  // from @flatbuffers
- #include "tensorflow/lite/schema/schema_generated.h"
- #include "tensorflow_lite_support/cc/common.h"
---- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_populator.cc
-+++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/metadata_populator.cc
-@@ -19,8 +19,8 @@ limitations under the License.
- #include <cstring>
- #include <functional>
- 
--#include "contrib/minizip/ioapi.h"
--#include "contrib/minizip/zip.h"
-+#include "third_party/zlib/contrib/minizip/ioapi.h"
-+#include "third_party/zlib/contrib/minizip/zip.h"
- #include "flatbuffers/flatbuffers.h"  // from @flatbuffers
- #include "tensorflow/lite/schema/schema_generated.h"
- #include "tensorflow_lite_support/cc/common.h"
---- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc
-+++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc
-@@ -19,7 +19,7 @@ limitations under the License.
- #include <cstdio>
- 
- #include "absl/strings/string_view.h"  // from @com_google_absl
--#include "contrib/minizip/ioapi.h"
-+#include "third_party/zlib/contrib/minizip/ioapi.h"
- 
- namespace tflite {
- namespace metadata {
---- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h
-+++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.h
-@@ -19,7 +19,7 @@ limitations under the License.
- #include <cstdlib>
- 
- #include "absl/strings/string_view.h"  // from @com_google_absl
--#include "contrib/minizip/ioapi.h"
-+#include "third_party/zlib/contrib/minizip/ioapi.h"
- 
- namespace tflite {
- namespace metadata {
---- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc
-+++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.cc
-@@ -19,7 +19,7 @@ limitations under the License.
- #include <cstdio>
- 
- #include "absl/strings/string_view.h"  // from @com_google_absl
--#include "contrib/minizip/ioapi.h"
-+#include "third_party/zlib/contrib/minizip/ioapi.h"
- 
- namespace tflite {
- namespace metadata {
---- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h
-+++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_writable_mem_file.h
-@@ -19,7 +19,7 @@ limitations under the License.
- #include <cstdlib>
- 
- #include "absl/strings/string_view.h"  // from @com_google_absl
--#include "contrib/minizip/ioapi.h"
-+#include "third_party/zlib/contrib/minizip/ioapi.h"
- 
- namespace tflite {
- namespace metadata {

+ 1 - 1
electron-launcher.sh

@@ -12,7 +12,7 @@ if [[ -f "${flags_file}" ]]; then
 fi
 
 for line in "${MAPFILE[@]}"; do
-    if [[ ! "${line}" =~ ^[[:space:]]*#.* ]]; then
+    if [[ ! "${line}" =~ ^[[:space:]]*#.* ]] && [[ -n "${line}" ]]; then
         flags+=("${line}")
     fi
 done

+ 75 - 0
random-fixes-for-gcc13.patch

@@ -0,0 +1,75 @@
+diff -upr chromium-113.0.5672.63.orig/gin/time_clamper.h chromium-113.0.5672.63/gin/time_clamper.h
+--- chromium-113.0.5672.63.orig/gin/time_clamper.h	2023-04-26 21:43:06.707860200 +0000
++++ chromium-113.0.5672.63/gin/time_clamper.h	2023-05-09 00:14:09.744221610 +0000
+@@ -6,6 +6,7 @@
+ #define GIN_TIME_CLAMPER_H_
+ 
+ #include <algorithm>
++#include <cstdlib>
+ 
+ #include "base/rand_util.h"
+ #include "base/time/time.h"
+@@ -48,7 +49,7 @@ class GIN_EXPORT TimeClamper {
+     const int64_t micros = now_micros % 1000;
+     // abs() is necessary for devices with times before unix-epoch (most likely
+     // configured incorrectly).
+-    if (abs(micros) + kResolutionMicros < 1000) {
++    if (std::abs(micros) + kResolutionMicros < 1000) {
+       return now_micros / 1000;
+     }
+     return ClampTimeResolution(now_micros) / 1000;
+diff -upr chromium-113.0.5672.63.orig/third_party/maldoca/src/maldoca/ole/header.h chromium-113.0.5672.63/third_party/maldoca/src/maldoca/ole/header.h
+--- chromium-113.0.5672.63.orig/third_party/maldoca/src/maldoca/ole/header.h	2023-04-26 21:43:58.708449600 +0000
++++ chromium-113.0.5672.63/third_party/maldoca/src/maldoca/ole/header.h	2023-05-09 00:14:09.744221610 +0000
+@@ -43,6 +43,7 @@
+ #ifndef MALDOCA_OLE_HEADER_H_
+ #define MALDOCA_OLE_HEADER_H_
+ 
++#include <cstdint>
+ #include "absl/strings/string_view.h"
+ 
+ namespace maldoca {
+diff -upr chromium-113.0.5672.63.orig/third_party/ruy/src/ruy/profiler/instrumentation.h chromium-113.0.5672.63/third_party/ruy/src/ruy/profiler/instrumentation.h
+--- chromium-113.0.5672.63.orig/third_party/ruy/src/ruy/profiler/instrumentation.h	2023-04-26 21:47:36.527673200 +0000
++++ chromium-113.0.5672.63/third_party/ruy/src/ruy/profiler/instrumentation.h	2023-05-09 00:14:09.744221610 +0000
+@@ -19,6 +19,7 @@ limitations under the License.
+ #ifdef RUY_PROFILER
+ #include <cstdio>
+ #include <mutex>
++#include <string>
+ #include <vector>
+ #endif
+ 
+diff -upr chromium-113.0.5672.63.orig/third_party/tflite/src/tensorflow/lite/kernels/internal/spectrogram.cc chromium-113.0.5672.63/third_party/tflite/src/tensorflow/lite/kernels/internal/spectrogram.cc
+--- chromium-113.0.5672.63.orig/third_party/tflite/src/tensorflow/lite/kernels/internal/spectrogram.cc	2023-04-26 21:47:39.531938300 +0000
++++ chromium-113.0.5672.63/third_party/tflite/src/tensorflow/lite/kernels/internal/spectrogram.cc	2023-05-09 00:14:09.747555160 +0000
+@@ -17,6 +17,7 @@ limitations under the License.
+ 
+ #include <assert.h>
+ #include <math.h>
++#include <stdint.h>
+ 
+ #include "third_party/fft2d/fft.h"
+ 
+diff -upr chromium-113.0.5672.63.orig/third_party/vulkan-deps/vulkan-validation-layers/src/layers/external/vma/vk_mem_alloc.h chromium-113.0.5672.63/third_party/vulkan-deps/vulkan-validation-layers/src/layers/external/vma/vk_mem_alloc.h
+--- chromium-113.0.5672.63.orig/third_party/vulkan-deps/vulkan-validation-layers/src/layers/external/vma/vk_mem_alloc.h	2023-04-26 21:47:38.323831800 +0000
++++ chromium-113.0.5672.63/third_party/vulkan-deps/vulkan-validation-layers/src/layers/external/vma/vk_mem_alloc.h	2023-05-09 00:14:09.757555808 +0000
+@@ -2579,6 +2579,7 @@ VMA_CALL_PRE void VMA_CALL_POST vmaFreeS
+ #undef VMA_IMPLEMENTATION
+ 
+ #include <cstdint>
++#include <cstdio>
+ #include <cstdlib>
+ #include <cstring>
+ #include <utility>
+diff -upr chromium-113.0.5672.63.orig/third_party/vulkan_memory_allocator/include/vk_mem_alloc.h chromium-113.0.5672.63/third_party/vulkan_memory_allocator/include/vk_mem_alloc.h
+--- chromium-113.0.5672.63.orig/third_party/vulkan_memory_allocator/include/vk_mem_alloc.h	2023-04-26 21:47:36.679686500 +0000
++++ chromium-113.0.5672.63/third_party/vulkan_memory_allocator/include/vk_mem_alloc.h	2023-05-09 00:14:41.046248921 +0000
+@@ -2389,6 +2389,7 @@ VMA_CALL_PRE void VMA_CALL_POST vmaFreeV
+ #undef VMA_IMPLEMENTATION
+ 
+ #include <cstdint>
++#include <cstdio>
+ #include <cstdlib>
+ #include <cstring>
+ #include <utility>

+ 0 - 41
re-fix-TFLite-build-error-on-linux-with-system-zlib.patch

@@ -1,41 +0,0 @@
-From dda01a706453ded8c01c41775707cb5ef4e316f8 Mon Sep 17 00:00:00 2001
-From: Andres Salomon <dilinger@queued.net>
-Date: Tue, 25 Oct 2022 21:11:46 +0000
-Subject: [PATCH] Re-fix TFLite build error on linux when using the system zlib
-
-In commit ae0f9adb7e14c0d19ca695ef6ad40b321a8cb64c, I fixed some build
-errors related to minizip patch inclusion in TFLite. However, after that
-when TFLite Support was rolled to HEAD, a small part of that patch got
-dropped. The result is the following build error with 107.0.5304.62:
-
-../../third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc:22:10: fatal error: 'contrib/minizip/ioapi.h' file not found
-         ^~~~~~~~~~~~~~~~~~~~~~~~~
-1 error generated.
-
-This commit re-adds the lost fix.
-
-R=junzou@chromium.org
-
-Change-Id: Ie96c3571894b5100a1e2a2771da29699eff0beb3
-Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3972087
-Reviewed-by: Robert Ogden <robertogden@chromium.org>
-Commit-Queue: Robert Ogden <robertogden@chromium.org>
-Auto-Submit: Andres Salomon <dilinger@queued.net>
-Cr-Commit-Position: refs/heads/main@{#1063478}
----
- .../metadata/cc/utils/zip_readonly_mem_file.cc                  | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc
-index 392b6b411fe..525ae4a2b45 100644
---- a/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc
-+++ b/third_party/tflite_support/src/tensorflow_lite_support/metadata/cc/utils/zip_readonly_mem_file.cc
-@@ -19,7 +19,7 @@ limitations under the License.
- #include <cstdio>
- 
- #include "absl/strings/string_view.h"  // from @com_google_absl
--#include "contrib/minizip/ioapi.h"
-+#include "third_party/zlib/contrib/minizip/ioapi.h"
- 
- namespace tflite {
- namespace metadata {

+ 0 - 18
remove-no-opaque-pointers-flag.patch

@@ -1,18 +0,0 @@
---- chromium-104.0.5112.57/build/config/compiler/BUILD.gn.orig	2022-07-26 08:11:54.192788877 +0000
-+++ chromium-104.0.5112.57/build/config/compiler/BUILD.gn	2022-07-26 08:12:10.019328155 +0000
-@@ -1540,15 +1540,6 @@ config("default_warnings") {
-         cflags += [ "-Wno-unqualified-std-cast-call" ]
-       }
- 
--      if (!is_nacl && !(is_chromeos ||
--                        default_toolchain == "//build/toolchain/cros:target")) {
--        # TODO(https://crbug.com/1322823): Remove flags once potential miscompile is investigated.
--        cflags += [
--          "-Xclang",
--          "-no-opaque-pointers",
--        ]
--      }
--
-       if (is_fuchsia) {
-         # TODO(https://bugs.chromium.org/p/fuchsia/issues/detail?id=77383)
-         cflags += [ "-Wno-deprecated-copy" ]

+ 0 - 333
roll-src-third_party-ffmpeg.patch

@@ -1,333 +0,0 @@
-From 6e554a30893150793c2638e3689cf208ffc8e375 Mon Sep 17 00:00:00 2001
-From: Dale Curtis <dalecurtis@chromium.org>
-Date: Sat, 2 Apr 2022 05:13:53 +0000
-Subject: [PATCH] Roll src/third_party/ffmpeg/ 574c39cce..32b2d1d526 (1125
- commits)
-
-https://chromium.googlesource.com/chromium/third_party/ffmpeg.git/+log/574c39cce323..32b2d1d526
-
-Created with:
-  roll-dep src/third_party/ffmpeg
-
-Fixed: 1293918
-Cq-Include-Trybots: luci.chromium.try:mac_chromium_asan_rel_ng,linux_chromium_asan_rel_ng,linux_chromium_chromeos_asan_rel_ng
-Change-Id: I41945d0f963e3d1f65940067bac22f63b68e37d2
-Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3565647
-Auto-Submit: Dale Curtis <dalecurtis@chromium.org>
-Reviewed-by: Dan Sanders <sandersd@chromium.org>
-Commit-Queue: Dale Curtis <dalecurtis@chromium.org>
-Cr-Commit-Position: refs/heads/main@{#988253}
----
- .../clear_key_cdm/ffmpeg_cdm_audio_decoder.cc | 29 ++++++++++---------
- media/ffmpeg/ffmpeg_common.cc                 | 11 +++----
- media/filters/audio_file_reader.cc            |  9 +++---
- media/filters/audio_file_reader_unittest.cc   |  6 ++--
- .../filters/audio_video_metadata_extractor.cc | 11 +++++--
- .../filters/ffmpeg_aac_bitstream_converter.cc |  7 +++--
- ...ffmpeg_aac_bitstream_converter_unittest.cc |  2 +-
- media/filters/ffmpeg_audio_decoder.cc         | 13 +++++----
- 8 files changed, 51 insertions(+), 37 deletions(-)
-
-diff --git a/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc b/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc
-index e4fc3f460e2..9b1ad9f7675 100644
---- a/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc
-+++ b/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc
-@@ -74,7 +74,7 @@ void CdmAudioDecoderConfigToAVCodecContext(
-       codec_context->sample_fmt = AV_SAMPLE_FMT_NONE;
-   }
- 
--  codec_context->channels = config.channel_count;
-+  codec_context->ch_layout.nb_channels = config.channel_count;
-   codec_context->sample_rate = config.samples_per_second;
- 
-   if (config.extra_data) {
-@@ -124,8 +124,8 @@ void CopySamples(cdm::AudioFormat cdm_format,
-     case cdm::kAudioFormatPlanarS16:
-     case cdm::kAudioFormatPlanarF32: {
-       const int decoded_size_per_channel =
--          decoded_audio_size / av_frame.channels;
--      for (int i = 0; i < av_frame.channels; ++i) {
-+          decoded_audio_size / av_frame.ch_layout.nb_channels;
-+      for (int i = 0; i < av_frame.ch_layout.nb_channels; ++i) {
-         memcpy(output_buffer, av_frame.extended_data[i],
-                decoded_size_per_channel);
-         output_buffer += decoded_size_per_channel;
-@@ -185,13 +185,14 @@ bool FFmpegCdmAudioDecoder::Initialize(
-   // Success!
-   decoding_loop_ = std::make_unique<FFmpegDecodingLoop>(codec_context_.get());
-   samples_per_second_ = config.samples_per_second;
--  bytes_per_frame_ = codec_context_->channels * config.bits_per_channel / 8;
-+  bytes_per_frame_ =
-+      codec_context_->ch_layout.nb_channels * config.bits_per_channel / 8;
-   output_timestamp_helper_ =
-       std::make_unique<AudioTimestampHelper>(config.samples_per_second);
-   is_initialized_ = true;
- 
-   // Store initial values to guard against midstream configuration changes.
--  channels_ = codec_context_->channels;
-+  channels_ = codec_context_->ch_layout.nb_channels;
-   av_sample_format_ = codec_context_->sample_fmt;
- 
-   return true;
-@@ -291,17 +292,19 @@ cdm::Status FFmpegCdmAudioDecoder::DecodeBuffer(
-   for (auto& frame : audio_frames) {
-     int decoded_audio_size = 0;
-     if (frame->sample_rate != samples_per_second_ ||
--        frame->channels != channels_ || frame->format != av_sample_format_) {
-+        frame->ch_layout.nb_channels != channels_ ||
-+        frame->format != av_sample_format_) {
-       DLOG(ERROR) << "Unsupported midstream configuration change!"
-                   << " Sample Rate: " << frame->sample_rate << " vs "
--                  << samples_per_second_ << ", Channels: " << frame->channels
--                  << " vs " << channels_ << ", Sample Format: " << frame->format
--                  << " vs " << av_sample_format_;
-+                  << samples_per_second_
-+                  << ", Channels: " << frame->ch_layout.nb_channels << " vs "
-+                  << channels_ << ", Sample Format: " << frame->format << " vs "
-+                  << av_sample_format_;
-       return cdm::kDecodeError;
-     }
- 
-     decoded_audio_size = av_samples_get_buffer_size(
--        nullptr, codec_context_->channels, frame->nb_samples,
-+        nullptr, codec_context_->ch_layout.nb_channels, frame->nb_samples,
-         codec_context_->sample_fmt, 1);
-     if (!decoded_audio_size)
-       continue;
-@@ -320,9 +323,9 @@ bool FFmpegCdmAudioDecoder::OnNewFrame(
-     size_t* total_size,
-     std::vector<std::unique_ptr<AVFrame, ScopedPtrAVFreeFrame>>* audio_frames,
-     AVFrame* frame) {
--  *total_size += av_samples_get_buffer_size(nullptr, codec_context_->channels,
--                                            frame->nb_samples,
--                                            codec_context_->sample_fmt, 1);
-+  *total_size += av_samples_get_buffer_size(
-+      nullptr, codec_context_->ch_layout.nb_channels, frame->nb_samples,
-+      codec_context_->sample_fmt, 1);
-   audio_frames->emplace_back(av_frame_clone(frame));
-   return true;
- }
-diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc
-index 87ca8969626..76f03d6608e 100644
---- a/media/ffmpeg/ffmpeg_common.cc
-+++ b/media/ffmpeg/ffmpeg_common.cc
-@@ -345,10 +345,11 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context,
-       codec_context->sample_fmt, codec_context->codec_id);
- 
-   ChannelLayout channel_layout =
--      codec_context->channels > 8
-+      codec_context->ch_layout.nb_channels > 8
-           ? CHANNEL_LAYOUT_DISCRETE
--          : ChannelLayoutToChromeChannelLayout(codec_context->channel_layout,
--                                               codec_context->channels);
-+          : ChannelLayoutToChromeChannelLayout(
-+                codec_context->ch_layout.u.mask,
-+                codec_context->ch_layout.nb_channels);
- 
-   int sample_rate = codec_context->sample_rate;
-   switch (codec) {
-@@ -401,7 +402,7 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context,
-                      extra_data, encryption_scheme, seek_preroll,
-                      codec_context->delay);
-   if (channel_layout == CHANNEL_LAYOUT_DISCRETE)
--    config->SetChannelsForDiscrete(codec_context->channels);
-+    config->SetChannelsForDiscrete(codec_context->ch_layout.nb_channels);
- 
- #if BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)
-   // These are bitstream formats unknown to ffmpeg, so they don't have
-@@ -470,7 +471,7 @@ void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config,
- 
-   // TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses
-   // said information to decode.
--  codec_context->channels = config.channels();
-+  codec_context->ch_layout.nb_channels = config.channels();
-   codec_context->sample_rate = config.samples_per_second();
- 
-   if (config.extra_data().empty()) {
-diff --git a/media/filters/audio_file_reader.cc b/media/filters/audio_file_reader.cc
-index 5f257bdfaa6..e1be5aa9a5b 100644
---- a/media/filters/audio_file_reader.cc
-+++ b/media/filters/audio_file_reader.cc
-@@ -113,14 +113,15 @@ bool AudioFileReader::OpenDecoder() {
- 
-   // Verify the channel layout is supported by Chrome.  Acts as a sanity check
-   // against invalid files.  See http://crbug.com/171962
--  if (ChannelLayoutToChromeChannelLayout(codec_context_->channel_layout,
--                                         codec_context_->channels) ==
-+  if (ChannelLayoutToChromeChannelLayout(
-+          codec_context_->ch_layout.u.mask,
-+          codec_context_->ch_layout.nb_channels) ==
-       CHANNEL_LAYOUT_UNSUPPORTED) {
-     return false;
-   }
- 
-   // Store initial values to guard against midstream configuration changes.
--  channels_ = codec_context_->channels;
-+  channels_ = codec_context_->ch_layout.nb_channels;
-   audio_codec_ = CodecIDToAudioCodec(codec_context_->codec_id);
-   sample_rate_ = codec_context_->sample_rate;
-   av_sample_format_ = codec_context_->sample_fmt;
-@@ -223,7 +224,7 @@ bool AudioFileReader::OnNewFrame(
-   if (frames_read < 0)
-     return false;
- 
--  const int channels = frame->channels;
-+  const int channels = frame->ch_layout.nb_channels;
-   if (frame->sample_rate != sample_rate_ || channels != channels_ ||
-       frame->format != av_sample_format_) {
-     DLOG(ERROR) << "Unsupported midstream configuration change!"
-diff --git a/media/filters/audio_file_reader_unittest.cc b/media/filters/audio_file_reader_unittest.cc
-index 2aba7927a31..1f45a50cace 100644
---- a/media/filters/audio_file_reader_unittest.cc
-+++ b/media/filters/audio_file_reader_unittest.cc
-@@ -121,11 +121,11 @@ class AudioFileReaderTest : public testing::Test {
-     EXPECT_FALSE(reader_->Open());
-   }
- 
--  void RunTestFailingDecode(const char* fn) {
-+  void RunTestFailingDecode(const char* fn, int expect_read = 0) {
-     Initialize(fn);
-     EXPECT_TRUE(reader_->Open());
-     std::vector<std::unique_ptr<AudioBus>> decoded_audio_packets;
--    EXPECT_EQ(reader_->Read(&decoded_audio_packets), 0);
-+    EXPECT_EQ(reader_->Read(&decoded_audio_packets), expect_read);
-   }
- 
-   void RunTestPartialDecode(const char* fn) {
-@@ -219,7 +219,7 @@ TEST_F(AudioFileReaderTest, AAC_ADTS) {
- }
- 
- TEST_F(AudioFileReaderTest, MidStreamConfigChangesFail) {
--  RunTestFailingDecode("midstream_config_change.mp3");
-+  RunTestFailingDecode("midstream_config_change.mp3", 42624);
- }
- #endif
- 
-diff --git a/media/filters/audio_video_metadata_extractor.cc b/media/filters/audio_video_metadata_extractor.cc
-index 185819eb936..69ff508c221 100644
---- a/media/filters/audio_video_metadata_extractor.cc
-+++ b/media/filters/audio_video_metadata_extractor.cc
-@@ -113,6 +113,15 @@ bool AudioVideoMetadataExtractor::Extract(DataSource* source,
-     if (!stream)
-       continue;
- 
-+    void* display_matrix =
-+        av_stream_get_side_data(stream, AV_PKT_DATA_DISPLAYMATRIX, nullptr);
-+    if (display_matrix) {
-+      rotation_ = VideoTransformation::FromFFmpegDisplayMatrix(
-+                      static_cast<int32_t*>(display_matrix))
-+                      .rotation;
-+      info.tags["rotate"] = base::NumberToString(rotation_);
-+    }
-+
-     // Extract dictionary from streams also. Needed for containers that attach
-     // metadata to contained streams instead the container itself, like OGG.
-     ExtractDictionary(stream->metadata, &info.tags);
-@@ -255,8 +264,6 @@ void AudioVideoMetadataExtractor::ExtractDictionary(AVDictionary* metadata,
-     if (raw_tags->find(tag->key) == raw_tags->end())
-       (*raw_tags)[tag->key] = tag->value;
- 
--    if (ExtractInt(tag, "rotate", &rotation_))
--      continue;
-     if (ExtractString(tag, "album", &album_))
-       continue;
-     if (ExtractString(tag, "artist", &artist_))
-diff --git a/media/filters/ffmpeg_aac_bitstream_converter.cc b/media/filters/ffmpeg_aac_bitstream_converter.cc
-index 6f231c85729..ca5e5fb927d 100644
---- a/media/filters/ffmpeg_aac_bitstream_converter.cc
-+++ b/media/filters/ffmpeg_aac_bitstream_converter.cc
-@@ -195,14 +195,15 @@ bool FFmpegAACBitstreamConverter::ConvertPacket(AVPacket* packet) {
-   if (!header_generated_ || codec_ != stream_codec_parameters_->codec_id ||
-       audio_profile_ != stream_codec_parameters_->profile ||
-       sample_rate_index_ != sample_rate_index ||
--      channel_configuration_ != stream_codec_parameters_->channels ||
-+      channel_configuration_ !=
-+          stream_codec_parameters_->ch_layout.nb_channels ||
-       frame_length_ != header_plus_packet_size) {
-     header_generated_ =
-         GenerateAdtsHeader(stream_codec_parameters_->codec_id,
-                            0,  // layer
-                            stream_codec_parameters_->profile, sample_rate_index,
-                            0,  // private stream
--                           stream_codec_parameters_->channels,
-+                           stream_codec_parameters_->ch_layout.nb_channels,
-                            0,  // originality
-                            0,  // home
-                            0,  // copyrighted_stream
-@@ -214,7 +215,7 @@ bool FFmpegAACBitstreamConverter::ConvertPacket(AVPacket* packet) {
-     codec_ = stream_codec_parameters_->codec_id;
-     audio_profile_ = stream_codec_parameters_->profile;
-     sample_rate_index_ = sample_rate_index;
--    channel_configuration_ = stream_codec_parameters_->channels;
-+    channel_configuration_ = stream_codec_parameters_->ch_layout.nb_channels;
-     frame_length_ = header_plus_packet_size;
-   }
- 
-diff --git a/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc b/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc
-index 1fd4c5ccd7d..f59bcd8fdaf 100644
---- a/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc
-+++ b/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc
-@@ -34,7 +34,7 @@ class FFmpegAACBitstreamConverterTest : public testing::Test {
-     memset(&test_parameters_, 0, sizeof(AVCodecParameters));
-     test_parameters_.codec_id = AV_CODEC_ID_AAC;
-     test_parameters_.profile = FF_PROFILE_AAC_MAIN;
--    test_parameters_.channels = 2;
-+    test_parameters_.ch_layout.nb_channels = 2;
-     test_parameters_.extradata = extradata_header_;
-     test_parameters_.extradata_size = sizeof(extradata_header_);
-   }
-diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc
-index 6a56c675f7d..4615fdeb3fb 100644
---- a/media/filters/ffmpeg_audio_decoder.cc
-+++ b/media/filters/ffmpeg_audio_decoder.cc
-@@ -28,7 +28,7 @@ namespace media {
- 
- // Return the number of channels from the data in |frame|.
- static inline int DetermineChannels(AVFrame* frame) {
--  return frame->channels;
-+  return frame->ch_layout.nb_channels;
- }
- 
- // Called by FFmpeg's allocation routine to allocate a buffer. Uses
-@@ -231,7 +231,7 @@ bool FFmpegAudioDecoder::OnNewFrame(const DecoderBuffer& buffer,
-   // Translate unsupported into discrete layouts for discrete configurations;
-   // ffmpeg does not have a labeled discrete configuration internally.
-   ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout(
--      codec_context_->channel_layout, codec_context_->channels);
-+      codec_context_->ch_layout.u.mask, codec_context_->ch_layout.nb_channels);
-   if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED &&
-       config_.channel_layout() == CHANNEL_LAYOUT_DISCRETE) {
-     channel_layout = CHANNEL_LAYOUT_DISCRETE;
-@@ -348,11 +348,11 @@ bool FFmpegAudioDecoder::ConfigureDecoder(const AudioDecoderConfig& config) {
-   // Success!
-   av_sample_format_ = codec_context_->sample_fmt;
- 
--  if (codec_context_->channels != config.channels()) {
-+  if (codec_context_->ch_layout.nb_channels != config.channels()) {
-     MEDIA_LOG(ERROR, media_log_)
-         << "Audio configuration specified " << config.channels()
-         << " channels, but FFmpeg thinks the file contains "
--        << codec_context_->channels << " channels";
-+        << codec_context_->ch_layout.nb_channels << " channels";
-     ReleaseFFmpegResources();
-     state_ = DecoderState::kUninitialized;
-     return false;
-@@ -403,7 +403,7 @@ int FFmpegAudioDecoder::GetAudioBuffer(struct AVCodecContext* s,
-   if (frame->nb_samples <= 0)
-     return AVERROR(EINVAL);
- 
--  if (s->channels != channels) {
-+  if (s->ch_layout.nb_channels != channels) {
-     DLOG(ERROR) << "AVCodecContext and AVFrame disagree on channel count.";
-     return AVERROR(EINVAL);
-   }
-@@ -436,7 +436,8 @@ int FFmpegAudioDecoder::GetAudioBuffer(struct AVCodecContext* s,
-   ChannelLayout channel_layout =
-       config_.channel_layout() == CHANNEL_LAYOUT_DISCRETE
-           ? CHANNEL_LAYOUT_DISCRETE
--          : ChannelLayoutToChromeChannelLayout(s->channel_layout, s->channels);
-+          : ChannelLayoutToChromeChannelLayout(s->ch_layout.u.mask,
-+                                               s->ch_layout.nb_channels);
- 
-   if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED) {
-     DLOG(ERROR) << "Unsupported channel layout.";

+ 0 - 58
v8-enhance-Date-parser-to-take-Unicode-SPACE.patch

@@ -1,58 +0,0 @@
-From 81dd64c3705f89653859a5d0001dd0ca983a92e2 Mon Sep 17 00:00:00 2001
-From: Frank Tang <ftang@chromium.org>
-Date: Wed, 16 Nov 2022 09:18:45 -0800
-Subject: [PATCH] [intl] Enhance Date parser to take Unicode SPACE
-
-This is needed to prepare for the landing of ICU72.
-Allow U+202F in the Date String, which the toLocaleString("en-US")
-will generate w/ ICU72.
-
-Bug: v8:13494
-Change-Id: I41b83c4094ce3d0737a72dcd6310b52c68fdcdca
-Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4027341
-Reviewed-by: Yang Guo <yangguo@chromium.org>
-Reviewed-by: Jungshik Shin <jshin@chromium.org>
-Commit-Queue: Frank Tang <ftang@chromium.org>
-Cr-Commit-Position: refs/heads/main@{#84308}
-
-(cherry picked from commit 2ada52cffbff11074abfaac18938bf02d85454f5)
----
- src/date/dateparser-inl.h | 2 +-
- src/date/dateparser.h     | 4 +++-
- 2 files changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/src/date/dateparser-inl.h b/src/date/dateparser-inl.h
-index 623986d2b1..b45479dc51 100644
---- a/src/date/dateparser-inl.h
-+++ b/src/date/dateparser-inl.h
-@@ -192,7 +192,7 @@ DateParser::DateToken DateParser::DateStringTokenizer<CharType>::Scan() {
-   if (in_->Skip('+')) return DateToken::Symbol('+');
-   if (in_->Skip('.')) return DateToken::Symbol('.');
-   if (in_->Skip(')')) return DateToken::Symbol(')');
--  if (in_->IsAsciiAlphaOrAbove()) {
-+  if (in_->IsAsciiAlphaOrAbove() && !in_->IsWhiteSpaceChar()) {
-     DCHECK_EQ(KeywordTable::kPrefixLength, 3);
-     uint32_t buffer[3] = {0, 0, 0};
-     int length = in_->ReadWord(buffer, 3);
-diff --git a/src/date/dateparser.h b/src/date/dateparser.h
-index 1a0a0b15ab..59b2f3c9fd 100644
---- a/src/date/dateparser.h
-+++ b/src/date/dateparser.h
-@@ -91,7 +91,8 @@ class DateParser : public AllStatic {
-     // Return word length.
-     int ReadWord(uint32_t* prefix, int prefix_size) {
-       int len;
--      for (len = 0; IsAsciiAlphaOrAbove(); Next(), len++) {
-+      for (len = 0; IsAsciiAlphaOrAbove() && !IsWhiteSpaceChar();
-+           Next(), len++) {
-         if (len < prefix_size) prefix[len] = AsciiAlphaToLower(ch_);
-       }
-       for (int i = len; i < prefix_size; i++) prefix[i] = 0;
-@@ -115,6 +116,7 @@ class DateParser : public AllStatic {
-     bool IsEnd() const { return ch_ == 0; }
-     bool IsAsciiDigit() const { return IsDecimalDigit(ch_); }
-     bool IsAsciiAlphaOrAbove() const { return ch_ >= 'A'; }
-+    bool IsWhiteSpaceChar() const { return IsWhiteSpace(ch_); }
-     bool IsAsciiSign() const { return ch_ == '+' || ch_ == '-'; }
- 
-     // Return 1 for '+' and -1 for '-'.

+ 0 - 490
x11-ozone-fix-X11-screensaver-suspension.patch

@@ -1,490 +0,0 @@
-From 8c1ebea5f601b0b5247535dcdfd01755f3e6e1a6 Mon Sep 17 00:00:00 2001
-From: Andrew Wolfers <aswolfers@chromium.org>
-Date: Tue, 19 Jul 2022 15:01:25 +0000
-Subject: [PATCH] [x11][ozone] Fix X11 screensaver suspension.
-
-X11 screensaver suspension was broken by https://crrev.com/c/3507472,
-in which usage patterns were migrated to a non-stacking paradigm.
-
-"Non-stacking" screensaver suspension describes an overriding behavior,
-such that the last suspending or un-suspending call defines the current
-state. Conversely, a "stacking" screensaver suspension paradigm allows
-for parallel suspension, such that suspending calls are expected to be
-matched by an equal number of un-suspending calls.
-
-Documentation for `PlatformScreen::SetScreenSaverSuspended` (inherited
-by `X11ScreenOzone`) explains that it should be used in a non-stacking
-manner [1], which contradicts the child class's underlying
-implementation [2].
-
-> If XScreenSaverSuspend is called multiple times with suspend set to
-> 'True', it must be called an equal number of times with suspend set
-> to 'False' in order for the screensaver timer to be restarted.
-
-This change updates the documentation/API of the `PlatformScreen`
-parent class to correctly describe the stacking behavior of child class
-`X11ScreenOzone`. This change also updates the implementation of
-`WaylandScreen` to a stacking version. Lastly, this change updates the
-call sites of `PlatformScreen` according to the API change.
-
-[1] https://crsrc.org/c/ui/ozone/public/platform_screen.h;l=96
-[2] https://linux.die.net/man/3/xscreensaverunsetattributes
-
-Bug: b:193670013
-Bug: b:196213351
-Bug: 1329573
-Bug: 1339361
-Change-Id: I60975c8da9f86a0f26f3c32cf49c4a7eeeea6a12
-Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3759067
-Commit-Queue: Andrew Wolfers <aswolfers@chromium.org>
-Reviewed-by: Thomas Anderson <thomasanderson@chromium.org>
-Reviewed-by: Scott Violet <sky@chromium.org>
-Cr-Commit-Position: refs/heads/main@{#1025717}
-
-(cherry picked from commit e61f08f8dbf1ec7cead427f3c497934e9d0db35f)
----
- ui/aura/screen_ozone.cc                       | 14 ++++++--
- ui/aura/screen_ozone.h                        | 29 ++++++++++++----
- ui/base/x/x11_util.h                          |  4 ++-
- ui/display/screen.cc                          | 21 ++----------
- ui/display/screen.h                           | 34 ++++++-------------
- .../platform/wayland/host/wayland_screen.cc   | 31 +++++++++++++++++
- .../platform/wayland/host/wayland_screen.h    | 30 +++++++++++++++-
- ui/ozone/platform/x11/x11_screen_ozone.cc     | 27 +++++++++++++--
- ui/ozone/platform/x11/x11_screen_ozone.h      | 19 ++++++++++-
- ui/ozone/public/platform_screen.cc            |  8 +++--
- ui/ozone/public/platform_screen.h             | 26 +++++++++++---
- 11 files changed, 182 insertions(+), 61 deletions(-)
-
-diff --git a/ui/aura/screen_ozone.cc b/ui/aura/screen_ozone.cc
-index a78a6a48f1..09f62dc982 100644
---- a/ui/aura/screen_ozone.cc
-+++ b/ui/aura/screen_ozone.cc
-@@ -4,6 +4,8 @@
- 
- #include "ui/aura/screen_ozone.h"
- 
-+#include <memory>
-+
- #include "ui/aura/client/screen_position_client.h"
- #include "ui/aura/window.h"
- #include "ui/aura/window_tree_host.h"
-@@ -108,8 +110,16 @@ display::Display ScreenOzone::GetPrimaryDisplay() const {
- }
- 
- #if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
--bool ScreenOzone::SetScreenSaverSuspended(bool suspend) {
--  return platform_screen_->SetScreenSaverSuspended(suspend);
-+ScreenOzone::ScreenSaverSuspenderOzone::ScreenSaverSuspenderOzone(
-+    std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender> suspender)
-+    : suspender_(std::move(suspender)) {}
-+
-+ScreenOzone::ScreenSaverSuspenderOzone::~ScreenSaverSuspenderOzone() = default;
-+
-+std::unique_ptr<display::Screen::ScreenSaverSuspender>
-+ScreenOzone::SuspendScreenSaver() {
-+  return std::make_unique<ScreenSaverSuspenderOzone>(
-+      platform_screen_->SuspendScreenSaver());
- }
- #endif  // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
- 
-diff --git a/ui/aura/screen_ozone.h b/ui/aura/screen_ozone.h
-index 2970a0e0e7..d033abf366 100644
---- a/ui/aura/screen_ozone.h
-+++ b/ui/aura/screen_ozone.h
-@@ -11,10 +11,7 @@
- #include "build/chromeos_buildflags.h"
- #include "ui/aura/aura_export.h"
- #include "ui/display/screen.h"
--
--namespace ui {
--class PlatformScreen;
--}
-+#include "ui/ozone/public/platform_screen.h"
- 
- namespace aura {
- 
-@@ -48,6 +45,10 @@ class AURA_EXPORT ScreenOzone : public display::Screen {
-   display::Display GetDisplayMatching(
-       const gfx::Rect& match_rect) const override;
-   display::Display GetPrimaryDisplay() const override;
-+#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
-+  std::unique_ptr<display::Screen::ScreenSaverSuspender> SuspendScreenSaver()
-+      override;
-+#endif  // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
-   bool IsScreenSaverActive() const override;
-   base::TimeDelta CalculateIdleTime() const override;
-   void AddObserver(display::DisplayObserver* observer) override;
-@@ -65,11 +66,27 @@ class AURA_EXPORT ScreenOzone : public display::Screen {
-  protected:
-   ui::PlatformScreen* platform_screen() { return platform_screen_.get(); }
- 
-+ private:
- #if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
--  bool SetScreenSaverSuspended(bool suspend) override;
-+  class ScreenSaverSuspenderOzone
-+      : public display::Screen::ScreenSaverSuspender {
-+   public:
-+    explicit ScreenSaverSuspenderOzone(
-+        std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender>
-+            suspender);
-+
-+    ScreenSaverSuspenderOzone(const ScreenSaverSuspenderOzone&) = delete;
-+    ScreenSaverSuspenderOzone& operator=(const ScreenSaverSuspenderOzone&) =
-+        delete;
-+
-+    ~ScreenSaverSuspenderOzone() override;
-+
-+   private:
-+    std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender>
-+        suspender_;
-+  };
- #endif  // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
- 
-- private:
-   gfx::AcceleratedWidget GetAcceleratedWidgetForWindow(
-       aura::Window* window) const;
- 
-diff --git a/ui/base/x/x11_util.h b/ui/base/x/x11_util.h
-index bf36efe170..0692571582 100644
---- a/ui/base/x/x11_util.h
-+++ b/ui/base/x/x11_util.h
-@@ -337,7 +337,9 @@ COMPONENT_EXPORT(UI_BASE_X) bool IsCompositingManagerPresent();
- COMPONENT_EXPORT(UI_BASE_X) bool IsX11WindowFullScreen(x11::Window window);
- 
- // Suspends or resumes the X screen saver, and returns whether the operation was
--// successful.  Must be called on the UI thread.
-+// successful.  Must be called on the UI thread. If called multiple times with
-+// |suspend| set to true, the screen saver is not un-suspended until this method
-+// is called an equal number of times with |suspend| set to false.
- COMPONENT_EXPORT(UI_BASE_X) bool SuspendX11ScreenSaver(bool suspend);
- 
- // Returns true if the window manager supports the given hint.
-diff --git a/ui/display/screen.cc b/ui/display/screen.cc
-index b9723889ce..70dc0a9f5c 100644
---- a/ui/display/screen.cc
-+++ b/ui/display/screen.cc
-@@ -85,26 +85,11 @@ void Screen::SetDisplayForNewWindows(int64_t display_id) {
- }
- 
- #if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
--std::unique_ptr<Screen::ScreenSaverSuspender> Screen::SuspendScreenSaver() {
--  SetScreenSaverSuspended(true);
--  screen_saver_suspension_count_++;
--  return base::WrapUnique(new Screen::ScreenSaverSuspender(this));
--}
--
--Screen::ScreenSaverSuspender::~ScreenSaverSuspender() {
--  // Check that this suspender still refers to the active screen. Particularly
--  // in tests, the screen might be destructed before the suspender.
--  if (screen_ == GetScreen()) {
--    screen_->screen_saver_suspension_count_--;
--    if (screen_->screen_saver_suspension_count_ == 0) {
--      screen_->SetScreenSaverSuspended(false);
--    }
--  }
--}
-+Screen::ScreenSaverSuspender::~ScreenSaverSuspender() = default;
- 
--bool Screen::SetScreenSaverSuspended(bool suspend) {
-+std::unique_ptr<Screen::ScreenSaverSuspender> Screen::SuspendScreenSaver() {
-   NOTIMPLEMENTED_LOG_ONCE();
--  return false;
-+  return nullptr;
- }
- #endif  // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
- 
-diff --git a/ui/display/screen.h b/ui/display/screen.h
-index a86c5b63cc..d04534006f 100644
---- a/ui/display/screen.h
-+++ b/ui/display/screen.h
-@@ -133,28 +133,22 @@ class DISPLAY_EXPORT Screen {
-   // its existence.
-   class ScreenSaverSuspender {
-    public:
--    ScreenSaverSuspender(const Screen&) = delete;
--    ScreenSaverSuspender& operator=(const Screen&) = delete;
-+    ScreenSaverSuspender() = default;
- 
--    // Notifies |screen_| that this instance is being destructed, and causes its
--    // platform-specific screensaver to be un-suspended if this is the last such
--    // remaining instance.
--    ~ScreenSaverSuspender();
-+    ScreenSaverSuspender(const ScreenSaverSuspender&) = delete;
-+    ScreenSaverSuspender& operator=(const ScreenSaverSuspender&) = delete;
- 
--   private:
--    friend class Screen;
--
--    explicit ScreenSaverSuspender(Screen* screen) : screen_(screen) {}
--
--    Screen* screen_;
-+    // Causes the platform-specific screensaver to be un-suspended iff this is
-+    // the last remaining instance.
-+    virtual ~ScreenSaverSuspender() = 0;
-   };
- 
-   // Suspends the platform-specific screensaver until the returned
--  // |ScreenSaverSuspender| is destructed. This method allows stacking multiple
--  // overlapping calls, such that the platform-specific screensaver will not be
--  // un-suspended until all returned |SreenSaverSuspender| instances have been
--  // destructed.
--  std::unique_ptr<ScreenSaverSuspender> SuspendScreenSaver();
-+  // |ScreenSaverSuspender| is destructed, or returns nullptr if suspension
-+  // failed. This method allows stacking multiple overlapping calls, such that
-+  // the platform-specific screensaver will not be un-suspended until all
-+  // returned |ScreenSaverSuspender| instances have been destructed.
-+  virtual std::unique_ptr<ScreenSaverSuspender> SuspendScreenSaver();
- #endif  // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
- 
-   // Returns whether the screensaver is currently running.
-@@ -200,12 +194,6 @@ class DISPLAY_EXPORT Screen {
-       const gfx::GpuExtraInfo& gpu_extra_info);
- 
-  protected:
--#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
--  // Suspends or un-suspends the platform-specific screensaver, and returns
--  // whether the operation was successful.
--  virtual bool SetScreenSaverSuspended(bool suspend);
--#endif  // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
--
-   void set_shutdown(bool shutdown) { shutdown_ = shutdown; }
- 
-  private:
-diff --git a/ui/ozone/platform/wayland/host/wayland_screen.cc b/ui/ozone/platform/wayland/host/wayland_screen.cc
-index 0c7dc5c02b..18cd81b472 100644
---- a/ui/ozone/platform/wayland/host/wayland_screen.cc
-+++ b/ui/ozone/platform/wayland/host/wayland_screen.cc
-@@ -327,6 +327,37 @@ display::Display WaylandScreen::GetDisplayMatching(
-   return display_matching ? *display_matching : GetPrimaryDisplay();
- }
- 
-+std::unique_ptr<WaylandScreen::WaylandScreenSaverSuspender>
-+WaylandScreen::WaylandScreenSaverSuspender::Create(WaylandScreen& screen) {
-+  auto suspender = base::WrapUnique(new WaylandScreenSaverSuspender(screen));
-+  if (suspender->is_suspending_) {
-+    screen.screen_saver_suspension_count_++;
-+    return suspender;
-+  }
-+
-+  return nullptr;
-+}
-+
-+WaylandScreen::WaylandScreenSaverSuspender::WaylandScreenSaverSuspender(
-+    WaylandScreen& screen)
-+    : screen_(screen.GetWeakPtr()) {
-+  is_suspending_ = screen.SetScreenSaverSuspended(true);
-+}
-+
-+WaylandScreen::WaylandScreenSaverSuspender::~WaylandScreenSaverSuspender() {
-+  if (screen_ && is_suspending_) {
-+    screen_->screen_saver_suspension_count_--;
-+    if (screen_->screen_saver_suspension_count_ == 0) {
-+      screen_->SetScreenSaverSuspended(false);
-+    }
-+  }
-+}
-+
-+std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
-+WaylandScreen::SuspendScreenSaver() {
-+  return WaylandScreenSaverSuspender::Create(*this);
-+}
-+
- bool WaylandScreen::SetScreenSaverSuspended(bool suspend) {
-   if (!connection_->zwp_idle_inhibit_manager())
-     return false;
-diff --git a/ui/ozone/platform/wayland/host/wayland_screen.h b/ui/ozone/platform/wayland/host/wayland_screen.h
-index 87358f4f06..8e5515104a 100644
---- a/ui/ozone/platform/wayland/host/wayland_screen.h
-+++ b/ui/ozone/platform/wayland/host/wayland_screen.h
-@@ -68,7 +68,8 @@ class WaylandScreen : public PlatformScreen {
-       const gfx::Point& point) const override;
-   display::Display GetDisplayMatching(
-       const gfx::Rect& match_rect) const override;
--  bool SetScreenSaverSuspended(bool suspend) override;
-+  std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
-+  SuspendScreenSaver() override;
-   bool IsScreenSaverActive() const override;
-   base::TimeDelta CalculateIdleTime() const override;
-   void AddObserver(display::DisplayObserver* observer) override;
-@@ -76,7 +77,33 @@ class WaylandScreen : public PlatformScreen {
-   std::vector<base::Value> GetGpuExtraInfo(
-       const gfx::GpuExtraInfo& gpu_extra_info) override;
- 
-+ protected:
-+  // Suspends or un-suspends the platform-specific screensaver, and returns
-+  // whether the operation was successful. Can be called more than once with the
-+  // same value for |suspend|, but those states should not stack: the first
-+  // alternating value should toggle the state of the suspend.
-+  bool SetScreenSaverSuspended(bool suspend);
-+
-  private:
-+  class WaylandScreenSaverSuspender
-+      : public PlatformScreen::PlatformScreenSaverSuspender {
-+   public:
-+    WaylandScreenSaverSuspender(const WaylandScreenSaverSuspender&) = delete;
-+    WaylandScreenSaverSuspender& operator=(const WaylandScreenSaverSuspender&) =
-+        delete;
-+
-+    ~WaylandScreenSaverSuspender() override;
-+
-+    static std::unique_ptr<WaylandScreenSaverSuspender> Create(
-+        WaylandScreen& screen);
-+
-+   private:
-+    explicit WaylandScreenSaverSuspender(WaylandScreen& screen);
-+
-+    base::WeakPtr<WaylandScreen> screen_;
-+    bool is_suspending_ = false;
-+  };
-+
-   // All parameters are in DIP screen coordinates/units except |physical_size|,
-   // which is in physical pixels.
-   void AddOrUpdateDisplay(uint32_t output_id,
-@@ -103,6 +130,7 @@ class WaylandScreen : public PlatformScreen {
- #endif
- 
-   wl::Object<zwp_idle_inhibitor_v1> idle_inhibitor_;
-+  uint32_t screen_saver_suspension_count_ = 0;
- 
-   base::WeakPtrFactory<WaylandScreen> weak_factory_;
- };
-diff --git a/ui/ozone/platform/x11/x11_screen_ozone.cc b/ui/ozone/platform/x11/x11_screen_ozone.cc
-index 53265ab58a..b450df9c83 100644
---- a/ui/ozone/platform/x11/x11_screen_ozone.cc
-+++ b/ui/ozone/platform/x11/x11_screen_ozone.cc
-@@ -4,6 +4,8 @@
- 
- #include "ui/ozone/platform/x11/x11_screen_ozone.h"
- 
-+#include <memory>
-+
- #include "base/containers/flat_set.h"
- #include "ui/base/linux/linux_desktop.h"
- #include "ui/base/x/x11_idle_query.h"
-@@ -131,8 +133,29 @@ display::Display X11ScreenOzone::GetDisplayMatching(
-   return matching_display ? *matching_display : GetPrimaryDisplay();
- }
- 
--bool X11ScreenOzone::SetScreenSaverSuspended(bool suspend) {
--  return SuspendX11ScreenSaver(suspend);
-+X11ScreenOzone::X11ScreenSaverSuspender::X11ScreenSaverSuspender() {
-+  is_suspending_ = SuspendX11ScreenSaver(true);
-+}
-+
-+std::unique_ptr<X11ScreenOzone::X11ScreenSaverSuspender>
-+X11ScreenOzone::X11ScreenSaverSuspender::Create() {
-+  auto suspender = base::WrapUnique(new X11ScreenSaverSuspender());
-+  if (suspender->is_suspending_) {
-+    return suspender;
-+  }
-+
-+  return nullptr;
-+}
-+
-+X11ScreenOzone::X11ScreenSaverSuspender::~X11ScreenSaverSuspender() {
-+  if (is_suspending_) {
-+    SuspendX11ScreenSaver(false);
-+  }
-+}
-+
-+std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
-+X11ScreenOzone::SuspendScreenSaver() {
-+  return X11ScreenSaverSuspender::Create();
- }
- 
- bool X11ScreenOzone::IsScreenSaverActive() const {
-diff --git a/ui/ozone/platform/x11/x11_screen_ozone.h b/ui/ozone/platform/x11/x11_screen_ozone.h
-index d86acae9aa..81e0fd13d8 100644
---- a/ui/ozone/platform/x11/x11_screen_ozone.h
-+++ b/ui/ozone/platform/x11/x11_screen_ozone.h
-@@ -50,7 +50,8 @@ class X11ScreenOzone : public PlatformScreen,
-       const gfx::Point& point) const override;
-   display::Display GetDisplayMatching(
-       const gfx::Rect& match_rect) const override;
--  bool SetScreenSaverSuspended(bool suspend) override;
-+  std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
-+  SuspendScreenSaver() override;
-   bool IsScreenSaverActive() const override;
-   base::TimeDelta CalculateIdleTime() const override;
-   void AddObserver(display::DisplayObserver* observer) override;
-@@ -66,6 +67,22 @@ class X11ScreenOzone : public PlatformScreen,
-  private:
-   friend class X11ScreenOzoneTest;
- 
-+  class X11ScreenSaverSuspender
-+      : public PlatformScreen::PlatformScreenSaverSuspender {
-+   public:
-+    X11ScreenSaverSuspender(const X11ScreenSaverSuspender&) = delete;
-+    X11ScreenSaverSuspender& operator=(const X11ScreenSaverSuspender&) = delete;
-+
-+    ~X11ScreenSaverSuspender() override;
-+
-+    static std::unique_ptr<X11ScreenSaverSuspender> Create();
-+
-+   private:
-+    X11ScreenSaverSuspender();
-+
-+    bool is_suspending_ = false;
-+  };
-+
-   // Overridden from ui::XDisplayManager::Delegate:
-   void OnXDisplayListUpdated() override;
-   float GetXDisplayScaleFactor() const override;
-diff --git a/ui/ozone/public/platform_screen.cc b/ui/ozone/public/platform_screen.cc
-index 98f599aa41..2353208396 100644
---- a/ui/ozone/public/platform_screen.cc
-+++ b/ui/ozone/public/platform_screen.cc
-@@ -30,9 +30,13 @@ std::string PlatformScreen::GetCurrentWorkspace() {
-   return {};
- }
- 
--bool PlatformScreen::SetScreenSaverSuspended(bool suspend) {
-+PlatformScreen::PlatformScreenSaverSuspender::~PlatformScreenSaverSuspender() =
-+    default;
-+
-+std::unique_ptr<PlatformScreen::PlatformScreenSaverSuspender>
-+PlatformScreen::SuspendScreenSaver() {
-   NOTIMPLEMENTED_LOG_ONCE();
--  return false;
-+  return nullptr;
- }
- 
- bool PlatformScreen::IsScreenSaverActive() const {
-diff --git a/ui/ozone/public/platform_screen.h b/ui/ozone/public/platform_screen.h
-index 091220a99f..e4adfafce3 100644
---- a/ui/ozone/public/platform_screen.h
-+++ b/ui/ozone/public/platform_screen.h
-@@ -89,11 +89,27 @@ class COMPONENT_EXPORT(OZONE_BASE) PlatformScreen {
-   virtual display::Display GetDisplayMatching(
-       const gfx::Rect& match_rect) const = 0;
- 
--  // Suspends or un-suspends the platform-specific screensaver, and returns
--  // whether the operation was successful. Can be called more than once with the
--  // same value for |suspend|, but those states should not stack: the first
--  // alternating value should toggle the state of the suspend.
--  virtual bool SetScreenSaverSuspended(bool suspend);
-+  // Object which suspends the platform-specific screensaver for the duration of
-+  // its existence.
-+  class PlatformScreenSaverSuspender {
-+   public:
-+    PlatformScreenSaverSuspender() = default;
-+
-+    PlatformScreenSaverSuspender(const PlatformScreenSaverSuspender&) = delete;
-+    PlatformScreenSaverSuspender& operator=(
-+        const PlatformScreenSaverSuspender&) = delete;
-+
-+    // Causes the platform-specific screensaver to be un-suspended iff this is
-+    // the last remaining instance.
-+    virtual ~PlatformScreenSaverSuspender() = 0;
-+  };
-+
-+  // Suspends the platform-specific screensaver until the returned
-+  // |PlatformScreenSaverSuspender| is destructed, or returns nullptr if
-+  // suspension failed. This method allows stacking multiple overlapping calls,
-+  // such that the platform-specific screensaver will not be un-suspended until
-+  // all returned |PlatformScreenSaverSuspender| instances have been destructed.
-+  virtual std::unique_ptr<PlatformScreenSaverSuspender> SuspendScreenSaver();
- 
-   // Returns whether the screensaver is currently running.
-   virtual bool IsScreenSaverActive() const;