summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorNoah Vogt2022-08-08 22:29:52 +0200
committerNoah Vogt2022-08-08 22:29:52 +0200
commit70208ec6386c66f50388abf2b0d7e432dbaa8c4a (patch)
treef60908988ce57ba6f46239989ba6c065e1f3fb15
parentea86e9b21a2861c50357adc05a54803a8fde3304 (diff)
downloadaur-70208ec6386c66f50388abf2b0d7e432dbaa8c4a.tar.gz
uppkg -> 104.0.5112.79-1
-rw-r--r--.SRCINFO26
-rw-r--r--PKGBUILD47
-rw-r--r--chromium-tflite-system-zlib.patch70
-rw-r--r--ozone-add-va-api-support-to-wayland.patch58
-rw-r--r--remove-no-opaque-pointers-flag.patch10
-rw-r--r--sql-make-VirtualCursor-standard-layout-type.patch238
-rw-r--r--x11-ozone-fix-X11-screensaver-suspension.patch490
7 files changed, 620 insertions, 319 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 3cac585fae9d..0a8a6592a94c 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,8 +1,8 @@
pkgbase = ungoogled-chromium-xdg
pkgdesc = A lightweight approach to removing Google web service dependency - without creating a useless ~/.pki directory
- pkgver = 103.0.5060.53
+ pkgver = 104.0.5112.79
pkgrel = 1
- url = https://github.com/Eloston/ungoogled-chromium
+ url = https://github.com/ungoogled-software/ungoogled-chromium
arch = x86_64
license = BSD
makedepends = python
@@ -53,33 +53,35 @@ pkgbase = ungoogled-chromium-xdg
conflicts = chromium
options = debug
options = !lto
- source = https://commondatastorage.googleapis.com/chromium-browser-official/chromium-103.0.5060.53.tar.xz
+ source = https://commondatastorage.googleapis.com/chromium-browser-official/chromium-104.0.5112.79.tar.xz
source = https://github.com/foutrelis/chromium-launcher/archive/v8/chromium-launcher-8.tar.gz
- source = https://github.com/stha09/chromium-patches/releases/download/chromium-103-patchset-4/chromium-103-patchset-4.tar.xz
+ source = https://github.com/stha09/chromium-patches/releases/download/chromium-104-patchset-2/chromium-104-patchset-2.tar.xz
+ source = x11-ozone-fix-X11-screensaver-suspension.patch
source = enable-GlobalMediaControlsCastStartStop.patch
source = roll-src-third_party-ffmpeg.patch
- source = sql-make-VirtualCursor-standard-layout-type.patch
+ source = chromium-tflite-system-zlib.patch
source = remove-no-opaque-pointers-flag.patch
source = use-oauth2-client-switches-as-default.patch
source = xdg-basedir.patch
source = no-omnibox-suggestion-autocomplete.patch
source = index.html
- source = ungoogled-chromium-103.0.5060.53-1.tar.gz::https://github.com/Eloston/ungoogled-chromium/archive/103.0.5060.53-1.tar.gz
+ source = ungoogled-chromium-104.0.5112.81-1.tar.gz::https://github.com/ungoogled-software/ungoogled-chromium/archive/104.0.5112.81-1.tar.gz
source = chromium-drirc-disable-10bpc-color-configs.conf
source = ozone-add-va-api-support-to-wayland.patch
- sha256sums = 0ecbae14670506da90c8bf744f83f52a64a5fff0765c2e2e066b0e68b805b101
+ sha256sums = 9cc662f1a84c796521ee17ed2808795ca937fe7f77bc605e788f0304a81dabf3
sha256sums = 213e50f48b67feb4441078d50b0fd431df34323be15be97c55302d3fdac4483a
- sha256sums = fed11a8987d9f9baa04457fb114f8f7fdb800300a3780927020865bcc43e4f52
+ sha256sums = ce702099849465927cf47f7bc3a4a27045d0e35e16b17481ebf35e14506bafa7
+ sha256sums = 9956a843bc8a765c130080616ccd3ebc46ea95c3a2324c4b403bc293a8705eb2
sha256sums = 779fb13f2494209d3a7f1f23a823e59b9dded601866d3ab095937a1a04e19ac6
sha256sums = 30df59a9e2d95dcb720357ec4a83d9be51e59cc5551365da4c0073e68ccdec44
- sha256sums = b94b2e88f63cfb7087486508b8139599c89f96d7a4181c61fec4b4e250ca327a
- sha256sums = 00c16ce83ea4ca924a50fa0cfc2b2a4d744c722f363b065323e6ba0fcbac45a5
+ sha256sums = 588c166bf748793758a7df438cfa665b32e09ca8fbd6380be28bc5984a33523c
+ sha256sums = ab46b2c26a4dfe86486fd7e31bfc7211c515994a61a8c0cbd742f9c9e3c91873
sha256sums = e393174d7695d0bafed69e868c5fbfecf07aa6969f3b64596d0bae8b067e1711
sha256sums = cd844867b5b2197ad097662fee32579a7091dfba1d46cb438c4c7e696690440a
sha256sums = ff1591fa38e0ede7e883dc7494b813641b7a1a7cb1ded00d9baaee987c1dbea8
sha256sums = a4cdd2b86f32d5302c2792be841ff40d982b19bb58a4e63df9d77f4c706b8665
- sha256sums = 96c7adbe1d9ec6fe77bb3d299a4bbcc63bcdbec04f736a73f218949a0ea5a83e
+ sha256sums = 75fbb5a8679522cd81520a5623e18d8aa4783d5403d2bc26aacab90d899a7a15
sha256sums = babda4f5c1179825797496898d77334ac067149cac03d797ab27ac69671a7feb
- sha256sums = 07bdc1b3fc8f0d0a4804d111c46ce3343cd7824de562f2848d429b917ce4bcfd
+ sha256sums = af20fc58aef22dd0b1fb560a1fab68d0d27187ff18fad7eb1670feab9bc4a8d8
pkgname = ungoogled-chromium-xdg
diff --git a/PKGBUILD b/PKGBUILD
index 4718c229e8df..1d8cd32b9779 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -2,7 +2,7 @@
# Maintainer: Seppia <seppia@seppio.fish>
# Maintainer: JustKidding <jk@vin.ovh>
-# Based on aur/chromium-vaapi, with ungoogled-chromium patches
+# Based on extra/chromium, with ungoogled-chromium patches
# Maintainer: Evangelos Foutras <evangelos@foutrelis.com>
# Contributor: Pierre Schmitz <pierre@archlinux.de>
@@ -10,13 +10,13 @@
# Contributor: Daniel J Griffiths <ghost1227@archlinux.us>
pkgname=ungoogled-chromium-xdg
-pkgver=103.0.5060.53
+pkgver=104.0.5112.79
pkgrel=1
_launcher_ver=8
-_gcc_patchset=4
+_gcc_patchset=2
pkgdesc="A lightweight approach to removing Google web service dependency - without creating a useless ~/.pki directory"
arch=('x86_64')
-url="https://github.com/Eloston/ungoogled-chromium"
+url="https://github.com/ungoogled-software/ungoogled-chromium"
license=('BSD')
depends=('gtk3' 'nss' 'alsa-lib' 'xdg-utils' 'libxss' 'libcups' 'libgcrypt'
'ttf-liberation' 'systemd' 'dbus' 'libpulse' 'pciutils' 'libva'
@@ -31,37 +31,39 @@ options=('debug' '!lto') # Chromium adds its own flags for ThinLTO
source=(https://commondatastorage.googleapis.com/chromium-browser-official/chromium-$pkgver.tar.xz
https://github.com/foutrelis/chromium-launcher/archive/v$_launcher_ver/chromium-launcher-$_launcher_ver.tar.gz
https://github.com/stha09/chromium-patches/releases/download/chromium-${pkgver%%.*}-patchset-$_gcc_patchset/chromium-${pkgver%%.*}-patchset-$_gcc_patchset.tar.xz
+ x11-ozone-fix-X11-screensaver-suspension.patch
enable-GlobalMediaControlsCastStartStop.patch
roll-src-third_party-ffmpeg.patch
- sql-make-VirtualCursor-standard-layout-type.patch
+ chromium-tflite-system-zlib.patch
remove-no-opaque-pointers-flag.patch
use-oauth2-client-switches-as-default.patch
xdg-basedir.patch
no-omnibox-suggestion-autocomplete.patch
index.html)
-sha256sums=('0ecbae14670506da90c8bf744f83f52a64a5fff0765c2e2e066b0e68b805b101'
+sha256sums=('9cc662f1a84c796521ee17ed2808795ca937fe7f77bc605e788f0304a81dabf3'
'213e50f48b67feb4441078d50b0fd431df34323be15be97c55302d3fdac4483a'
- 'fed11a8987d9f9baa04457fb114f8f7fdb800300a3780927020865bcc43e4f52'
+ 'ce702099849465927cf47f7bc3a4a27045d0e35e16b17481ebf35e14506bafa7'
+ '9956a843bc8a765c130080616ccd3ebc46ea95c3a2324c4b403bc293a8705eb2'
'779fb13f2494209d3a7f1f23a823e59b9dded601866d3ab095937a1a04e19ac6'
'30df59a9e2d95dcb720357ec4a83d9be51e59cc5551365da4c0073e68ccdec44'
- 'b94b2e88f63cfb7087486508b8139599c89f96d7a4181c61fec4b4e250ca327a'
- '00c16ce83ea4ca924a50fa0cfc2b2a4d744c722f363b065323e6ba0fcbac45a5'
+ '588c166bf748793758a7df438cfa665b32e09ca8fbd6380be28bc5984a33523c'
+ 'ab46b2c26a4dfe86486fd7e31bfc7211c515994a61a8c0cbd742f9c9e3c91873'
'e393174d7695d0bafed69e868c5fbfecf07aa6969f3b64596d0bae8b067e1711'
'cd844867b5b2197ad097662fee32579a7091dfba1d46cb438c4c7e696690440a'
'ff1591fa38e0ede7e883dc7494b813641b7a1a7cb1ded00d9baaee987c1dbea8'
'a4cdd2b86f32d5302c2792be841ff40d982b19bb58a4e63df9d77f4c706b8665')
provides=('chromium')
conflicts=('chromium')
-_uc_usr=Eloston
-_uc_ver=$pkgver-1
+_uc_usr=ungoogled-software
+_uc_ver=104.0.5112.81-1
source=(${source[@]}
${pkgname%-*}-$_uc_ver.tar.gz::https://github.com/$_uc_usr/ungoogled-chromium/archive/$_uc_ver.tar.gz
chromium-drirc-disable-10bpc-color-configs.conf
ozone-add-va-api-support-to-wayland.patch)
sha256sums=(${sha256sums[@]}
- '96c7adbe1d9ec6fe77bb3d299a4bbcc63bcdbec04f736a73f218949a0ea5a83e'
+ '75fbb5a8679522cd81520a5623e18d8aa4783d5403d2bc26aacab90d899a7a15'
'babda4f5c1179825797496898d77334ac067149cac03d797ab27ac69671a7feb'
- '07bdc1b3fc8f0d0a4804d111c46ce3343cd7824de562f2848d429b917ce4bcfd')
+ 'af20fc58aef22dd0b1fb560a1fab68d0d27187ff18fad7eb1670feab9bc4a8d8')
# 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
@@ -111,6 +113,12 @@ prepare() {
# Remove '-Xclang -no-opaque-pointers' flag not supported by our clang
patch -Np1 -i ../remove-no-opaque-pointers-flag.patch
+ # Fix build with unbundled zlip (patch from Gentoo)
+ patch -Np1 -i ../chromium-tflite-system-zlib.patch
+
+ # Upstream fixes
+ patch -Np1 -i ../x11-ozone-fix-X11-screensaver-suspension.patch
+
# Revert kGlobalMediaControlsCastStartStop enabled by default
# https://crbug.com/1314342
patch -Rp1 -F3 -i ../enable-GlobalMediaControlsCastStartStop.patch
@@ -119,8 +127,8 @@ prepare() {
# https://crbug.com/1325301
patch -Rp1 -i ../roll-src-third_party-ffmpeg.patch
- # https://chromium-review.googlesource.com/c/chromium/src/+/2862724
- patch -Np1 -i ../sql-make-VirtualCursor-standard-layout-type.patch
+ # Fixes for building with libstdc++ instead of libc++
+ patch -Np1 -i ../patches/chromium-103-VirtualCursor-std-layout.patch
# move ~/.pki directory to ${XDG_DATA_HOME:-$HOME/.local}/share/pki
patch -p1 -i ../xdg-basedir.patch
@@ -130,11 +138,8 @@ prepare() {
# called 'shoulder surfing').
patch -p1 -i ../no-omnibox-suggestion-autocomplete.patch
- # Fixes for building with libstdc++ instead of libc++
- #patch -Np1 -i ../patches/
-
# Enable vaapi on wayland
- # patch -Np1 -i ../ozone-add-va-api-support-to-wayland.patch
+ patch -Np1 -i ../ozone-add-va-api-support-to-wayland.patch
# Ungoogled Chromium changes
_ungoogled_repo="$srcdir/${pkgname%xdg*}$pkgver-1"
@@ -220,12 +225,12 @@ build() {
CFLAGS=${CFLAGS/-fcf-protection}
CXXFLAGS=${CXXFLAGS/-fexceptions}
CXXFLAGS=${CXXFLAGS/-fcf-protection}
-
+
# This appears to cause random segfaults when combined with ThinLTO
# https://bugs.archlinux.org/task/73518
CFLAGS=${CFLAGS/-fstack-clash-protection}
CXXFLAGS=${CXXFLAGS/-fstack-clash-protection}
-
+
# https://crbug.com/957519#c122
CXXFLAGS=${CXXFLAGS/-Wp,-D_GLIBCXX_ASSERTIONS}
diff --git a/chromium-tflite-system-zlib.patch b/chromium-tflite-system-zlib.patch
new file mode 100644
index 000000000000..91ef5726bc8d
--- /dev/null
+++ b/chromium-tflite-system-zlib.patch
@@ -0,0 +1,70 @@
+--- 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 {
diff --git a/ozone-add-va-api-support-to-wayland.patch b/ozone-add-va-api-support-to-wayland.patch
index e2e055cc1e1e..abde3d5a4273 100644
--- a/ozone-add-va-api-support-to-wayland.patch
+++ b/ozone-add-va-api-support-to-wayland.patch
@@ -1,4 +1,3 @@
-From ddb186d8904d6ec80d1084a1cc495b824381a565 Mon Sep 17 00:00:00 2001
From: Maksim Sisov <msisov@igalia.com>
Date: Wed, 20 Jan 2021 09:50:22 +0200
Subject: [PATCH] ozone/wayland: add VA-API support.
@@ -16,18 +15,9 @@ The patch is based on the old va-api path. ChromeOS
team is working on the new path, which will be also employed
by Wayland later.
-Signed-off-by: Maksim Sisov <msisov@igalia.com>
---
- media/gpu/vaapi/vaapi_picture_factory.cc | 2 +-
- media/gpu/vaapi/vaapi_picture_native_pixmap.cc | 17 ++++++++++++++++-
- .../gpu/vaapi/vaapi_video_decode_accelerator.cc | 4 ++--
- .../platform/wayland/gpu/gbm_pixmap_wayland.cc | 14 ++++++++++++--
- .../platform/wayland/gpu/gbm_pixmap_wayland.h | 3 +++
- .../platform/wayland/ozone_platform_wayland.cc | 3 +++
- 6 files changed, 37 insertions(+), 6 deletions(-)
-
diff --git a/media/gpu/vaapi/vaapi_picture_factory.cc b/media/gpu/vaapi/vaapi_picture_factory.cc
-index 62e3a429239eb..df4905a10f68b 100644
+index 62e3a42..bde9c2d 100644
--- a/media/gpu/vaapi/vaapi_picture_factory.cc
+++ b/media/gpu/vaapi/vaapi_picture_factory.cc
@@ -105,7 +105,7 @@ uint32_t VaapiPictureFactory::GetGLTextureTarget() {
@@ -35,12 +25,12 @@ index 62e3a429239eb..df4905a10f68b 100644
gfx::BufferFormat VaapiPictureFactory::GetBufferFormat() {
-#if BUILDFLAG(USE_VAAPI_X11)
-+#if defined(OS_LINUX)
++#if BUILDFLAG(IS_LINUX)
return gfx::BufferFormat::RGBX_8888;
#else
return gfx::BufferFormat::YUV_420_BIPLANAR;
diff --git a/media/gpu/vaapi/vaapi_picture_native_pixmap.cc b/media/gpu/vaapi/vaapi_picture_native_pixmap.cc
-index 941f24cc59590..a9c80356e7109 100644
+index 941f24c..a9c8035 100644
--- a/media/gpu/vaapi/vaapi_picture_native_pixmap.cc
+++ b/media/gpu/vaapi/vaapi_picture_native_pixmap.cc
@@ -4,6 +4,7 @@
@@ -75,10 +65,10 @@ index 941f24cc59590..a9c80356e7109 100644
bool VaapiPictureNativePixmap::AllowOverlay() const {
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
-index baaf2ae468d36..4d6933d869933 100644
+index 3a07fa2..306313d 100644
--- a/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.cc
-@@ -562,12 +562,12 @@ void VaapiVideoDecodeAccelerator::InitiateSurfaceSetChange(
+@@ -561,12 +561,12 @@ void VaapiVideoDecodeAccelerator::InitiateSurfaceSetChange(
requested_visible_rect_ = visible_rect;
if (buffer_allocation_mode_ == BufferAllocationMode::kSuperReduced) {
// Add one to the reference frames for the one being currently egressed.
@@ -94,47 +84,28 @@ index baaf2ae468d36..4d6933d869933 100644
} else {
requested_num_reference_frames_ = 0;
diff --git a/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc b/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc
-index 2ec4e4e01729e..e73af1fe781c6 100644
+index 35378d1..68969d2 100644
--- a/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc
+++ b/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.cc
-@@ -33,8 +33,12 @@ GbmPixmapWayland::GbmPixmapWayland(WaylandBufferManagerGpu* buffer_manager)
+@@ -32,7 +32,9 @@ GbmPixmapWayland::GbmPixmapWayland(WaylandBufferManagerGpu* buffer_manager)
buffer_id_(buffer_manager->AllocateBufferID()) {}
GbmPixmapWayland::~GbmPixmapWayland() {
-- if (gbm_bo_ && widget_ != gfx::kNullAcceleratedWidget)
+- if (created_wl_buffer_)
+ // gfx::BufferUsage::SCANOUT_VDA_WRITE doesn't result in creation of
+ // wl_buffers.
-+ if (gbm_bo_ && usage_ != gfx::BufferUsage::SCANOUT_VDA_WRITE &&
-+ widget_ != gfx::kNullAcceleratedWidget) {
++ if (created_wl_buffer_ && usage_ != gfx::BufferUsage::SCANOUT_VDA_WRITE)
buffer_manager_->DestroyBuffer(buffer_id_);
-+ }
- }
-
- bool GbmPixmapWayland::InitializeBuffer(
-@@ -83,8 +87,14 @@ bool GbmPixmapWayland::InitializeBuffer(
- << " usage=" << gfx::BufferUsageToString(usage);
-
- visible_area_size_ = visible_area_size ? visible_area_size.value() : size;
-- if (widget_ != gfx::kNullAcceleratedWidget)
-+ usage_ = usage;
-+ // Do not create wl_buffers for SCANOUT_VDA_WRITE usages. These buffers are
-+ // only used by video decoders and are not going to be requested to be
-+ // attached to Wayland surfaces.
-+ if (usage_ != gfx::BufferUsage::SCANOUT_VDA_WRITE &&
-+ widget_ != gfx::kNullAcceleratedWidget) {
- CreateDmabufBasedBuffer();
-+ }
- return true;
}
diff --git a/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h b/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
-index e9b25a7452882..3eb91765eba30 100644
+index 06d0290..c217e91 100644
--- a/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
+++ b/ui/ozone/platform/wayland/gpu/gbm_pixmap_wayland.h
-@@ -87,6 +87,9 @@ class GbmPixmapWayland : public gfx::NativePixmap {
+@@ -91,6 +91,9 @@ class GbmPixmapWayland : public gfx::NativePixmap {
- // Size of the visible area of the buffer.
- gfx::Size visible_area_size_;
+ // Says a wl_buffer has been created and must removed.
+ bool created_wl_buffer_ = false;
+
+ // Tells the usage of this pixmap.
+ gfx::BufferUsage usage_ = gfx::BufferUsage::SCANOUT;
@@ -142,7 +113,7 @@ index e9b25a7452882..3eb91765eba30 100644
} // namespace ui
diff --git a/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
-index 661859754cd80..665e6de2616bb 100644
+index 8d8621b..a1ca29c 100644
--- a/ui/ozone/platform/wayland/ozone_platform_wayland.cc
+++ b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
@@ -289,6 +289,9 @@ class OzonePlatformWayland : public OzonePlatform,
@@ -154,3 +125,4 @@ index 661859754cd80..665e6de2616bb 100644
+
initialised = true;
}
+
diff --git a/remove-no-opaque-pointers-flag.patch b/remove-no-opaque-pointers-flag.patch
index a8eba730836e..9bd434a9b83a 100644
--- a/remove-no-opaque-pointers-flag.patch
+++ b/remove-no-opaque-pointers-flag.patch
@@ -1,12 +1,12 @@
---- chromium-102.0.5005.61/build/config/compiler/BUILD.gn.orig 2022-05-19 10:35:52.991415777 +0000
-+++ chromium-102.0.5005.61/build/config/compiler/BUILD.gn 2022-05-19 10:36:11.102017131 +0000
-@@ -1538,15 +1538,6 @@ config("default_warnings") {
- cflags += [ "-Wno-deprecated-non-prototype" ]
+--- 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/1316298): Re-enable once test failure is figured out
+- # TODO(https://crbug.com/1322823): Remove flags once potential miscompile is investigated.
- cflags += [
- "-Xclang",
- "-no-opaque-pointers",
diff --git a/sql-make-VirtualCursor-standard-layout-type.patch b/sql-make-VirtualCursor-standard-layout-type.patch
deleted file mode 100644
index 3364d41ee07a..000000000000
--- a/sql-make-VirtualCursor-standard-layout-type.patch
+++ /dev/null
@@ -1,238 +0,0 @@
-From 144479ad7b4287bee4067f95e4218f614798a865 Mon Sep 17 00:00:00 2001
-From: Stephan Hartmann <stha09@googlemail.com>
-Date: Sun, 16 Jan 2022 19:15:26 +0000
-Subject: [PATCH] sql: make VirtualCursor standard layout type
-
-sql::recover::VirtualCursor needs to be a standard layout type, but
-has members of type std::unique_ptr. However, std::unique_ptr is not
-guaranteed to be standard layout. Compiling with clang combined with
-gcc-11 libstdc++ fails because of this.
-
-Bug: 1189788
-Change-Id: Ia6dc388cc5ef1c0f2afc75f8ca45b9f12687ca9c
----
- sql/recover_module/btree.cc | 18 ++++++++++++------
- sql/recover_module/btree.h | 21 +++++++++++++++------
- sql/recover_module/cursor.cc | 24 ++++++++++++------------
- sql/recover_module/cursor.h | 2 +-
- sql/recover_module/pager.cc | 5 ++---
- sql/recover_module/pager.h | 6 +++---
- 6 files changed, 45 insertions(+), 31 deletions(-)
-
-diff --git a/sql/recover_module/btree.cc b/sql/recover_module/btree.cc
-index cc9420e5c05..f12d8fa32a2 100644
---- a/sql/recover_module/btree.cc
-+++ b/sql/recover_module/btree.cc
-@@ -136,16 +136,22 @@ static_assert(std::is_trivially_destructible<LeafPageDecoder>::value,
- "Move the destructor to the .cc file if it's non-trival");
- #endif // !DCHECK_IS_ON()
-
--LeafPageDecoder::LeafPageDecoder(DatabasePageReader* db_reader) noexcept
-- : page_id_(db_reader->page_id()),
-- db_reader_(db_reader),
-- cell_count_(ComputeCellCount(db_reader)),
-- next_read_index_(0),
-- last_record_size_(0) {
-+LeafPageDecoder::LeafPageDecoder() noexcept = default;
-+
-+void LeafPageDecoder::Initialize(DatabasePageReader* db_reader) {
-+ page_id_ = db_reader->page_id();
-+ db_reader_ = db_reader;
-+ cell_count_ = ComputeCellCount(db_reader);
-+ next_read_index_ = 0;
-+ last_record_size_ = 0;
- DCHECK(IsOnValidPage(db_reader));
- DCHECK(DatabasePageReader::IsValidPageId(page_id_));
- }
-
-+void LeafPageDecoder::Reset() {
-+ db_reader_ = nullptr;
-+}
-+
- bool LeafPageDecoder::TryAdvance() {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- DCHECK(CanAdvance());
-diff --git a/sql/recover_module/btree.h b/sql/recover_module/btree.h
-index eaa087a5c52..df0e0c937c0 100644
---- a/sql/recover_module/btree.h
-+++ b/sql/recover_module/btree.h
-@@ -101,9 +101,7 @@ class LeafPageDecoder {
- public:
- // Creates a decoder for a DatabasePageReader's last read page.
- //
-- // |db_reader| must have been used to read an inner page of a table B-tree.
-- // |db_reader| must outlive this instance.
-- explicit LeafPageDecoder(DatabasePageReader* db_reader) noexcept;
-+ LeafPageDecoder() noexcept;
- ~LeafPageDecoder() noexcept = default;
-
- LeafPageDecoder(const LeafPageDecoder&) = delete;
-@@ -151,6 +149,17 @@ class LeafPageDecoder {
- // read as long as CanAdvance() returns true.
- bool TryAdvance();
-
-+ // Initialize with DatabasePageReader
-+ // |db_reader| must have been used to read an inner page of a table B-tree.
-+ // |db_reader| must outlive this instance.
-+ void Initialize(DatabasePageReader* db_reader);
-+
-+ // Reset internal DatabasePageReader
-+ void Reset();
-+
-+ // True if DatabasePageReader is valid
-+ bool IsValid() { return (db_reader_ != nullptr); }
-+
- // True if the given reader may point to an inner page in a table B-tree.
- //
- // The last ReadPage() call on |db_reader| must have succeeded.
-@@ -164,14 +173,14 @@ class LeafPageDecoder {
- static int ComputeCellCount(DatabasePageReader* db_reader);
-
- // The number of the B-tree page this reader is reading.
-- const int64_t page_id_;
-+ int64_t page_id_;
- // Used to read the tree page.
- //
- // Raw pointer usage is acceptable because this instance's owner is expected
- // to ensure that the DatabasePageReader outlives this.
-- DatabasePageReader* const db_reader_;
-+ DatabasePageReader* db_reader_;
- // Caches the ComputeCellCount() value for this reader's page.
-- const int cell_count_ = ComputeCellCount(db_reader_);
-+ int cell_count_;
-
- // The reader's cursor state.
- //
-diff --git a/sql/recover_module/cursor.cc b/sql/recover_module/cursor.cc
-index 4f827edf1b4..240de4999fe 100644
---- a/sql/recover_module/cursor.cc
-+++ b/sql/recover_module/cursor.cc
-@@ -28,7 +28,7 @@ VirtualCursor::~VirtualCursor() {
- int VirtualCursor::First() {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- inner_decoders_.clear();
-- leaf_decoder_ = nullptr;
-+ leaf_decoder_.Reset();
-
- AppendPageDecoder(table_->root_page_id());
- return Next();
-@@ -38,18 +38,18 @@ int VirtualCursor::Next() {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- record_reader_.Reset();
-
-- while (!inner_decoders_.empty() || leaf_decoder_.get()) {
-- if (leaf_decoder_.get()) {
-- if (!leaf_decoder_->CanAdvance()) {
-+ while (!inner_decoders_.empty() || leaf_decoder_.IsValid()) {
-+ if (leaf_decoder_.IsValid()) {
-+ if (!leaf_decoder_.CanAdvance()) {
- // The leaf has been exhausted. Remove it from the DFS stack.
-- leaf_decoder_ = nullptr;
-+ leaf_decoder_.Reset();
- continue;
- }
-- if (!leaf_decoder_->TryAdvance())
-+ if (!leaf_decoder_.TryAdvance())
- continue;
-
-- if (!payload_reader_.Initialize(leaf_decoder_->last_record_size(),
-- leaf_decoder_->last_record_offset())) {
-+ if (!payload_reader_.Initialize(leaf_decoder_.last_record_size(),
-+ leaf_decoder_.last_record_offset())) {
- continue;
- }
- if (!record_reader_.Initialize())
-@@ -101,13 +101,13 @@ int VirtualCursor::ReadColumn(int column_index,
- int64_t VirtualCursor::RowId() {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- DCHECK(record_reader_.IsInitialized());
-- DCHECK(leaf_decoder_.get());
-- return leaf_decoder_->last_record_rowid();
-+ DCHECK(leaf_decoder_.IsValid());
-+ return leaf_decoder_.last_record_rowid();
- }
-
- void VirtualCursor::AppendPageDecoder(int page_id) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-- DCHECK(leaf_decoder_.get() == nullptr)
-+ DCHECK(!leaf_decoder_.IsValid())
- << __func__
- << " must only be called when the current path has no leaf decoder";
-
-@@ -115,7 +115,7 @@ void VirtualCursor::AppendPageDecoder(int page_id) {
- return;
-
- if (LeafPageDecoder::IsOnValidPage(&db_reader_)) {
-- leaf_decoder_ = std::make_unique<LeafPageDecoder>(&db_reader_);
-+ leaf_decoder_.Initialize(&db_reader_);
- return;
- }
-
-diff --git a/sql/recover_module/cursor.h b/sql/recover_module/cursor.h
-index 845b7852648..cc4e85f83f9 100644
---- a/sql/recover_module/cursor.h
-+++ b/sql/recover_module/cursor.h
-@@ -130,7 +130,7 @@ class VirtualCursor {
- std::vector<std::unique_ptr<InnerPageDecoder>> inner_decoders_;
-
- // Decodes the leaf page containing records.
-- std::unique_ptr<LeafPageDecoder> leaf_decoder_;
-+ LeafPageDecoder leaf_decoder_;
-
- SEQUENCE_CHECKER(sequence_checker_);
- };
-diff --git a/sql/recover_module/pager.cc b/sql/recover_module/pager.cc
-index 58e75de2704..69d98cef98d 100644
---- a/sql/recover_module/pager.cc
-+++ b/sql/recover_module/pager.cc
-@@ -23,8 +23,7 @@ static_assert(DatabasePageReader::kMaxPageId <= std::numeric_limits<int>::max(),
- "ints are not appropriate for representing page IDs");
-
- DatabasePageReader::DatabasePageReader(VirtualTable* table)
-- : page_data_(std::make_unique<uint8_t[]>(table->page_size())),
-- table_(table) {
-+ : page_data_(table->page_size()), table_(table) {
- DCHECK(table != nullptr);
- DCHECK(IsValidPageSize(table->page_size()));
- }
-@@ -58,7 +57,7 @@ int DatabasePageReader::ReadPage(int page_id) {
- "The |read_offset| computation above may overflow");
-
- int sqlite_status =
-- RawRead(sqlite_file, read_size, read_offset, page_data_.get());
-+ RawRead(sqlite_file, read_size, read_offset, page_data_.data());
-
- // |page_id_| needs to be set to kInvalidPageId if the read failed.
- // Otherwise, future ReadPage() calls with the previous |page_id_| value
-diff --git a/sql/recover_module/pager.h b/sql/recover_module/pager.h
-index 07cac3cb989..d08f0932fab 100644
---- a/sql/recover_module/pager.h
-+++ b/sql/recover_module/pager.h
-@@ -6,8 +6,8 @@
- #define SQL_RECOVER_MODULE_PAGER_H_
-
- #include <cstdint>
--#include <memory>
- #include <ostream>
-+#include <vector>
-
- #include "base/check_op.h"
- #include "base/memory/raw_ptr.h"
-@@ -72,7 +72,7 @@ class DatabasePageReader {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- DCHECK_NE(page_id_, kInvalidPageId)
- << "Successful ReadPage() required before accessing pager state";
-- return page_data_.get();
-+ return page_data_.data();
- }
-
- // The number of bytes in the page read by the last ReadPage() call.
-@@ -139,7 +139,7 @@ class DatabasePageReader {
- int page_id_ = kInvalidPageId;
- // Stores the bytes of the last page successfully read by ReadPage().
- // The content is undefined if the last call to ReadPage() did not succeed.
-- const std::unique_ptr<uint8_t[]> page_data_;
-+ std::vector<uint8_t> page_data_;
- // Raw pointer usage is acceptable because this instance's owner is expected
- // to ensure that the VirtualTable outlives this.
- const raw_ptr<VirtualTable> table_;
diff --git a/x11-ozone-fix-X11-screensaver-suspension.patch b/x11-ozone-fix-X11-screensaver-suspension.patch
new file mode 100644
index 000000000000..4336d6a7a0a4
--- /dev/null
+++ b/x11-ozone-fix-X11-screensaver-suspension.patch
@@ -0,0 +1,490 @@
+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;