[wam][cef] Add the CEF recipe 36/29036/5
authorRoger Zanoni <rzanoni@igalia.com>
Thu, 22 Jun 2023 07:15:24 +0000 (09:15 +0200)
committerRoger Zanoni <rzanoni@igalia.com>
Tue, 18 Jul 2023 13:28:52 +0000 (15:28 +0200)
This change makes it possible to build applications that depend on
libcef, and also adds a few changes picked from our previous
implementation that enables the applications to communicate with the
agl-compositor.

Bug-AGL: SPEC-3872

Signed-off-by: Roger Zanoni <rzanoni@igalia.com>
Change-Id: I215138b8f5d63da84ada2f8c006f4025f0b3fafb

21 files changed:
recipes-wam/cef/cef_git.bb [new file with mode: 0644]
recipes-wam/cef/files/cef/0001-Add-an-option-to-use-an-output-directory-outside-src.patch [new file with mode: 0644]
recipes-wam/cef/files/cef/0002-Add-an-option-to-override-the-default-distrib-direct.patch [new file with mode: 0644]
recipes-wam/cef/files/cef/0003-Add-an-option-to-use-an-alternative-base-output-dire.patch [new file with mode: 0644]
recipes-wam/cef/files/cef/0004-Add-an-option-to-bypass-sysroot-checking-and-force.patch [new file with mode: 0644]
recipes-wam/cef/files/cef/0005-Linux-Fix-build-without-X11-fixes-issue-3431.patch [new file with mode: 0644]
recipes-wam/cef/files/cef/0006-Add-AGL-wayland-window-related-calls.patch [new file with mode: 0644]
recipes-wam/cef/files/cef/0007-Add-a-method-to-check-if-the-agl-window-is-configure.patch [new file with mode: 0644]
recipes-wam/cef/files/cef/0008-Add-the-SetActivateRegion-method.patch [new file with mode: 0644]
recipes-wam/cef/files/cef/0009-Allow-passing-the-app_id-on-widget-creation.patch [new file with mode: 0644]
recipes-wam/cef/files/cef/0010-Update-generated-api-wrapper-files.patch [new file with mode: 0644]
recipes-wam/cef/files/chromium/0001-sql-relax-constraints-on-VirtualCursor-layout.patch [new file with mode: 0644]
recipes-wam/cef/files/chromium/0002-Don-t-look-for-depot_tools-in-chrommium-s-third_part.patch [new file with mode: 0644]
recipes-wam/cef/files/chromium/0003-Remove-the-GN-settings-done-for-clang-that-conflict-.patch [new file with mode: 0644]
recipes-wam/cef/files/chromium/0004-Don-t-use-DRI-for-renesas.patch [new file with mode: 0644]
recipes-wam/cef/files/chromium/0005-Add-the-essential-parts-of-wayland-extensions-and-ag.patch [new file with mode: 0644]
recipes-wam/cef/files/chromium/0006-Add-webos-agl-waylandwindow-window-tree-host-essenti.patch [new file with mode: 0644]
recipes-wam/cef/files/chromium/0007-Only-bind-to-agl_shell-if-it-s-the-browser-process.patch [new file with mode: 0644]
recipes-wam/cef/files/chromium/0008-Add-a-method-to-check-if-the-agl-window-is-configure.patch [new file with mode: 0644]
recipes-wam/cef/files/chromium/0009-Start-using-agl-shell-version-4.patch [new file with mode: 0644]
recipes-wam/cef/gn-utils.inc [new file with mode: 0644]

diff --git a/recipes-wam/cef/cef_git.bb b/recipes-wam/cef/cef_git.bb
new file mode 100644 (file)
index 0000000..1d1d83c
--- /dev/null
@@ -0,0 +1,320 @@
+require gn-utils.inc
+
+LICENSE = "Apache-2.0 & BSD-3-Clause & LGPL-2.0-only & LGPL-2.1-only"
+
+LIC_FILES_CHKSUM = "\
+    file://LICENSE;md5=c408a301e3407c3803499ce9290515d6 \
+    file://third_party/blink/renderer/core/LICENSE-LGPL-2;md5=36357ffde2b64ae177b2494445b79d21 \
+    file://third_party/blink/renderer/core/LICENSE-LGPL-2.1;md5=a778a33ef338abbaf8b8a7c36b6eec80 \
+"
+CHROMIUM_URL = "github.com/rogerzanoni/chromium108.git"
+CHROMIUM_VERSION = "108.0.5359.125"
+BRANCH_chromium108 = "5359"
+# Taken from https://bitbucket.org/chromiumembedded/cef/src/5615/CHROMIUM_BUILD_COMPATIBILITY.txt
+SRCREV_chromium108 = "fe6cbc05f1ec805339364b0df0e8be925a991a80"
+SRCREV_cef = "a98cd4cdc0fdc49b6c38ba10cec800922745441e"
+GN_TARGET_CPU = "${@gn_arch_name('${TUNE_ARCH}')}"
+
+PV = "${CHROMIUM_VERSION}.${BRANCH_chromium108}+git"
+
+FILESEXTRAPATHS:prepend := "${THISDIR}/files/cef:"
+FILESEXTRAPATHS:prepend := "${THISDIR}/files/chromium:"
+
+SRC_URI = "\
+    git://${CHROMIUM_URL};branch=${BRANCH_chromium108};protocol=https;rev=${SRCREV_chromium108};name=chromium108;destsuffix=git/chromium/src \
+    file://0001-sql-relax-constraints-on-VirtualCursor-layout.patch \
+    file://0002-Don-t-look-for-depot_tools-in-chrommium-s-third_part.patch \
+    file://0003-Remove-the-GN-settings-done-for-clang-that-conflict-.patch \
+    file://0004-Don-t-use-DRI-for-renesas.patch \
+    file://0005-Add-the-essential-parts-of-wayland-extensions-and-ag.patch \
+    file://0006-Add-webos-agl-waylandwindow-window-tree-host-essenti.patch \
+    file://0007-Only-bind-to-agl_shell-if-it-s-the-browser-process.patch \
+    file://0008-Add-a-method-to-check-if-the-agl-window-is-configure.patch \
+    file://0009-Start-using-agl-shell-version-4.patch \
+    \
+    git://bitbucket.org/chromiumembedded/cef.git;branch=${BRANCH_chromium108};protocol=https;rev=${SRCREV_cef};name=cef;destsuffix=git/chromium/src/cef \
+    file://0001-Add-an-option-to-use-an-output-directory-outside-src.patch;patchdir=cef \
+    file://0002-Add-an-option-to-override-the-default-distrib-direct.patch;patchdir=cef \
+    file://0003-Add-an-option-to-use-an-alternative-base-output-dire.patch;patchdir=cef \
+    file://0004-Add-an-option-to-bypass-sysroot-checking-and-force.patch;patchdir=cef \
+    file://0005-Linux-Fix-build-without-X11-fixes-issue-3431.patch;patchdir=cef \
+    file://0006-Add-AGL-wayland-window-related-calls.patch;patchdir=cef \
+    file://0007-Add-a-method-to-check-if-the-agl-window-is-configure.patch;patchdir=cef \
+    file://0008-Add-the-SetActivateRegion-method.patch;patchdir=cef \
+    file://0009-Allow-passing-the-app_id-on-widget-creation.patch;patchdir=cef \
+    file://0010-Update-generated-api-wrapper-files.patch;patchdir=cef \
+"
+
+BASE_DIR = "${WORKDIR}/git/chromium"
+CHROMIUM_DIR = "${BASE_DIR}/src"
+CEF_DIR = "${CHROMIUM_DIR}/cef"
+DEPOT_TOOLS_DIR="${STAGING_DIR_NATIVE}${datadir}/depot_tools"
+S = "${BASE_DIR}/src"
+B = "${WORKDIR}/build"
+
+OUT_PATH = "${B}/out/Release_GN_${GN_TARGET_CPU}"
+DIST_PATH = "${OUT_PATH}/dist/cef-minimal_${GN_TARGET_CPU}"
+CEF_DATA_PATH = "${datadir}/cef"
+
+DEPENDS:append = " curl clang-native gperf-native wayland dbus libcxx compiler-rt libxkbcommon nss nss-native atk at-spi2-atk libdrm pango cairo virtual/egl qemu-native pciutils glib-2.0 pkgconfig-native pulseaudio"
+
+do_sync[depends] += "depot-tools-wam-native:do_populate_sysroot"
+do_configure[depends] += "depot-tools-wam-native:do_populate_sysroot"
+do_compile[depends] += "depot-tools-wam-native:do_populate_sysroot"
+
+DOWNLOAD_PGO_PROFILES="False"
+
+# Adapted from CEF's tools/gclient_hooks.py
+python do_gclient_config() {
+  import os
+  # Create gclient configuration file.
+  gclient_file = os.path.join(d.expand('${BASE_DIR}'), '.gclient')
+  # Exclude unnecessary directories. Intentionally written without newlines.
+  gclient_spec = \
+      "solutions = [{"+\
+        "'managed': False,"+\
+        "'name': 'src', "+\
+        "'url': '" + d.expand('https://${CHROMIUM_URL}') + "', "+\
+        "'custom_vars': {"+\
+          d.expand("'checkout_pgo_profiles': '${DOWNLOAD_PGO_PROFILES}'") +\
+        "}, "+\
+        "'custom_deps': {"+\
+          "'build': None, "+\
+          "'build/scripts/command_wrapper/bin': None, "+\
+          "'build/scripts/gsd_generate_index': None, "+\
+          "'build/scripts/private/data/reliability': None, "+\
+          "'build/scripts/tools/deps2git': None, "+\
+          "'build/third_party/lighttpd': None, "+\
+          "'commit-queue': None, "+\
+          "'depot_tools': None, "+\
+          "'src/chrome_frame/tools/test/reference_build/chrome': None, "+\
+          "'src/chrome/tools/test/reference_build/chrome_linux': None, "+\
+          "'src/chrome/tools/test/reference_build/chrome_mac': None, "+\
+          "'src/chrome/tools/test/reference_build/chrome_win': None, "+\
+        "}, "+\
+        "'deps_file': 'DEPS', "+\
+        "'safesync_url': ''"+\
+      "}]"
+
+  with open(gclient_file, 'w+', encoding='utf-8') as fp:
+    fp.write(gclient_spec)
+}
+addtask do_gclient_config after do_unpack before do_configure
+
+# Mostly adapted from CEF's tools/automate/automate-git.py
+do_sync[network] = "1"
+python do_sync() {
+  import os
+  def cef_run(command_line, working_dir):
+    import subprocess
+    env = os.environ
+    env['PATH'] = d.expand("${DEPOT_TOOLS_DIR}") + os.pathsep + env['PATH']
+    env['DEPOT_TOOLS_UPDATE'] = "0"
+    env['GCLIENT_PY3'] = "1"
+
+    subprocess.check_output(command_line.split(),
+                            cwd=working_dir,
+                            env=env,
+                            shell=False,
+                            stderr=subprocess.STDOUT)
+
+  def cef_apply_patch(name, patches_path=os.path.join(d.expand("${CEF_DIR}"), 'patch', 'patches')):
+    patch_file = os.path.join(patches_path, name)
+    if not os.path.exists(patch_file + ".patch"):
+      # Attempt to apply the patch file.
+      patch_tool = os.path.join(d.expand("${CEF_DIR}"), 'tools', 'patcher.py')
+      cef_run('%s %s --patch-file "%s" --patch-dir "%s"' %
+              ("python3", patch_tool, patch_file, d.expand("${CHROMIUM_DIR}")),
+              d.expand("${CHROMIUM_DIR}"))
+
+  def cef_apply_deps_patch():
+    """ Patch the Chromium DEPS file before `gclient sync` if necessary. """
+    deps_path = os.path.join(d.expand("${CHROMIUM_DIR}"), 'DEPS')
+    if os.path.isfile(deps_path):
+      cef_apply_patch('DEPS')
+    else:
+      raise Exception("Path does not exist: DEPS")
+
+  def cef_apply_runhooks_patch():
+    """ Patch the Chromium runhooks files before `gclient runhooks` if necessary. """
+    cef_apply_patch('runhooks')
+
+  # CEF automation script usually applies
+  # applies patches before running sync and
+  # runhooks. This is taken directly from the
+  # automation script
+  def cef_do_sync():
+    cef_apply_deps_patch()
+    cef_run("gclient sync --reset --nohooks --jobs 16", d.expand("${CHROMIUM_DIR}"))
+    cef_apply_runhooks_patch()
+    cef_run("gclient runhooks --jobs 16", d.expand("${CHROMIUM_DIR}"))
+
+  cef_do_sync()
+}
+addtask do_sync after do_gclient_config before do_configure
+
+# gn defaults from CEF wiki, except for use_sysroot
+GN_DEFINES = "use_sysroot=false \
+              symbol_level=0 \
+              is_cfi=false \
+              use_thin_lto=false \
+"
+
+# Disable GTK and prevent cef from
+# building its gtk demos
+GN_DEFINES:append = " \
+              use_gtk=false \
+              cef_use_gtk=false \
+"
+
+GN_DEFINES:append = " \
+              treat_warnings_as_errors=false \
+              is_component_build=false \
+              use_cups=false \
+              use_kerberos=false \
+              use_ozone=true \
+              use_xkbcommon=true \
+              use_wayland_gbm=true \
+              use_gnome_keyring=false \
+              enable_remoting=false \
+"
+
+# ozone options
+GN_DEFINES:append = " \
+              use_ozone=true \
+              ozone_auto_platforms=false \
+              ozone_platform_headless=true \
+              ozone_platform_wayland=true \
+              ozone_platform_x11=false \
+              use_system_minigbm=true \
+              use_system_libdrm=true \
+              use_system_libwayland=true \
+"
+
+GN_DEFINES:append = " \
+              dcheck_always_on=false \
+              is_debug=false \
+              is_official_build=false \
+"
+
+GN_DEFINES:append = " \
+              use_egl=true \
+              use_glib=true \
+              use_dri=false \
+"
+
+# Disable PGO optimizations
+GN_DEFINES:append = " chrome_pgo_phase=0 "
+
+RUNTIME = "llvm"
+TOOLCHAIN = "clang"
+TOOLCHAIN:class-native = "clang"
+
+BUILD_AR:toolchain-clang = "llvm-ar"
+BUILD_CC:toolchain-clang = "clang"
+BUILD_CXX:toolchain-clang = "clang++"
+BUILD_LD:toolchain-clang = "clang"
+
+COMPATIBLE_MACHINE = "(-)"
+COMPATIBLE_MACHINE:aarch64 = "(.*)"
+COMPATIBLE_MACHINE:armv6 = "(.*)"
+COMPATIBLE_MACHINE:armv7a = "(.*)"
+COMPATIBLE_MACHINE:armv7ve = "(.*)"
+COMPATIBLE_MACHINE:x86 = "(.*)"
+COMPATIBLE_MACHINE:x86-64 = "(.*)"
+
+GN_DEFINES:append = ' \
+              use_lld=true \
+              use_gold=false \
+              gold_path="" \
+              is_clang=true \
+              clang_use_chrome_plugins=false \
+              clang_base_path="${STAGING_BINDIR_NATIVE}" \
+              host_toolchain=\"//build/toolchain/cros:host\" \
+              use_custom_libcxx_for_host=false \
+              cros_host_ar=\"${BUILD_AR}\" \
+              cros_host_cc=\"${BUILD_CC}\" \
+              cros_host_cxx=\"${BUILD_CXX}\" \
+              cros_host_ld=\"${BUILD_CXX}\" \
+              cros_host_extra_cppflags=\"${BUILD_CPPFLAGS}\" \
+              cros_host_extra_cxxflags=\"${BUILD_CXXFLAGS}\" \
+              cros_host_extra_ldflags=\"${BUILD_LDFLAGS}\" \
+              custom_toolchain=\"//build/toolchain/cros:target\" \
+              use_custom_libcxx=false \
+              target_cpu=\"${GN_TARGET_CPU}\" \
+              cros_target_ar=\"${AR}\" \
+              cros_target_cc=\"${CC}\" \
+              cros_target_cxx=\"${CXX}\" \
+              cros_target_ld=\"${CXX}\" \
+              cros_target_extra_cppflags=\"${CPPFLAGS}\" \
+              cros_target_extra_cxxflags=\"${CXXFLAGS}\" \
+              cros_target_extra_ldflags=\"${LDFLAGS}\" \
+              v8_snapshot_toolchain=\"//build/toolchain/cros:v8_snapshot\" \
+              cros_v8_snapshot_ar=\"${BUILD_AR}\" \
+              cros_v8_snapshot_cc=\"${BUILD_CC}\" \
+              cros_v8_snapshot_cxx=\"${BUILD_CXX}\" \
+              cros_v8_snapshot_cppflags=\"${CPPFLAGS}\" \
+              cros_v8_snapshot_cxxflags=\"${CXXFLAGS}\" \
+              cros_v8_snapshot_ldflags=\"${LDFLAGS}\" \
+              use_v8_context_snapshot=false \
+'
+
+PACKAGECONFIG ??= "upower use-egl"
+PACKAGECONFIG[use-egl] = ",,virtual/egl virtual/libgles2"
+PACKAGECONFIG[upower] = ",,,upower"
+
+GN_DEFINES:append = ' \
+              ${PACKAGECONFIG_CONFARGS} \
+'
+
+do_configure () {
+    bbnote "do_configure:"
+    bbnote "Base out path: ${B}"
+
+    export DEPOT_TOOLS_UPDATE=0
+    export GCLIENT_PY3=1
+    export PATH="${DEPOT_TOOLS_DIR}:$PATH"
+    export GN_DEFINES="${GN_DEFINES}"
+
+    cd ${S}/cef
+    python3 tools/gclient_hook.py --base-out-path ${B} --bypass-sysroot-check
+}
+
+do_compile[progress] = "outof:^\[(\d+)/(\d+)\]\s+"
+do_compile () {
+    if [ ! -f ${OUT_PATH}/build.ninja ]; then
+         do_configure
+    fi
+
+    export PATH="${DEPOT_TOOLS_DIR}:$PATH"
+    export PATH="$PATH:${S}/third_party/ninja"
+    ninja ${PARALLEL_MAKE} -C ${OUT_PATH} libcef chrome_sandbox
+}
+
+do_install () {
+    cd ${S}/cef
+    python3 tools/make_distrib.py --output-dir ${OUT_PATH}/dist \
+                                  --dist-path-name cef-minimal \
+                                  --base-out-path ${B} \
+                                  --no-docs \
+                                  --no-symbols \
+                                  --no-archive \
+                                  --ninja-build \
+                                  --minimal \
+                                  --${GN_TARGET_CPU}-build \
+                                  --ozone
+
+    install -d ${D}${CEF_DATA_PATH}
+
+    cp -R --no-dereference --preserve=mode,links -v ${DIST_PATH}/* ${D}${CEF_DATA_PATH}
+    # TODO(rzanoni): Follow the wiki instructions to install the sandbox
+}
+
+# TODO: fix QA issues, libraries in the wrong location
+FILES:${PN} += " \
+    ${CEF_DATA_PATH} \
+"
+
+INSANE_SKIP:${PN} += "libdir"
+
+PROVIDES:${PN} += "cef"
diff --git a/recipes-wam/cef/files/cef/0001-Add-an-option-to-use-an-output-directory-outside-src.patch b/recipes-wam/cef/files/cef/0001-Add-an-option-to-use-an-output-directory-outside-src.patch
new file mode 100644 (file)
index 0000000..5d3cdac
--- /dev/null
@@ -0,0 +1,38 @@
+From 7b7f5d77e87351cb98b7932eaf8959feaf280215 Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Mon, 24 Apr 2023 10:52:57 +0200
+Subject: [PATCH 01/10] Add an option to use an output directory outside src
+
+---
+ tools/make_distrib.py | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/tools/make_distrib.py b/tools/make_distrib.py
+index 7122fae19..045430ea3 100644
+--- a/tools/make_distrib.py
++++ b/tools/make_distrib.py
+@@ -457,6 +457,12 @@ This utility builds the CEF Binary Distribution.
+ """
+ parser = OptionParser(description=disc)
++
++parser.add_option(
++    '--base-out-path',
++    dest='baseoutpath',
++    default='',
++    help="Use an anternative base path for the generated gn outputs instead of using chromium source dir")
+ parser.add_option(
+     '--output-dir',
+     dest='outputdir',
+@@ -698,6 +704,8 @@ else:
+ # Determine the build directory paths.
+ out_dir = os.path.join(src_dir, 'out')
++if options.baseoutpath != '':
++  out_dir = os.path.join(options.baseoutpath, 'out')
+ build_dir_debug = os.path.join(out_dir, 'Debug' + build_dir_suffix)
+ build_dir_release = os.path.join(out_dir, 'Release' + build_dir_suffix)
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/cef/0002-Add-an-option-to-override-the-default-distrib-direct.patch b/recipes-wam/cef/files/cef/0002-Add-an-option-to-override-the-default-distrib-direct.patch
new file mode 100644 (file)
index 0000000..c3df4b2
--- /dev/null
@@ -0,0 +1,39 @@
+From 1da1ed1f7035bdb0a4528962c048b7365369f8fd Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Mon, 24 Apr 2023 13:56:10 +0200
+Subject: [PATCH 02/10] Add an option to override the default distrib directory
+ name
+
+---
+ tools/make_distrib.py | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/tools/make_distrib.py b/tools/make_distrib.py
+index 045430ea3..a858e8ff6 100644
+--- a/tools/make_distrib.py
++++ b/tools/make_distrib.py
+@@ -463,6 +463,11 @@ parser.add_option(
+     dest='baseoutpath',
+     default='',
+     help="Use an anternative base path for the generated gn outputs instead of using chromium source dir")
++parser.add_option(
++    '--dist-path-name',
++    dest='distpathname',
++    default='',
++    help="Override the default name of the distribution output path.")
+ parser.add_option(
+     '--output-dir',
+     dest='outputdir',
+@@ -675,6 +680,9 @@ else:
+ if options.ozone:
+   output_dir_name = output_dir_name + '_ozone'
++if options.distpathname != '':
++  output_dir_name = options.distpathname + '_' + binary_arch
++
+ output_dir = create_output_dir(output_dir_name, options.outputdir)
+ # create the README.TXT file
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/cef/0003-Add-an-option-to-use-an-alternative-base-output-dire.patch b/recipes-wam/cef/files/cef/0003-Add-an-option-to-use-an-alternative-base-output-dire.patch
new file mode 100644 (file)
index 0000000..b8dd3bd
--- /dev/null
@@ -0,0 +1,62 @@
+From 33aa8b58d5c5d189dcd51d465f1d9d39c740146e Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Thu, 30 Mar 2023 15:22:32 +0200
+Subject: [PATCH 03/10] Add an option to use an alternative base output
+ directory
+
+---
+ tools/gclient_hook.py | 19 +++++++++++++++++--
+ 1 file changed, 17 insertions(+), 2 deletions(-)
+
+diff --git a/tools/gclient_hook.py b/tools/gclient_hook.py
+index 290487433..4e5f9f687 100644
+--- a/tools/gclient_hook.py
++++ b/tools/gclient_hook.py
+@@ -6,12 +6,23 @@
+ from __future__ import absolute_import
+ from __future__ import print_function
+ from file_util import make_dir, write_file
++from optparse import OptionParser
+ from gclient_util import *
+ from gn_args import GetAllPlatformConfigs, GetConfigFileContents
+ import issue_1999
+ import os
+ import sys
++parser = OptionParser()
++
++parser.add_option(
++    '--base-out-path',
++    dest='baseoutpath',
++    default='',
++    help="Use an anternative base path for the generated gn outputs instead of using chromium source dir")
++
++(options, args) = parser.parse_args()
++
+ # The CEF directory is the parent directory of _this_ script.
+ cef_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
+ # The src directory is the parent directory of the CEF directory.
+@@ -133,14 +144,18 @@ if platform == 'windows':
+ configs = GetAllPlatformConfigs(gn_args)
+ for dir, config in configs.items():
+   # Create out directories and write the args.gn file.
+-  out_path = os.path.join(src_dir, 'out', dir)
++  base_out_dir = src_dir
++  if options.baseoutpath != '':
++    base_out_dir = options.baseoutpath
++  out_path = os.path.join(base_out_dir, 'out', dir)
+   make_dir(out_path, False)
+   args_gn_path = os.path.join(out_path, 'args.gn')
+   args_gn_contents = GetConfigFileContents(config)
+   write_file(args_gn_path, args_gn_contents)
+   # Generate the Ninja config.
+-  cmd = ['gn', 'gen', os.path.join('out', dir)]
++  cmd = ['gn', 'gen', os.path.join('out', out_path)]
++
+   if 'GN_ARGUMENTS' in os.environ.keys():
+     cmd.extend(os.environ['GN_ARGUMENTS'].split(' '))
+   RunAction(src_dir, cmd)
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/cef/0004-Add-an-option-to-bypass-sysroot-checking-and-force.patch b/recipes-wam/cef/files/cef/0004-Add-an-option-to-bypass-sysroot-checking-and-force.patch
new file mode 100644 (file)
index 0000000..7755da6
--- /dev/null
@@ -0,0 +1,134 @@
+From 4b16bef4a219af372d022f0ec4f15befb1449808 Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Tue, 16 May 2023 16:11:15 +0200
+Subject: [PATCH 04/10] Add an option to bypass sysroot checking and force
+
+---
+ tools/gclient_hook.py |  8 +++++++-
+ tools/gn_args.py      | 28 ++++++++++++++--------------
+ 2 files changed, 21 insertions(+), 15 deletions(-)
+
+diff --git a/tools/gclient_hook.py b/tools/gclient_hook.py
+index 4e5f9f687..6a7bc0d46 100644
+--- a/tools/gclient_hook.py
++++ b/tools/gclient_hook.py
+@@ -20,6 +20,12 @@ parser.add_option(
+     dest='baseoutpath',
+     default='',
+     help="Use an anternative base path for the generated gn outputs instead of using chromium source dir")
++parser.add_option(
++    '--bypass-sysroot-check',
++    action='store_true',
++    dest='bypasssysrootcheck',
++    default=False,
++    help='Don\'t chech if the sysroot exist while generating output directores.')
+ (options, args) = parser.parse_args()
+@@ -141,7 +147,7 @@ if platform == 'windows':
+     gn_args['visual_studio_runtime_dirs'] = os.environ['VS_CRT_ROOT']
+     gn_args['windows_sdk_path'] = os.environ['SDK_ROOT']
+-configs = GetAllPlatformConfigs(gn_args)
++configs = GetAllPlatformConfigs(gn_args, bypass_sysroot_check=options.bypasssysrootcheck)
+ for dir, config in configs.items():
+   # Create out directories and write the args.gn file.
+   base_out_dir = src_dir
+diff --git a/tools/gn_args.py b/tools/gn_args.py
+index 563a6b9cc..f782bd765 100644
+--- a/tools/gn_args.py
++++ b/tools/gn_args.py
+@@ -323,7 +323,7 @@ def GetMergedArgs(build_args):
+   return MergeDicts(dict, required)
+-def ValidateArgs(args):
++def ValidateArgs(args, bypass_sysroot_check=False):
+   """
+   Validate GN arg combinations that we know about. Also provide suggestions
+   where appropriate.
+@@ -360,11 +360,11 @@ def ValidateArgs(args):
+   if platform == 'linux':
+     if target_cpu == 'x86':
+-      assert use_sysroot, 'target_cpu="x86" requires use_sysroot=true'
++      assert use_sysroot or bypass_sysroot_check, 'target_cpu="x86" requires use_sysroot=true'
+     elif target_cpu == 'arm':
+-      assert use_sysroot, 'target_cpu="arm" requires use_sysroot=true'
++      assert use_sysroot or bypass_sysroot_check, 'target_cpu="arm" requires use_sysroot=true'
+     elif target_cpu == 'arm64':
+-      assert use_sysroot, 'target_cpu="arm64" requires use_sysroot=true'
++      assert use_sysroot or bypass_sysroot_check, 'target_cpu="arm64" requires use_sysroot=true'
+   # ASAN requires Release builds.
+   if is_asan:
+@@ -452,7 +452,7 @@ def ValidateArgs(args):
+           "visual_studio_path requires INCLUDE, LIB and PATH env variables"
+-def GetConfigArgs(args, is_debug, cpu):
++def GetConfigArgs(args, is_debug, cpu, bypass_sysroot_check=False):
+   """
+   Return merged GN args for the configuration and validate.
+   """
+@@ -478,11 +478,11 @@ def GetConfigArgs(args, is_debug, cpu):
+       if key.startswith('arm_'):
+         del result[key]
+-  ValidateArgs(result)
++  ValidateArgs(result, bypass_sysroot_check)
+   return result
+-def GetConfigArgsSandbox(platform, args, is_debug, cpu):
++def GetConfigArgsSandbox(platform, args, is_debug, cpu, bypass_sysroot_check=False):
+   """
+   Return merged GN args for the cef_sandbox configuration and validate.
+   """
+@@ -548,7 +548,7 @@ def LinuxSysrootExists(cpu):
+   return os.path.isdir(os.path.join(sysroot_root, sysroot_name))
+-def GetAllPlatformConfigs(build_args):
++def GetAllPlatformConfigs(build_args, bypass_sysroot_check=False):
+   """
+   Return a map of directory name to GN args for the current platform.
+   """
+@@ -568,10 +568,10 @@ def GetAllPlatformConfigs(build_args):
+   if platform == 'linux':
+     use_sysroot = GetArgValue(args, 'use_sysroot')
+-    if use_sysroot:
++    if bypass_sysroot_check or use_sysroot:
+       # Only generate configurations for sysroots that have been installed.
+       for cpu in ('x64', 'arm', 'arm64'):
+-        if LinuxSysrootExists(cpu):
++        if bypass_sysroot_check or LinuxSysrootExists(cpu):
+           supported_cpus.append(cpu)
+         else:
+           msg('Not generating %s configuration due to missing sysroot directory'
+@@ -593,17 +593,17 @@ def GetAllPlatformConfigs(build_args):
+   for cpu in supported_cpus:
+     if create_debug:
+-      result['Debug_GN_' + cpu] = GetConfigArgs(args, True, cpu)
+-    result['Release_GN_' + cpu] = GetConfigArgs(args, False, cpu)
++      result['Debug_GN_' + cpu] = GetConfigArgs(args, True, cpu, bypass_sysroot_check)
++    result['Release_GN_' + cpu] = GetConfigArgs(args, False, cpu, bypass_sysroot_check)
+     if platform in ('windows', 'mac') and GetArgValue(args,
+                                                       'is_official_build'):
+       # Build cef_sandbox.lib with a different configuration.
+       if create_debug:
+         result['Debug_GN_' + cpu + '_sandbox'] = GetConfigArgsSandbox(
+-            platform, args, True, cpu)
++            platform, args, True, cpu, bypass_sysroot_check)
+       result['Release_GN_' + cpu + '_sandbox'] = GetConfigArgsSandbox(
+-          platform, args, False, cpu)
++          platform, args, False, cpu, bypass_sysroot_check)
+   return result
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/cef/0005-Linux-Fix-build-without-X11-fixes-issue-3431.patch b/recipes-wam/cef/files/cef/0005-Linux-Fix-build-without-X11-fixes-issue-3431.patch
new file mode 100644 (file)
index 0000000..75b44e3
--- /dev/null
@@ -0,0 +1,62 @@
+From b0bdd62be712b69db9164e80d4190d2bc72dcb3c Mon Sep 17 00:00:00 2001
+From: Enrique Turegano Pedruelo <epedruelo@netskope.com>
+Date: Tue, 10 Jan 2023 21:30:47 +0000
+Subject: [PATCH 05/10] Linux: Fix build without X11 (fixes issue #3431)
+
+---
+ .../browser_platform_delegate_native_linux.cc     | 15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+diff --git a/libcef/browser/native/browser_platform_delegate_native_linux.cc b/libcef/browser/native/browser_platform_delegate_native_linux.cc
+index 5972a3134..95ca3df39 100644
+--- a/libcef/browser/native/browser_platform_delegate_native_linux.cc
++++ b/libcef/browser/native/browser_platform_delegate_native_linux.cc
+@@ -16,14 +16,14 @@
+ #include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
+ #include "ui/events/keycodes/dom/dom_key.h"
+ #include "ui/events/keycodes/dom/keycode_converter.h"
+-#include "ui/events/keycodes/keyboard_code_conversion_x.h"
+-#include "ui/events/keycodes/keyboard_code_conversion_xkb.h"
+ #include "ui/events/keycodes/keysym_to_unicode.h"
+ #include "ui/gfx/font_render_params.h"
+ #include "ui/views/widget/widget.h"
+ #if BUILDFLAG(OZONE_PLATFORM_X11)
+ #include "libcef/browser/native/window_x11.h"
++#include "ui/events/keycodes/keyboard_code_conversion_x.h"
++#include "ui/events/keycodes/keyboard_code_conversion_xkb.h"
+ #include "ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h"
+ #endif
+@@ -240,9 +240,15 @@ ui::KeyEvent CefBrowserPlatformDelegateNativeLinux::TranslateUiKeyEvent(
+       static_cast<ui::KeyboardCode>(key_event.windows_key_code);
+   ui::DomCode dom_code =
+       ui::KeycodeConverter::NativeKeycodeToDomCode(key_event.native_key_code);
++
++#if BUILDFLAG(OZONE_PLATFORM_X11)
+   int keysym = ui::XKeysymForWindowsKeyCode(
+       key_code, !!(key_event.modifiers & EVENTFLAG_SHIFT_DOWN));
+   char16_t character = ui::GetUnicodeCharacterFromXKeySym(keysym);
++#else
++  char16_t character = key_event.character;
++#endif
++
+   base::TimeTicks time_stamp = GetEventTimeStamp();
+   if (key_event.type == KEYEVENT_CHAR) {
+@@ -262,7 +268,12 @@ ui::KeyEvent CefBrowserPlatformDelegateNativeLinux::TranslateUiKeyEvent(
+       NOTREACHED();
+   }
++#if BUILDFLAG(OZONE_PLATFORM_X11)
+   ui::DomKey dom_key = ui::XKeySymToDomKey(keysym, character);
++#else
++  ui::DomKey dom_key = ui::DomKey::NONE;
++#endif
++
+   return ui::KeyEvent(type, key_code, dom_code, flags, dom_key, time_stamp);
+ }
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/cef/0006-Add-AGL-wayland-window-related-calls.patch b/recipes-wam/cef/files/cef/0006-Add-AGL-wayland-window-related-calls.patch
new file mode 100644 (file)
index 0000000..36ae779
--- /dev/null
@@ -0,0 +1,201 @@
+From efba58d289ad381c6ca9fae9ded040c816946894 Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Thu, 18 May 2023 10:34:08 +0200
+Subject: [PATCH 06/10] Add AGL wayland window related calls
+
+---
+ include/views/cef_window.h             | 34 ++++++++++++++++
+ libcef/browser/views/view_util.h       | 10 +++++
+ libcef/browser/views/view_util_aura.cc | 54 ++++++++++++++++++++++++++
+ libcef/browser/views/window_impl.cc    | 24 ++++++++++++
+ libcef/browser/views/window_impl.h     | 10 +++++
+ 5 files changed, 132 insertions(+)
+
+diff --git a/include/views/cef_window.h b/include/views/cef_window.h
+index e34e446bd..dfa7821bc 100644
+--- a/include/views/cef_window.h
++++ b/include/views/cef_window.h
+@@ -348,6 +348,40 @@ class CefWindow : public CefPanel {
+   ///
+   /*--cef()--*/
+   virtual void RemoveAllAccelerators() = 0;
++
++  // AGL-related calls
++
++  ///
++  /// Tells the agl compositor to activate the app
++  ///
++  /*--cef()--*/
++  virtual void AglActivateApp(const CefString& app) = 0;
++
++  ///
++  /// Tells the agl compositor the application id
++  ///
++  /*--cef()--*/
++  virtual void AglSetAppId(const CefString& app_id) = 0;
++
++  ///
++  /// Tells the agl compositor that everything is set-up and good to go
++  ///
++  /*--cef()--*/
++  virtual void AglSetAppReady() = 0;
++
++  ///
++  /// Tells the agl compositor that the app is the background application
++  ///
++  /*--cef()--*/
++  virtual void AglSetBackGroundApp() = 0;
++
++  ///
++  /// Tells the agl compositor that the app is a panel
++  ///
++  /*--cef()--*/
++  virtual void AglSetPanelApp(uint32_t edge) = 0;
++
++  // -----------------
+ };
+ #endif  // CEF_INCLUDE_VIEWS_CEF_WINDOW_H_
+diff --git a/libcef/browser/views/view_util.h b/libcef/browser/views/view_util.h
+index 302eee464..505c66d94 100644
+--- a/libcef/browser/views/view_util.h
++++ b/libcef/browser/views/view_util.h
+@@ -141,6 +141,16 @@ CefWindowHandle GetWindowHandle(views::Widget* widget);
+ // Returns the platform window handle for |window|. May return nullptr.
+ CefWindowHandle GetWindowHandle(gfx::NativeWindow window);
++// AGL-Related calls
++
++void AglActivateApp(views::Widget* widget, const std::string& app);
++void AglSetAppId(views::Widget* widget, const std::string& app_id);
++void AglSetAppReady(views::Widget* widget);
++void AglSetBackGroundApp(views::Widget* widget);
++void AglSetPanelApp(views::Widget* widget, uint32_t edge);
++
++// -----------------
++
+ }  // namespace view_util
+ #endif  // CEF_LIBCEF_BROWSER_VIEWS_VIEW_UTIL_H_
+diff --git a/libcef/browser/views/view_util_aura.cc b/libcef/browser/views/view_util_aura.cc
+index 8a144eb33..2ad2f3dc7 100644
+--- a/libcef/browser/views/view_util_aura.cc
++++ b/libcef/browser/views/view_util_aura.cc
+@@ -39,4 +39,58 @@ CefWindowHandle GetWindowHandle(gfx::NativeWindow window) {
+   return kNullWindowHandle;
+ }
++// AGL-Related calls
++
++void AglActivateApp(views::Widget* widget, const std::string& app) {
++  if (!widget) {
++    return;
++  }
++  aura::Window* window = widget->GetNativeWindow();
++  if (window && window->GetRootWindow()) {
++    return window->GetHost()->SetAglActivateApp(app);
++  }
++}
++
++void AglSetAppId(views::Widget* widget, const std::string& app_id) {
++  if (!widget) {
++    return;
++  }
++  aura::Window* window = widget->GetNativeWindow();
++  if (window && window->GetRootWindow()) {
++    return window->GetHost()->SetAglAppId(app_id);
++  }
++}
++
++void AglSetAppReady(views::Widget* widget) {
++  if (!widget) {
++    return;
++  }
++  aura::Window* window = widget->GetNativeWindow();
++  if (window && window->GetRootWindow()) {
++    return window->GetHost()->SetAglReady();
++  }
++}
++
++void AglSetBackGroundApp(views::Widget* widget) {
++  if (!widget) {
++    return;
++  }
++  aura::Window* window = widget->GetNativeWindow();
++  if (window && window->GetRootWindow()) {
++    return window->GetHost()->SetAglBackground();
++  }
++}
++
++void AglSetPanelApp(views::Widget* widget, uint32_t edge) {
++  if (!widget) {
++    return;
++  }
++  aura::Window* window = widget->GetNativeWindow();
++  if (window && window->GetRootWindow()) {
++    return window->GetHost()->SetAglPanel(edge);
++  }
++}
++
++// -----------------
++
+ }  // namespace view_util
+diff --git a/libcef/browser/views/window_impl.cc b/libcef/browser/views/window_impl.cc
+index 64e5c443e..22a4d39f6 100644
+--- a/libcef/browser/views/window_impl.cc
++++ b/libcef/browser/views/window_impl.cc
+@@ -522,6 +522,30 @@ CefWindowHandle CefWindowImpl::GetWindowHandle() {
+   return view_util::GetWindowHandle(widget_);
+ }
++// AGL-Related calls
++
++void CefWindowImpl::AglActivateApp(const CefString& app) {
++  view_util::AglActivateApp(widget_, app);
++}
++
++void CefWindowImpl::AglSetAppId(const CefString& app_id) {
++  view_util::AglSetAppId(widget_, app_id);
++}
++
++void CefWindowImpl::AglSetAppReady() {
++  view_util::AglSetAppReady(widget_);
++}
++
++void CefWindowImpl::AglSetBackGroundApp() {
++  view_util::AglSetBackGroundApp(widget_);
++}
++
++void CefWindowImpl::AglSetPanelApp(uint32_t edge) {
++  view_util::AglSetPanelApp(widget_, edge);
++}
++
++// -----------------
++
+ void CefWindowImpl::SendKeyPress(int key_code, uint32 event_flags) {
+   CEF_REQUIRE_VALID_RETURN_VOID();
+   InitializeUITesting();
+diff --git a/libcef/browser/views/window_impl.h b/libcef/browser/views/window_impl.h
+index f9557d415..ad02904f9 100644
+--- a/libcef/browser/views/window_impl.h
++++ b/libcef/browser/views/window_impl.h
+@@ -132,6 +132,16 @@ class CefWindowImpl
+   views::Widget* widget() const { return widget_; }
++  // AGL-Related calls
++
++  void AglActivateApp(const CefString& app) override;
++  void AglSetAppId(const CefString& app_id) override;
++  void AglSetAppReady() override;
++  void AglSetBackGroundApp() override;
++  void AglSetPanelApp(uint32_t edge) override;
++
++  // -----------------
++
+  private:
+   // Create a new implementation object.
+   // Always call Initialize() after creation.
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/cef/0007-Add-a-method-to-check-if-the-agl-window-is-configure.patch b/recipes-wam/cef/files/cef/0007-Add-a-method-to-check-if-the-agl-window-is-configure.patch
new file mode 100644 (file)
index 0000000..14897f1
--- /dev/null
@@ -0,0 +1,131 @@
+From b22b5302f20678bca5f03fe1738ce06fc799263b Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Fri, 30 Jun 2023 10:27:03 +0200
+Subject: [PATCH 07/10] Add a method to check if the agl window is configured
+
+---
+ include/views/cef_window.h             |  6 ++++++
+ libcef/browser/views/view_util.h       |  1 +
+ libcef/browser/views/view_util_aura.cc | 20 +++++++++++++++-----
+ libcef/browser/views/window_impl.cc    |  4 ++++
+ libcef/browser/views/window_impl.h     |  1 +
+ 5 files changed, 27 insertions(+), 5 deletions(-)
+
+diff --git a/include/views/cef_window.h b/include/views/cef_window.h
+index dfa7821bc..063529964 100644
+--- a/include/views/cef_window.h
++++ b/include/views/cef_window.h
+@@ -381,6 +381,12 @@ class CefWindow : public CefPanel {
+   /*--cef()--*/
+   virtual void AglSetPanelApp(uint32_t edge) = 0;
++  ///
++  /// Tells if the window wayland surface is configured
++  ///
++  /*--cef()--*/
++  virtual bool IsSurfaceConfigured() = 0;
++
+   // -----------------
+ };
+diff --git a/libcef/browser/views/view_util.h b/libcef/browser/views/view_util.h
+index 505c66d94..20b97038b 100644
+--- a/libcef/browser/views/view_util.h
++++ b/libcef/browser/views/view_util.h
+@@ -148,6 +148,7 @@ void AglSetAppId(views::Widget* widget, const std::string& app_id);
+ void AglSetAppReady(views::Widget* widget);
+ void AglSetBackGroundApp(views::Widget* widget);
+ void AglSetPanelApp(views::Widget* widget, uint32_t edge);
++bool IsSurfaceConfigured(views::Widget* widget);
+ // -----------------
+diff --git a/libcef/browser/views/view_util_aura.cc b/libcef/browser/views/view_util_aura.cc
+index 2ad2f3dc7..b5b4f414b 100644
+--- a/libcef/browser/views/view_util_aura.cc
++++ b/libcef/browser/views/view_util_aura.cc
+@@ -47,7 +47,7 @@ void AglActivateApp(views::Widget* widget, const std::string& app) {
+   }
+   aura::Window* window = widget->GetNativeWindow();
+   if (window && window->GetRootWindow()) {
+-    return window->GetHost()->SetAglActivateApp(app);
++    window->GetHost()->SetAglActivateApp(app);
+   }
+ }
+@@ -57,7 +57,7 @@ void AglSetAppId(views::Widget* widget, const std::string& app_id) {
+   }
+   aura::Window* window = widget->GetNativeWindow();
+   if (window && window->GetRootWindow()) {
+-    return window->GetHost()->SetAglAppId(app_id);
++    window->GetHost()->SetAglAppId(app_id);
+   }
+ }
+@@ -67,7 +67,7 @@ void AglSetAppReady(views::Widget* widget) {
+   }
+   aura::Window* window = widget->GetNativeWindow();
+   if (window && window->GetRootWindow()) {
+-    return window->GetHost()->SetAglReady();
++    window->GetHost()->SetAglReady();
+   }
+ }
+@@ -77,7 +77,7 @@ void AglSetBackGroundApp(views::Widget* widget) {
+   }
+   aura::Window* window = widget->GetNativeWindow();
+   if (window && window->GetRootWindow()) {
+-    return window->GetHost()->SetAglBackground();
++    window->GetHost()->SetAglBackground();
+   }
+ }
+@@ -87,7 +87,17 @@ void AglSetPanelApp(views::Widget* widget, uint32_t edge) {
+   }
+   aura::Window* window = widget->GetNativeWindow();
+   if (window && window->GetRootWindow()) {
+-    return window->GetHost()->SetAglPanel(edge);
++    window->GetHost()->SetAglPanel(edge);
++  }
++}
++
++bool IsSurfaceConfigured(views::Widget* widget) {
++  if (!widget) {
++    return false;
++  }
++  aura::Window* window = widget->GetNativeWindow();
++  if (window && window->GetRootWindow()) {
++    return window->GetHost()->IsSurfaceConfigured();
+   }
+ }
+diff --git a/libcef/browser/views/window_impl.cc b/libcef/browser/views/window_impl.cc
+index 22a4d39f6..1b5d196ab 100644
+--- a/libcef/browser/views/window_impl.cc
++++ b/libcef/browser/views/window_impl.cc
+@@ -544,6 +544,10 @@ void CefWindowImpl::AglSetPanelApp(uint32_t edge) {
+   view_util::AglSetPanelApp(widget_, edge);
+ }
++bool CefWindowImpl::IsSurfaceConfigured() {
++  return view_util::IsSurfaceConfigured(widget_);
++}
++
+ // -----------------
+ void CefWindowImpl::SendKeyPress(int key_code, uint32 event_flags) {
+diff --git a/libcef/browser/views/window_impl.h b/libcef/browser/views/window_impl.h
+index ad02904f9..4ab77dbe6 100644
+--- a/libcef/browser/views/window_impl.h
++++ b/libcef/browser/views/window_impl.h
+@@ -139,6 +139,7 @@ class CefWindowImpl
+   void AglSetAppReady() override;
+   void AglSetBackGroundApp() override;
+   void AglSetPanelApp(uint32_t edge) override;
++  bool IsSurfaceConfigured() override;
+   // -----------------
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/cef/0008-Add-the-SetActivateRegion-method.patch b/recipes-wam/cef/files/cef/0008-Add-the-SetActivateRegion-method.patch
new file mode 100644 (file)
index 0000000..ecc806a
--- /dev/null
@@ -0,0 +1,103 @@
+From fcbb9bc7c390f2b9ab54c9f8996140ff83b46538 Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Sun, 2 Jul 2023 12:08:59 +0200
+Subject: [PATCH 08/10] Add the SetActivateRegion method
+
+---
+ include/views/cef_window.h             |  6 ++++++
+ libcef/browser/views/view_util.h       |  1 +
+ libcef/browser/views/view_util_aura.cc | 17 +++++++++++++++++
+ libcef/browser/views/window_impl.cc    |  7 +++++++
+ libcef/browser/views/window_impl.h     |  1 +
+ 5 files changed, 32 insertions(+)
+
+diff --git a/include/views/cef_window.h b/include/views/cef_window.h
+index 063529964..52ccb7dc5 100644
+--- a/include/views/cef_window.h
++++ b/include/views/cef_window.h
+@@ -387,6 +387,12 @@ class CefWindow : public CefPanel {
+   /*--cef()--*/
+   virtual bool IsSurfaceConfigured() = 0;
++  ///
++  /// A hint for the compositor to use a custom area, rather than inferring the activation area.
++  ///
++  /*--cef()--*/
++  virtual void SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) = 0;
++
+   // -----------------
+ };
+diff --git a/libcef/browser/views/view_util.h b/libcef/browser/views/view_util.h
+index 20b97038b..76c023254 100644
+--- a/libcef/browser/views/view_util.h
++++ b/libcef/browser/views/view_util.h
+@@ -149,6 +149,7 @@ void AglSetAppReady(views::Widget* widget);
+ void AglSetBackGroundApp(views::Widget* widget);
+ void AglSetPanelApp(views::Widget* widget, uint32_t edge);
+ bool IsSurfaceConfigured(views::Widget* widget);
++void SetupActivationArea(views::Widget* widget, uint32_t x, uint32_t y, uint32_t width, uint32_t height);
+ // -----------------
+diff --git a/libcef/browser/views/view_util_aura.cc b/libcef/browser/views/view_util_aura.cc
+index b5b4f414b..96e44dbb6 100644
+--- a/libcef/browser/views/view_util_aura.cc
++++ b/libcef/browser/views/view_util_aura.cc
+@@ -101,6 +101,23 @@ bool IsSurfaceConfigured(views::Widget* widget) {
+   }
+ }
++void SetupActivationArea(views::Widget* widget,
++                         uint32_t x,
++                         uint32_t y,
++                         uint32_t width,
++                         uint32_t height) {
++  if (!widget) {
++    return;
++  }
++  aura::Window* window = widget->GetNativeWindow();
++  if (window && window->GetRootWindow()) {
++    window->GetHost()->SetupActivationArea(x,
++                                           y,
++                                           width,
++                                           height);
++  }
++}
++
+ // -----------------
+ }  // namespace view_util
+diff --git a/libcef/browser/views/window_impl.cc b/libcef/browser/views/window_impl.cc
+index 1b5d196ab..485943ec6 100644
+--- a/libcef/browser/views/window_impl.cc
++++ b/libcef/browser/views/window_impl.cc
+@@ -548,6 +548,13 @@ bool CefWindowImpl::IsSurfaceConfigured() {
+   return view_util::IsSurfaceConfigured(widget_);
+ }
++void CefWindowImpl::SetupActivationArea(uint32_t x,
++                                        uint32_t y,
++                                        uint32_t width,
++                                        uint32_t height) {
++  view_util::SetupActivationArea(widget_, x, y, width, height);
++}
++
+ // -----------------
+ void CefWindowImpl::SendKeyPress(int key_code, uint32 event_flags) {
+diff --git a/libcef/browser/views/window_impl.h b/libcef/browser/views/window_impl.h
+index 4ab77dbe6..89c136873 100644
+--- a/libcef/browser/views/window_impl.h
++++ b/libcef/browser/views/window_impl.h
+@@ -140,6 +140,7 @@ class CefWindowImpl
+   void AglSetBackGroundApp() override;
+   void AglSetPanelApp(uint32_t edge) override;
+   bool IsSurfaceConfigured() override;
++  void SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) override;
+   // -----------------
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/cef/0009-Allow-passing-the-app_id-on-widget-creation.patch b/recipes-wam/cef/files/cef/0009-Allow-passing-the-app_id-on-widget-creation.patch
new file mode 100644 (file)
index 0000000..006664d
--- /dev/null
@@ -0,0 +1,130 @@
+From 6bd43a70c23d407ca6c4d4a68f0e95eb3301290a Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Tue, 4 Jul 2023 12:10:41 +0200
+Subject: [PATCH 09/10] Allow passing the app_id on widget creation
+
+---
+ include/views/cef_window.h          |  6 ++++++
+ libcef/browser/views/window_impl.cc | 13 +++++++++----
+ libcef/browser/views/window_impl.h  |  6 ++++--
+ libcef/browser/views/window_view.cc |  3 ++-
+ libcef/browser/views/window_view.h  |  2 +-
+ 5 files changed, 22 insertions(+), 8 deletions(-)
+
+diff --git a/include/views/cef_window.h b/include/views/cef_window.h
+index 52ccb7dc5..fd3e1c1b5 100644
+--- a/include/views/cef_window.h
++++ b/include/views/cef_window.h
+@@ -63,6 +63,12 @@ class CefWindow : public CefPanel {
+       CefRefPtr<CefWindowDelegate> delegate);
+   ///
++  /// Create a new Window with the provided ID
++  ///
++  /*--cef()--*/
++  static CefRefPtr<CefWindow> CreateTopLevelWindowWithId(
++      CefRefPtr<CefWindowDelegate> delegate, const CefString& app_id);
++  ///
+   /// Show the Window.
+   ///
+   /*--cef()--*/
+diff --git a/libcef/browser/views/window_impl.cc b/libcef/browser/views/window_impl.cc
+index 485943ec6..35df22c51 100644
+--- a/libcef/browser/views/window_impl.cc
++++ b/libcef/browser/views/window_impl.cc
+@@ -115,14 +115,19 @@ CefRefPtr<CefWindow> CefWindow::CreateTopLevelWindow(
+   return CefWindowImpl::Create(delegate, gfx::kNullAcceleratedWidget);
+ }
++CefRefPtr<CefWindow> CefWindow::CreateTopLevelWindowWithId(
++    CefRefPtr<CefWindowDelegate> delegate, const CefString& app_id) {
++  return CefWindowImpl::Create(delegate, gfx::kNullAcceleratedWidget, app_id);
++}
++
+ // static
+ CefRefPtr<CefWindowImpl> CefWindowImpl::Create(
+     CefRefPtr<CefWindowDelegate> delegate,
+-    gfx::AcceleratedWidget parent_widget) {
++    gfx::AcceleratedWidget parent_widget, const CefString& app_id) {
+   CEF_REQUIRE_UIT_RETURN(nullptr);
+   CefRefPtr<CefWindowImpl> window = new CefWindowImpl(delegate);
+   window->Initialize();
+-  window->CreateWidget(parent_widget);
++  window->CreateWidget(parent_widget, app_id);
+   if (delegate)
+     delegate->OnWindowCreated(window.get());
+   return window;
+@@ -678,10 +683,10 @@ void CefWindowImpl::InitializeRootView() {
+   static_cast<CefWindowView*>(root_view())->Initialize();
+ }
+-void CefWindowImpl::CreateWidget(gfx::AcceleratedWidget parent_widget) {
++void CefWindowImpl::CreateWidget(gfx::AcceleratedWidget parent_widget, const CefString& app_id) {
+   DCHECK(!widget_);
+-  root_view()->CreateWidget(parent_widget);
++  root_view()->CreateWidget(parent_widget, app_id);
+   widget_ = root_view()->GetWidget();
+   DCHECK(widget_);
+diff --git a/libcef/browser/views/window_impl.h b/libcef/browser/views/window_impl.h
+index 89c136873..d3330dfd8 100644
+--- a/libcef/browser/views/window_impl.h
++++ b/libcef/browser/views/window_impl.h
+@@ -36,7 +36,8 @@ class CefWindowImpl
+   // Create a new CefWindow instance. |delegate| may be nullptr. |parent_widget|
+   // will be used when creating a Chrome child window.
+   static CefRefPtr<CefWindowImpl> Create(CefRefPtr<CefWindowDelegate> delegate,
+-                                         gfx::AcceleratedWidget parent_widget);
++                                         gfx::AcceleratedWidget parent_widget,
++                                         const CefString& app_id = "");
+   // CefWindow methods:
+   void Show() override;
+@@ -155,7 +156,8 @@ class CefWindowImpl
+   void InitializeRootView() override;
+   // Initialize the Widget.
+-  void CreateWidget(gfx::AcceleratedWidget parent_widget);
++  void CreateWidget(gfx::AcceleratedWidget parent_widget,
++                    const CefString& app_id = "");
+   views::Widget* widget_;
+diff --git a/libcef/browser/views/window_view.cc b/libcef/browser/views/window_view.cc
+index 1e8d58a32..f4bf79ce3 100644
+--- a/libcef/browser/views/window_view.cc
++++ b/libcef/browser/views/window_view.cc
+@@ -255,7 +255,7 @@ CefWindowView::CefWindowView(CefWindowDelegate* cef_delegate,
+   DCHECK(window_delegate_);
+ }
+-void CefWindowView::CreateWidget(gfx::AcceleratedWidget parent_widget) {
++void CefWindowView::CreateWidget(gfx::AcceleratedWidget parent_widget, const CefString& app_id) {
+   DCHECK(!GetWidget());
+   // |widget| is owned by the NativeWidget and will be destroyed in response to
+@@ -265,6 +265,7 @@ void CefWindowView::CreateWidget(gfx::AcceleratedWidget parent_widget) {
+   views::Widget::InitParams params;
+   params.delegate = this;
++  params.wayland_app_id = app_id;
+   bool can_activate = true;
+   bool can_resize = true;
+diff --git a/libcef/browser/views/window_view.h b/libcef/browser/views/window_view.h
+index 6789636b8..ca593c60a 100644
+--- a/libcef/browser/views/window_view.h
++++ b/libcef/browser/views/window_view.h
+@@ -51,7 +51,7 @@ class CefWindowView
+   CefWindowView& operator=(const CefWindowView&) = delete;
+   // Create the Widget.
+-  void CreateWidget(gfx::AcceleratedWidget parent_widget);
++  void CreateWidget(gfx::AcceleratedWidget parent_widget, const CefString& app_id);
+   // Returns the CefWindow associated with this view. See comments on
+   // CefViewView::GetCefView.
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/cef/0010-Update-generated-api-wrapper-files.patch b/recipes-wam/cef/files/cef/0010-Update-generated-api-wrapper-files.patch
new file mode 100644 (file)
index 0000000..cc794fd
--- /dev/null
@@ -0,0 +1,2912 @@
+From 0559c94a3734b7f5ab546d6626a0d4fe6e976383 Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Wed, 12 Jul 2023 22:15:44 +0200
+Subject: [PATCH 10/10] Update generated api/wrapper files
+
+---
+ cef_paths.gypi                                |   4 +-
+ include/capi/cef_accessibility_handler_capi.h |   4 +-
+ include/capi/cef_app_capi.h                   |   4 +-
+ include/capi/cef_audio_handler_capi.h         |   4 +-
+ include/capi/cef_auth_callback_capi.h         |   4 +-
+ include/capi/cef_browser_capi.h               |   4 +-
+ .../capi/cef_browser_process_handler_capi.h   |   4 +-
+ include/capi/cef_callback_capi.h              |   4 +-
+ include/capi/cef_client_capi.h                |   4 +-
+ include/capi/cef_command_handler_capi.h       |   4 +-
+ include/capi/cef_command_line_capi.h          |   4 +-
+ include/capi/cef_context_menu_handler_capi.h  |   4 +-
+ include/capi/cef_cookie_capi.h                |   8 +-
+ include/capi/cef_crash_util_capi.h            |   4 +-
+ .../capi/cef_devtools_message_observer_capi.h |   4 +-
+ include/capi/cef_dialog_handler_capi.h        |   4 +-
+ include/capi/cef_display_handler_capi.h       |   4 +-
+ include/capi/cef_dom_capi.h                   |   4 +-
+ include/capi/cef_download_handler_capi.h      |   4 +-
+ include/capi/cef_download_item_capi.h         |   4 +-
+ include/capi/cef_drag_data_capi.h             |   4 +-
+ include/capi/cef_drag_handler_capi.h          |   4 +-
+ include/capi/cef_extension_capi.h             |   4 +-
+ include/capi/cef_extension_handler_capi.h     |   4 +-
+ include/capi/cef_file_util_capi.h             |   4 +-
+ include/capi/cef_find_handler_capi.h          |   4 +-
+ include/capi/cef_focus_handler_capi.h         |   4 +-
+ include/capi/cef_frame_capi.h                 |   4 +-
+ include/capi/cef_frame_handler_capi.h         |   4 +-
+ include/capi/cef_i18n_util_capi.h             |   4 +-
+ include/capi/cef_image_capi.h                 |   4 +-
+ include/capi/cef_jsdialog_handler_capi.h      |   4 +-
+ include/capi/cef_keyboard_handler_capi.h      |   4 +-
+ include/capi/cef_life_span_handler_capi.h     |   4 +-
+ include/capi/cef_load_handler_capi.h          |   4 +-
+ include/capi/cef_media_router_capi.h          |   8 +-
+ include/capi/cef_menu_model_capi.h            |   4 +-
+ include/capi/cef_menu_model_delegate_capi.h   |   4 +-
+ include/capi/cef_navigation_entry_capi.h      |   4 +-
+ include/capi/cef_origin_whitelist_capi.h      |   4 +-
+ include/capi/cef_parser_capi.h                |   4 +-
+ include/capi/cef_path_util_capi.h             |   4 +-
+ include/capi/cef_permission_handler_capi.h    |   4 +-
+ include/capi/cef_preference_capi.h            |   4 +-
+ include/capi/cef_print_handler_capi.h         |   4 +-
+ include/capi/cef_print_settings_capi.h        |   4 +-
+ include/capi/cef_process_message_capi.h       |   4 +-
+ include/capi/cef_process_util_capi.h          |   4 +-
+ include/capi/cef_registration_capi.h          |   4 +-
+ include/capi/cef_render_handler_capi.h        |   4 +-
+ .../capi/cef_render_process_handler_capi.h    |   4 +-
+ include/capi/cef_request_capi.h               |   4 +-
+ include/capi/cef_request_context_capi.h       |   4 +-
+ .../capi/cef_request_context_handler_capi.h   |   4 +-
+ include/capi/cef_request_handler_capi.h       |   4 +-
+ include/capi/cef_resource_bundle_capi.h       |   4 +-
+ .../capi/cef_resource_bundle_handler_capi.h   |   4 +-
+ include/capi/cef_resource_handler_capi.h      |   4 +-
+ .../capi/cef_resource_request_handler_capi.h  |   4 +-
+ include/capi/cef_response_capi.h              |   4 +-
+ include/capi/cef_response_filter_capi.h       |   4 +-
+ include/capi/cef_scheme_capi.h                |  12 +-
+ include/capi/cef_server_capi.h                |   4 +-
+ include/capi/cef_shared_memory_region_capi.h  |   4 +-
+ .../cef_shared_process_message_builder_capi.h |   4 +-
+ include/capi/cef_ssl_info_capi.h              |   4 +-
+ include/capi/cef_ssl_status_capi.h            |   4 +-
+ include/capi/cef_stream_capi.h                |   4 +-
+ include/capi/cef_string_visitor_capi.h        |   4 +-
+ include/capi/cef_task_capi.h                  |   4 +-
+ include/capi/cef_thread_capi.h                |   4 +-
+ include/capi/cef_trace_capi.h                 |   4 +-
+ include/capi/cef_urlrequest_capi.h            |   4 +-
+ include/capi/cef_v8_capi.h                    |   4 +-
+ include/capi/cef_values_capi.h                |   4 +-
+ include/capi/cef_waitable_event_capi.h        |   4 +-
+ include/capi/cef_x509_certificate_capi.h      |   4 +-
+ include/capi/cef_xml_reader_capi.h            |   4 +-
+ include/capi/cef_zip_reader_capi.h            |   4 +-
+ include/capi/test/cef_test_helpers_capi.h     |   4 +-
+ include/capi/test/cef_test_server_capi.h      |   4 +-
+ include/capi/test/cef_translator_test_capi.h  |   4 +-
+ include/capi/views/cef_box_layout_capi.h      |   4 +-
+ include/capi/views/cef_browser_view_capi.h    |   4 +-
+ .../views/cef_browser_view_delegate_capi.h    |   4 +-
+ include/capi/views/cef_button_capi.h          |   4 +-
+ include/capi/views/cef_button_delegate_capi.h |   4 +-
+ include/capi/views/cef_display_capi.h         |   4 +-
+ include/capi/views/cef_fill_layout_capi.h     |   4 +-
+ include/capi/views/cef_label_button_capi.h    |   4 +-
+ include/capi/views/cef_layout_capi.h          |   4 +-
+ include/capi/views/cef_menu_button_capi.h     |   4 +-
+ .../views/cef_menu_button_delegate_capi.h     |   4 +-
+ .../capi/views/cef_overlay_controller_capi.h  |   4 +-
+ include/capi/views/cef_panel_capi.h           |   4 +-
+ include/capi/views/cef_panel_delegate_capi.h  |   4 +-
+ include/capi/views/cef_scroll_view_capi.h     |   4 +-
+ include/capi/views/cef_textfield_capi.h       |   4 +-
+ .../capi/views/cef_textfield_delegate_capi.h  |   4 +-
+ include/capi/views/cef_view_capi.h            |   4 +-
+ include/capi/views/cef_view_delegate_capi.h   |   4 +-
+ include/capi/views/cef_window_capi.h          |  54 ++++++-
+ include/capi/views/cef_window_delegate_capi.h |   4 +-
+ include/cef_api_hash.h                        |  10 +-
+ libcef_dll/cpptoc/views/window_cpptoc.cc      | 144 +++++++++++++++++-
+ libcef_dll/cpptoc/views/window_cpptoc.h       |   4 +-
+ libcef_dll/ctocpp/views/window_ctocpp.cc      | 139 ++++++++++++++++-
+ libcef_dll/ctocpp/views/window_ctocpp.h       |  14 +-
+ libcef_dll/libcef_dll.cc                      |   4 +-
+ libcef_dll/wrapper/libcef_dll_dylib.cc        |  74 +++++----
+ libcef_dll/wrapper/libcef_dll_wrapper.cc      |  32 ++--
+ libcef_dll/wrapper_types.h                    |   4 +-
+ 112 files changed, 629 insertions(+), 274 deletions(-)
+
+diff --git a/cef_paths.gypi b/cef_paths.gypi
+index 698667879..6adc13873 100644
+--- a/cef_paths.gypi
++++ b/cef_paths.gypi
+@@ -1,4 +1,4 @@
+-# Copyright (c) 2022 The Chromium Embedded Framework Authors. All rights
++# Copyright (c) 2023 The Chromium Embedded Framework Authors. All rights
+ # reserved. Use of this source code is governed by a BSD-style license that
+ # can be found in the LICENSE file.
+ #
+@@ -8,7 +8,7 @@
+ # by hand. See the translator.README.txt file in the tools directory for
+ # more information.
+ #
+-# $hash=0373d7e3fc02d16a128a5891aac70af56fb9ddc1$
++# $hash=ab931540f6f4d80336123acea6cf51e701f5a63a$
+ #
+ {
+diff --git a/include/capi/cef_accessibility_handler_capi.h b/include/capi/cef_accessibility_handler_capi.h
+index 5eb40d84f..120714aca 100644
+--- a/include/capi/cef_accessibility_handler_capi.h
++++ b/include/capi/cef_accessibility_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=6bdc0ce413420b45510fcc7f415c6a6fb05f0112$
++// $hash=0ac3c8ca887778a840c65108d56038d4d776e073$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_ACCESSIBILITY_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_app_capi.h b/include/capi/cef_app_capi.h
+index 145947c37..f1b58c56c 100644
+--- a/include/capi/cef_app_capi.h
++++ b/include/capi/cef_app_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=2f4bdc6adde5defdc86dbb5c998266d6372dd164$
++// $hash=9b523fbf312a8a0cb1c743a3c8aca7bc9cc22bbc$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_APP_CAPI_H_
+diff --git a/include/capi/cef_audio_handler_capi.h b/include/capi/cef_audio_handler_capi.h
+index f6d204ce0..78af95ddb 100644
+--- a/include/capi/cef_audio_handler_capi.h
++++ b/include/capi/cef_audio_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=4e243df31e29bc6e473d56e371ed6328d948959c$
++// $hash=936274d5539f225ff7adb7e0acba517fd9a8e2f8$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_AUDIO_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_auth_callback_capi.h b/include/capi/cef_auth_callback_capi.h
+index 76f21490f..6e74c0a48 100644
+--- a/include/capi/cef_auth_callback_capi.h
++++ b/include/capi/cef_auth_callback_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=c0704c0a87e8b57b20887be75700a30e887fee4f$
++// $hash=4b9c31ef9a23f899c6d8cd3da49934a41f1bd231$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_AUTH_CALLBACK_CAPI_H_
+diff --git a/include/capi/cef_browser_capi.h b/include/capi/cef_browser_capi.h
+index c7e4b7214..244a20cd2 100644
+--- a/include/capi/cef_browser_capi.h
++++ b/include/capi/cef_browser_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=f8a604f73a04bec535d72ec7d05906da8c953b6b$
++// $hash=7254c050cd7db2ff7d40a1f54c99e941dc592692$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_BROWSER_CAPI_H_
+diff --git a/include/capi/cef_browser_process_handler_capi.h b/include/capi/cef_browser_process_handler_capi.h
+index eef705553..043deb4d8 100644
+--- a/include/capi/cef_browser_process_handler_capi.h
++++ b/include/capi/cef_browser_process_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=a4d3026623111f1ba226d1579c6b03de3b924457$
++// $hash=4ef8b73a5218531b370fdd76c23153a1f83b7f7b$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_BROWSER_PROCESS_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_callback_capi.h b/include/capi/cef_callback_capi.h
+index a91da31d8..d5086aabb 100644
+--- a/include/capi/cef_callback_capi.h
++++ b/include/capi/cef_callback_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=1bb026d01d1d4bb38ceb4c54f6bcf70300bf5201$
++// $hash=4fd98ff68ecb42677c3344b75e26d4787161b0d2$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_CALLBACK_CAPI_H_
+diff --git a/include/capi/cef_client_capi.h b/include/capi/cef_client_capi.h
+index 3c33a1d78..e85a33b36 100644
+--- a/include/capi/cef_client_capi.h
++++ b/include/capi/cef_client_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=93f1c39c102dc97d6ad8d236a90a2e0e88f10fb7$
++// $hash=eb9dcb574252483dfab12834af93ba14138d4089$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_CLIENT_CAPI_H_
+diff --git a/include/capi/cef_command_handler_capi.h b/include/capi/cef_command_handler_capi.h
+index dea127bed..862bff67a 100644
+--- a/include/capi/cef_command_handler_capi.h
++++ b/include/capi/cef_command_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=ec05ae57537091e3543c4b31d72d2d84d44df876$
++// $hash=46817ef557307a55a9b7138134c4f5c32562f2d7$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_COMMAND_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_command_line_capi.h b/include/capi/cef_command_line_capi.h
+index 7af3177bf..1774c3459 100644
+--- a/include/capi/cef_command_line_capi.h
++++ b/include/capi/cef_command_line_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=f535e9560b9fde9b53fc4d8383905105ed029ea4$
++// $hash=1d0a15624fec8ca8bd1a5cdf7195b9b553dde44f$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_COMMAND_LINE_CAPI_H_
+diff --git a/include/capi/cef_context_menu_handler_capi.h b/include/capi/cef_context_menu_handler_capi.h
+index e16ae5bff..bc2733340 100644
+--- a/include/capi/cef_context_menu_handler_capi.h
++++ b/include/capi/cef_context_menu_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=0ae549ed35e30afcbb01961fe55455beaadcd7f9$
++// $hash=c82f41d81f5afa5ed6995693e012c13d2a609f88$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_CONTEXT_MENU_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_cookie_capi.h b/include/capi/cef_cookie_capi.h
+index 4cd5d3631..f6f19ede2 100644
+--- a/include/capi/cef_cookie_capi.h
++++ b/include/capi/cef_cookie_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=37b5e115ff7abd1df1b9913404b69505fb9fef29$
++// $hash=8093e45bcbd09f41f21c0cb7c8719166cc481529$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_COOKIE_CAPI_H_
+@@ -126,8 +126,8 @@ typedef struct _cef_cookie_manager_t {
+ /// cef_settings_t.cache_path if specified or in memory otherwise. If |callback|
+ /// is non-NULL it will be executed asnychronously on the UI thread after the
+ /// manager's storage has been initialized. Using this function is equivalent to
+-/// calling cef_request_context_t::cef_request_context_get_global_context()->Get
+-/// DefaultCookieManager().
++/// calling cef_request_context_t::cef_request_context_get_global_context()-
++/// >GetDefaultCookieManager().
+ ///
+ CEF_EXPORT cef_cookie_manager_t* cef_cookie_manager_get_global_manager(
+     struct _cef_completion_callback_t* callback);
+diff --git a/include/capi/cef_crash_util_capi.h b/include/capi/cef_crash_util_capi.h
+index 3119367b4..f6272ab0d 100644
+--- a/include/capi/cef_crash_util_capi.h
++++ b/include/capi/cef_crash_util_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=1ce19c3213f033ca9059da738102b9b4292d4a06$
++// $hash=5c6e0b9e37b8103a182f200fccdf5973104fcd70$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_CRASH_UTIL_CAPI_H_
+diff --git a/include/capi/cef_devtools_message_observer_capi.h b/include/capi/cef_devtools_message_observer_capi.h
+index ac64869eb..ee61835f0 100644
+--- a/include/capi/cef_devtools_message_observer_capi.h
++++ b/include/capi/cef_devtools_message_observer_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=076a01db2fc4241efeb46c5f247a9737fd828f9b$
++// $hash=777485120b9a9df0f890579ee698d33f273819c5$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_DEVTOOLS_MESSAGE_OBSERVER_CAPI_H_
+diff --git a/include/capi/cef_dialog_handler_capi.h b/include/capi/cef_dialog_handler_capi.h
+index ecf900c08..82281ad96 100644
+--- a/include/capi/cef_dialog_handler_capi.h
++++ b/include/capi/cef_dialog_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=3a1a3ac84690c6090d356ddec3ddb49b934fe28c$
++// $hash=69545645f079f4593d9cbb6d8a36535c209245f7$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_DIALOG_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_display_handler_capi.h b/include/capi/cef_display_handler_capi.h
+index 17fddfbab..b93421de4 100644
+--- a/include/capi/cef_display_handler_capi.h
++++ b/include/capi/cef_display_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=976a61df924efbcb0c53afeb75265e5e9e80c2de$
++// $hash=1de3354bd0a042cc28199f1f56753b1df9e279a2$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_DISPLAY_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_dom_capi.h b/include/capi/cef_dom_capi.h
+index 2db400cfb..c895e3b7d 100644
+--- a/include/capi/cef_dom_capi.h
++++ b/include/capi/cef_dom_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=47d8c186f687b65c8e7f394b97d72530e67593cd$
++// $hash=d703b8af664ed9dfac8ad935616ef43fafc062e2$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_DOM_CAPI_H_
+diff --git a/include/capi/cef_download_handler_capi.h b/include/capi/cef_download_handler_capi.h
+index 37a770d25..597951344 100644
+--- a/include/capi/cef_download_handler_capi.h
++++ b/include/capi/cef_download_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=aff139899b4b8b769fd0e506d8a46e434f924eee$
++// $hash=f1f6a110a7ce15611a7062b3d7fe8b5c630f2980$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_DOWNLOAD_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_download_item_capi.h b/include/capi/cef_download_item_capi.h
+index 5548c1a7a..d6986eb03 100644
+--- a/include/capi/cef_download_item_capi.h
++++ b/include/capi/cef_download_item_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=a218058d7ceb842c9ea0cf0c252f9787de6562e7$
++// $hash=332b9cb62b9c85573dc705aba4c9db3b34177e20$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_DOWNLOAD_ITEM_CAPI_H_
+diff --git a/include/capi/cef_drag_data_capi.h b/include/capi/cef_drag_data_capi.h
+index 45a7c00c8..32eed2fe8 100644
+--- a/include/capi/cef_drag_data_capi.h
++++ b/include/capi/cef_drag_data_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=9e8375de3d30eb7e4f67488da3568d19848eb038$
++// $hash=a1ce746f0dd97d21973d4c80d8ef46391c0fd463$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_DRAG_DATA_CAPI_H_
+diff --git a/include/capi/cef_drag_handler_capi.h b/include/capi/cef_drag_handler_capi.h
+index a1c717b57..a5023e001 100644
+--- a/include/capi/cef_drag_handler_capi.h
++++ b/include/capi/cef_drag_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=ec450acb2c3cc4d0e69b7da725387d5c1049773b$
++// $hash=ad16b0f4320d7b363efb152a65e3ce142882b9d9$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_DRAG_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_extension_capi.h b/include/capi/cef_extension_capi.h
+index 008ad4a1f..a945b9bfb 100644
+--- a/include/capi/cef_extension_capi.h
++++ b/include/capi/cef_extension_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=b16b1c47d26e911d360159e5535743622a411c31$
++// $hash=c81a74622b987483e5fcd2c508aec5c13e12389b$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_EXTENSION_CAPI_H_
+diff --git a/include/capi/cef_extension_handler_capi.h b/include/capi/cef_extension_handler_capi.h
+index 3e0563b2e..ab29f3496 100644
+--- a/include/capi/cef_extension_handler_capi.h
++++ b/include/capi/cef_extension_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=ba961ade334c82e53213e7e8ac848adc2a7b533a$
++// $hash=ad6d3845b150f22b88a71dafa601ef01c9579824$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_EXTENSION_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_file_util_capi.h b/include/capi/cef_file_util_capi.h
+index 7272180c5..daad7a52b 100644
+--- a/include/capi/cef_file_util_capi.h
++++ b/include/capi/cef_file_util_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=3e2e068a2be0a3b12653eea65a4bbe1c9cdb8c7f$
++// $hash=4e0e0abcb72327998df950e618b147b196e76b60$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_FILE_UTIL_CAPI_H_
+diff --git a/include/capi/cef_find_handler_capi.h b/include/capi/cef_find_handler_capi.h
+index b559e521a..94450d295 100644
+--- a/include/capi/cef_find_handler_capi.h
++++ b/include/capi/cef_find_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=30e86c9dd440616305f94747b313eb526c4323c7$
++// $hash=8149c82dd6671d676ee62cb6749bf30b32a5832c$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_FIND_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_focus_handler_capi.h b/include/capi/cef_focus_handler_capi.h
+index a5ed63eec..f7b699dc1 100644
+--- a/include/capi/cef_focus_handler_capi.h
++++ b/include/capi/cef_focus_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=907b9628ac4b7ab4603dc6e20b7e8675a51987ba$
++// $hash=53ec33c8937c735f646f9e0a14a416218e32887c$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_FOCUS_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_frame_capi.h b/include/capi/cef_frame_capi.h
+index 81e9249d7..94069cedc 100644
+--- a/include/capi/cef_frame_capi.h
++++ b/include/capi/cef_frame_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=48bc345bb0971e3fcaaf839e9e4419b2aec0e33b$
++// $hash=b9b1308311999efcfd2aa678472f934ca783492c$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_FRAME_CAPI_H_
+diff --git a/include/capi/cef_frame_handler_capi.h b/include/capi/cef_frame_handler_capi.h
+index 38d25239c..94b3b8823 100644
+--- a/include/capi/cef_frame_handler_capi.h
++++ b/include/capi/cef_frame_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=3d97135fef535cc94aca6cf1afa4a9461c388b4f$
++// $hash=4cdadeb6439415d60ec32249c3a0b6457dd586f7$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_FRAME_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_i18n_util_capi.h b/include/capi/cef_i18n_util_capi.h
+index 080731b4c..3aab714ef 100644
+--- a/include/capi/cef_i18n_util_capi.h
++++ b/include/capi/cef_i18n_util_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=14f7f979f668fdae0f080daa39f3c1b2e92162f9$
++// $hash=c564ee1f32a0ef05fe49fc779af5bc0b0e1b36d6$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_I18N_UTIL_CAPI_H_
+diff --git a/include/capi/cef_image_capi.h b/include/capi/cef_image_capi.h
+index 31ce53cbe..9d4a0a9ca 100644
+--- a/include/capi/cef_image_capi.h
++++ b/include/capi/cef_image_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=f679dc1ec87e99bed6843d4f4dbbe04585a827bd$
++// $hash=99c94b208f9b184985220493bba4ea08e6786046$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_IMAGE_CAPI_H_
+diff --git a/include/capi/cef_jsdialog_handler_capi.h b/include/capi/cef_jsdialog_handler_capi.h
+index e2d02bb86..a490ddd8c 100644
+--- a/include/capi/cef_jsdialog_handler_capi.h
++++ b/include/capi/cef_jsdialog_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=523a692475e912e4ecad89842596c3d6eac6f4aa$
++// $hash=e9fb0354243611f3a4de508923a4e01dab42f82d$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_JSDIALOG_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_keyboard_handler_capi.h b/include/capi/cef_keyboard_handler_capi.h
+index 52476dc9f..7ff37b46e 100644
+--- a/include/capi/cef_keyboard_handler_capi.h
++++ b/include/capi/cef_keyboard_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=01d7f86c1304efe8dc8758624b74bafccf159e96$
++// $hash=10fb708c5f550403205a976924abf1886bf3dfa7$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_KEYBOARD_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_life_span_handler_capi.h b/include/capi/cef_life_span_handler_capi.h
+index 2814d143c..f02ea6a4a 100644
+--- a/include/capi/cef_life_span_handler_capi.h
++++ b/include/capi/cef_life_span_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=44555ceece9989dabfa57a520168fa874dcfe2df$
++// $hash=1c807597b96889f44a1e5199e860e8db4948b473$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_LIFE_SPAN_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_load_handler_capi.h b/include/capi/cef_load_handler_capi.h
+index 5536cc1f1..3667b8687 100644
+--- a/include/capi/cef_load_handler_capi.h
++++ b/include/capi/cef_load_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=2713381c9969d7039e6c1a1ed2527e5aeb5425ce$
++// $hash=1ee684174554f7d1cf8899992705d072c1c56ae7$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_LOAD_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_media_router_capi.h b/include/capi/cef_media_router_capi.h
+index e078abb01..69e00522c 100644
+--- a/include/capi/cef_media_router_capi.h
++++ b/include/capi/cef_media_router_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=77920892e7d9e8b98106e0bc8dfcf4b4c52a24e6$
++// $hash=364a4abc293a294bee461a0b75936dedea3294e5$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_MEDIA_ROUTER_CAPI_H_
+@@ -114,8 +114,8 @@ typedef struct _cef_media_router_t {
+ /// Returns the MediaRouter object associated with the global request context.
+ /// If |callback| is non-NULL it will be executed asnychronously on the UI
+ /// thread after the manager's storage has been initialized. Equivalent to
+-/// calling cef_request_context_t::cef_request_context_get_global_context()->get
+-/// _media_router().
++/// calling cef_request_context_t::cef_request_context_get_global_context()-
++/// >get_media_router().
+ ///
+ CEF_EXPORT cef_media_router_t* cef_media_router_get_global(
+     struct _cef_completion_callback_t* callback);
+diff --git a/include/capi/cef_menu_model_capi.h b/include/capi/cef_menu_model_capi.h
+index a3352d864..8b5bd6632 100644
+--- a/include/capi/cef_menu_model_capi.h
++++ b/include/capi/cef_menu_model_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=4bf9250599e3ba26e7f74ec22338548492202625$
++// $hash=d70b78b8108bb08b4f53b2627ed4ebfdffece7c1$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_MENU_MODEL_CAPI_H_
+diff --git a/include/capi/cef_menu_model_delegate_capi.h b/include/capi/cef_menu_model_delegate_capi.h
+index a4ed31ee8..dd339c197 100644
+--- a/include/capi/cef_menu_model_delegate_capi.h
++++ b/include/capi/cef_menu_model_delegate_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=8254165498a527d40517c1bc8ec413ad7a0ed259$
++// $hash=933a90dfb7b94a3aba7f2944e4540662dc8c79d7$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_MENU_MODEL_DELEGATE_CAPI_H_
+diff --git a/include/capi/cef_navigation_entry_capi.h b/include/capi/cef_navigation_entry_capi.h
+index 4dd92bc3e..863c11d4b 100644
+--- a/include/capi/cef_navigation_entry_capi.h
++++ b/include/capi/cef_navigation_entry_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=2822d96d72b7df816c0fefb4ce1cbba18add50ac$
++// $hash=d33771c31b7b0964aa2ccf1c2bc2ca1226194977$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_NAVIGATION_ENTRY_CAPI_H_
+diff --git a/include/capi/cef_origin_whitelist_capi.h b/include/capi/cef_origin_whitelist_capi.h
+index 3170bd48d..9b57f38d2 100644
+--- a/include/capi/cef_origin_whitelist_capi.h
++++ b/include/capi/cef_origin_whitelist_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=a40860835e6e693ed2f85eab5fa7990b7f2c7bbe$
++// $hash=b564dfe24017a0805e393854d12791a71c46c454$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_ORIGIN_WHITELIST_CAPI_H_
+diff --git a/include/capi/cef_parser_capi.h b/include/capi/cef_parser_capi.h
+index c9bbdcb13..a6410c293 100644
+--- a/include/capi/cef_parser_capi.h
++++ b/include/capi/cef_parser_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=f6dfdfa5b8c77931d8e083a66f5a9445a2fdbf45$
++// $hash=5d6dad4bfaeef0117d068b6e67a8da7490fe7c2d$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_PARSER_CAPI_H_
+diff --git a/include/capi/cef_path_util_capi.h b/include/capi/cef_path_util_capi.h
+index 84ff5e0ce..5706b8399 100644
+--- a/include/capi/cef_path_util_capi.h
++++ b/include/capi/cef_path_util_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=0b3af613a60e4c74ec83c0bb8f5280464cbe7f48$
++// $hash=70b306534b9cb8334c9ea260feacfd8f2f503292$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_PATH_UTIL_CAPI_H_
+diff --git a/include/capi/cef_permission_handler_capi.h b/include/capi/cef_permission_handler_capi.h
+index ed005a1a0..67d8f0b93 100644
+--- a/include/capi/cef_permission_handler_capi.h
++++ b/include/capi/cef_permission_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=8f2ae563306d1e4ba5fa84a5f9a60712c6fc585f$
++// $hash=bc44eb70b7f0b48e0646825e919cb9996ac99781$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_PERMISSION_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_preference_capi.h b/include/capi/cef_preference_capi.h
+index 89e36b967..fa6d9bd3b 100644
+--- a/include/capi/cef_preference_capi.h
++++ b/include/capi/cef_preference_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=eac0782793e7b9c64668f2a22a859357257140ea$
++// $hash=922659242ea25c52d02884a7cc5918d086cbfaca$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_PREFERENCE_CAPI_H_
+diff --git a/include/capi/cef_print_handler_capi.h b/include/capi/cef_print_handler_capi.h
+index 28b6546d9..47e69b1d3 100644
+--- a/include/capi/cef_print_handler_capi.h
++++ b/include/capi/cef_print_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=0621c349d0ef1e5befe0dc653a5b8ba49e51a54e$
++// $hash=d09937fb047debd9da39c4072a434659b3c5682c$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_PRINT_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_print_settings_capi.h b/include/capi/cef_print_settings_capi.h
+index b58904690..14a52f30b 100644
+--- a/include/capi/cef_print_settings_capi.h
++++ b/include/capi/cef_print_settings_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=22959da4d5a2c94edc7647334507e38c44d40250$
++// $hash=46508464579e797d4684f4a7facdb39f9bdb312b$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_PRINT_SETTINGS_CAPI_H_
+diff --git a/include/capi/cef_process_message_capi.h b/include/capi/cef_process_message_capi.h
+index 6ec7e76ba..586014c38 100644
+--- a/include/capi/cef_process_message_capi.h
++++ b/include/capi/cef_process_message_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=7b8bbe145aa8d54d868b9d9e4ce6ff2e6a596e53$
++// $hash=e20a8d6a5803dae5ba156adde40c8b964899b176$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_PROCESS_MESSAGE_CAPI_H_
+diff --git a/include/capi/cef_process_util_capi.h b/include/capi/cef_process_util_capi.h
+index b7033886f..2ae2c57cb 100644
+--- a/include/capi/cef_process_util_capi.h
++++ b/include/capi/cef_process_util_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=f6b215445a54f565a26f1a62d2671156635d6d46$
++// $hash=88c42c5f216798304b07bfe985296014cf65996c$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_PROCESS_UTIL_CAPI_H_
+diff --git a/include/capi/cef_registration_capi.h b/include/capi/cef_registration_capi.h
+index 5f18c90a7..4ac84d670 100644
+--- a/include/capi/cef_registration_capi.h
++++ b/include/capi/cef_registration_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=28371116427e9457ea366c9f0546cd5eefd8f08a$
++// $hash=b1b38a3171dd3626029e70e75b482dfa3531215b$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_REGISTRATION_CAPI_H_
+diff --git a/include/capi/cef_render_handler_capi.h b/include/capi/cef_render_handler_capi.h
+index f57233399..ccd3d238c 100644
+--- a/include/capi/cef_render_handler_capi.h
++++ b/include/capi/cef_render_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=931b329d62ea6461485b62b79f98165d7185b6e7$
++// $hash=32d8176f39b05487bae048990b2dee3212ae3b78$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_RENDER_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_render_process_handler_capi.h b/include/capi/cef_render_process_handler_capi.h
+index dc4210176..f9c86c941 100644
+--- a/include/capi/cef_render_process_handler_capi.h
++++ b/include/capi/cef_render_process_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=b74afb6f8003ed24256ce7359ea377596b4406d9$
++// $hash=d807c7566ce3085243e9e7ea279fee7241acfc5f$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_RENDER_PROCESS_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_request_capi.h b/include/capi/cef_request_capi.h
+index d39c7d475..9ac916576 100644
+--- a/include/capi/cef_request_capi.h
++++ b/include/capi/cef_request_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=041c1b4e6e57987ad547daff56f96c6ff7ab15c9$
++// $hash=3339290cad3a77c8b0b07d422f0faf902a047838$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_CAPI_H_
+diff --git a/include/capi/cef_request_context_capi.h b/include/capi/cef_request_context_capi.h
+index 8e7321e22..58f3ef2d1 100644
+--- a/include/capi/cef_request_context_capi.h
++++ b/include/capi/cef_request_context_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=62f9dd603840149334ecd1f25222dbda0682b0e6$
++// $hash=c2a6265e8e9acce475a8b5755a8c58b97b495207$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_CONTEXT_CAPI_H_
+diff --git a/include/capi/cef_request_context_handler_capi.h b/include/capi/cef_request_context_handler_capi.h
+index fb4a0a493..d7e06f816 100644
+--- a/include/capi/cef_request_context_handler_capi.h
++++ b/include/capi/cef_request_context_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=c25acf0c0dde9bbd8b9b3526e161aaa9e00445c8$
++// $hash=b0b532a12106d960adc446b980affeee12b93ae3$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_CONTEXT_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_request_handler_capi.h b/include/capi/cef_request_handler_capi.h
+index 398ed8c61..33b1469bc 100644
+--- a/include/capi/cef_request_handler_capi.h
++++ b/include/capi/cef_request_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=0524a218f8cb54cfde70f2ec475520b11923c2f7$
++// $hash=c4e259fe4432ce8204c7814066d008b493f0001a$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_REQUEST_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_resource_bundle_capi.h b/include/capi/cef_resource_bundle_capi.h
+index cf8e96b78..b06728c1d 100644
+--- a/include/capi/cef_resource_bundle_capi.h
++++ b/include/capi/cef_resource_bundle_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=4350dcf46e2fcd18bea2c45446e448e588795afb$
++// $hash=e8e8dd2730a47aad9414f7bfc2e6ad96aba2c875$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_RESOURCE_BUNDLE_CAPI_H_
+diff --git a/include/capi/cef_resource_bundle_handler_capi.h b/include/capi/cef_resource_bundle_handler_capi.h
+index 136e0cef9..bc9eea523 100644
+--- a/include/capi/cef_resource_bundle_handler_capi.h
++++ b/include/capi/cef_resource_bundle_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=5f8c2d1e11779072e83610190ed7215324028d07$
++// $hash=00023b2ec108ae6e4bd282d16e82032cdc99d548$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_RESOURCE_BUNDLE_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_resource_handler_capi.h b/include/capi/cef_resource_handler_capi.h
+index 98ff24eb6..bad0b85ad 100644
+--- a/include/capi/cef_resource_handler_capi.h
++++ b/include/capi/cef_resource_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=3373cc29becf60303d1f01774c1ed8017c3f0da3$
++// $hash=93e5c4f5e93f56b63b5944208300669dcecba972$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_RESOURCE_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_resource_request_handler_capi.h b/include/capi/cef_resource_request_handler_capi.h
+index 057456e32..184055628 100644
+--- a/include/capi/cef_resource_request_handler_capi.h
++++ b/include/capi/cef_resource_request_handler_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=64d090faf64e2ffb99da110840af383b757e113b$
++// $hash=70d6b393cbdc96a75864911d7ca3568cc8dcdebf$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_RESOURCE_REQUEST_HANDLER_CAPI_H_
+diff --git a/include/capi/cef_response_capi.h b/include/capi/cef_response_capi.h
+index 089694295..d8c4b655d 100644
+--- a/include/capi/cef_response_capi.h
++++ b/include/capi/cef_response_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=21354bc7b20a18eb0c25d2aa0abf1211fd9ebcaa$
++// $hash=7fbcd399c08dc39e33a7d0400a49f2e3a551bd02$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_RESPONSE_CAPI_H_
+diff --git a/include/capi/cef_response_filter_capi.h b/include/capi/cef_response_filter_capi.h
+index 425542703..c8a57de29 100644
+--- a/include/capi/cef_response_filter_capi.h
++++ b/include/capi/cef_response_filter_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=cbcb379f7ed86b58e271089a4117267a50f72814$
++// $hash=2c9b14a86ee6777e4834eadcfc95802f2dedb11a$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_RESPONSE_FILTER_CAPI_H_
+diff --git a/include/capi/cef_scheme_capi.h b/include/capi/cef_scheme_capi.h
+index 08786ae5a..bdcd6cc3b 100644
+--- a/include/capi/cef_scheme_capi.h
++++ b/include/capi/cef_scheme_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=1b6cd9a13f93867b1f20418bfa4c7db8b5e6725d$
++// $hash=794d4c01f06c656c425779b0189a3b52820498ed$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_SCHEME_CAPI_H_
+@@ -116,8 +116,8 @@ typedef struct _cef_scheme_handler_factory_t {
+ /// matches the specified |scheme_name| and optional |domain_name|. Returns
+ /// false (0) if an error occurs. This function may be called on any thread in
+ /// the browser process. Using this function is equivalent to calling cef_reques
+-/// t_context_t::cef_request_context_get_global_context()->register_scheme_handl
+-/// er_factory().
++/// t_context_t::cef_request_context_get_global_context()-
++/// >register_scheme_handler_factory().
+ ///
+ CEF_EXPORT int cef_register_scheme_handler_factory(
+     const cef_string_t* scheme_name,
+@@ -128,8 +128,8 @@ CEF_EXPORT int cef_register_scheme_handler_factory(
+ /// Clear all scheme handler factories registered with the global request
+ /// context. Returns false (0) on error. This function may be called on any
+ /// thread in the browser process. Using this function is equivalent to calling
+-/// cef_request_context_t::cef_request_context_get_global_context()->clear_schem
+-/// e_handler_factories().
++/// cef_request_context_t::cef_request_context_get_global_context()-
++/// >clear_scheme_handler_factories().
+ ///
+ CEF_EXPORT int cef_clear_scheme_handler_factories(void);
+diff --git a/include/capi/cef_server_capi.h b/include/capi/cef_server_capi.h
+index 9a65378f4..d1d2d943d 100644
+--- a/include/capi/cef_server_capi.h
++++ b/include/capi/cef_server_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=4d76765604a96b026076f1c930a33d616f23b4ad$
++// $hash=64e9ebc0e01acca0333ca3419e379d4053892270$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_SERVER_CAPI_H_
+diff --git a/include/capi/cef_shared_memory_region_capi.h b/include/capi/cef_shared_memory_region_capi.h
+index 2316e25b1..07be55e69 100644
+--- a/include/capi/cef_shared_memory_region_capi.h
++++ b/include/capi/cef_shared_memory_region_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=5f69190b21f9fa17e6fb4c2284968f8ec5b147ed$
++// $hash=08f64795d78bdad29a45222a7263e795ce77a52d$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_SHARED_MEMORY_REGION_CAPI_H_
+diff --git a/include/capi/cef_shared_process_message_builder_capi.h b/include/capi/cef_shared_process_message_builder_capi.h
+index ef47472f4..1b570648f 100644
+--- a/include/capi/cef_shared_process_message_builder_capi.h
++++ b/include/capi/cef_shared_process_message_builder_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=66198e92ec123e753bb427a0b92d73672610136e$
++// $hash=1a2d8806256d04362f181350db2835850cb3e0ae$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_SHARED_PROCESS_MESSAGE_BUILDER_CAPI_H_
+diff --git a/include/capi/cef_ssl_info_capi.h b/include/capi/cef_ssl_info_capi.h
+index 6fb5939d2..54b2009a5 100644
+--- a/include/capi/cef_ssl_info_capi.h
++++ b/include/capi/cef_ssl_info_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=64d6affe3e8e45869403f829c2aa86026773a17b$
++// $hash=99dff3042ea437ecf5771eff9b3cab4c22190534$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_SSL_INFO_CAPI_H_
+diff --git a/include/capi/cef_ssl_status_capi.h b/include/capi/cef_ssl_status_capi.h
+index c3ca2bd15..0c6c4b799 100644
+--- a/include/capi/cef_ssl_status_capi.h
++++ b/include/capi/cef_ssl_status_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=b40ab326a1bf140859db9288b809a4038833f014$
++// $hash=034a68aa4901cde95e12a7900cfc65753fbde345$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_SSL_STATUS_CAPI_H_
+diff --git a/include/capi/cef_stream_capi.h b/include/capi/cef_stream_capi.h
+index e9f20bf8a..c425b1fe2 100644
+--- a/include/capi/cef_stream_capi.h
++++ b/include/capi/cef_stream_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=9ccb4e6ea821c1b98adcc934429d2bf43cf9d8a2$
++// $hash=bbb4153d5d7325ac9a410d7f85a8d47eadcfaf6e$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_STREAM_CAPI_H_
+diff --git a/include/capi/cef_string_visitor_capi.h b/include/capi/cef_string_visitor_capi.h
+index 564f3a960..5ea9b38fd 100644
+--- a/include/capi/cef_string_visitor_capi.h
++++ b/include/capi/cef_string_visitor_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=3940b4c999764eae305984a16c401e302aefddc6$
++// $hash=6a22e5144c0254acb09656e6e41eedd05f2dd7e7$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_STRING_VISITOR_CAPI_H_
+diff --git a/include/capi/cef_task_capi.h b/include/capi/cef_task_capi.h
+index f7c9caac4..3a04e6bce 100644
+--- a/include/capi/cef_task_capi.h
++++ b/include/capi/cef_task_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=a7a4bf5cd4bde87774b8300d25f12b057a5abf60$
++// $hash=273a6abfd4ac030701be00c45811c19e74e128bd$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_TASK_CAPI_H_
+diff --git a/include/capi/cef_thread_capi.h b/include/capi/cef_thread_capi.h
+index 960359a41..adfb79a0b 100644
+--- a/include/capi/cef_thread_capi.h
++++ b/include/capi/cef_thread_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=b5b17f2a66283495e19978a5bbc36b47d9b61507$
++// $hash=b111114b291d3b91c526e6b3da5741959469ec4a$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_THREAD_CAPI_H_
+diff --git a/include/capi/cef_trace_capi.h b/include/capi/cef_trace_capi.h
+index 0429c2186..183ccdada 100644
+--- a/include/capi/cef_trace_capi.h
++++ b/include/capi/cef_trace_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=587514b02797f420da6ba13ba21c4344f41b56ce$
++// $hash=8d275bd73854b2b8d5a7a5bc55fa737e020705ee$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_TRACE_CAPI_H_
+diff --git a/include/capi/cef_urlrequest_capi.h b/include/capi/cef_urlrequest_capi.h
+index f638122eb..d54ffb78c 100644
+--- a/include/capi/cef_urlrequest_capi.h
++++ b/include/capi/cef_urlrequest_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=5b2bfaf4b7572935b2cfba804dc1625261e32e24$
++// $hash=91c121d4353a80d7fff3ef582c5a56ac86e0a34c$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_URLREQUEST_CAPI_H_
+diff --git a/include/capi/cef_v8_capi.h b/include/capi/cef_v8_capi.h
+index cd57020e4..7119475eb 100644
+--- a/include/capi/cef_v8_capi.h
++++ b/include/capi/cef_v8_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=b8af0d090bcb54f99d98804f7e3aaa0eab24449a$
++// $hash=0d787ac7676ba90d3a1fe68d5e2494b985b1db0e$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_V8_CAPI_H_
+diff --git a/include/capi/cef_values_capi.h b/include/capi/cef_values_capi.h
+index a3eaf710f..50abd75f3 100644
+--- a/include/capi/cef_values_capi.h
++++ b/include/capi/cef_values_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=e8f16d32cc835f9b20b3fcd7048146f52ec9bfe5$
++// $hash=1b8f7f620685c30b91c8fa656e1a01d182684ae6$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_VALUES_CAPI_H_
+diff --git a/include/capi/cef_waitable_event_capi.h b/include/capi/cef_waitable_event_capi.h
+index 1b0ad7434..1f5431c7f 100644
+--- a/include/capi/cef_waitable_event_capi.h
++++ b/include/capi/cef_waitable_event_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=737b3ee4e678de14ebffec828d113b007e06c58d$
++// $hash=683d592a2405ada0a9c46c004f003d640a3298ad$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_WAITABLE_EVENT_CAPI_H_
+diff --git a/include/capi/cef_x509_certificate_capi.h b/include/capi/cef_x509_certificate_capi.h
+index 554013df4..bfd4700f8 100644
+--- a/include/capi/cef_x509_certificate_capi.h
++++ b/include/capi/cef_x509_certificate_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=1d551ff4900e1792bc2d89bebcda1707b8d9c985$
++// $hash=7a541729b4ac664b22cdea625f19f1dba1b6a685$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_X509_CERTIFICATE_CAPI_H_
+diff --git a/include/capi/cef_xml_reader_capi.h b/include/capi/cef_xml_reader_capi.h
+index 71f126e8c..3db9b94e0 100644
+--- a/include/capi/cef_xml_reader_capi.h
++++ b/include/capi/cef_xml_reader_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=988d13daa86a6ed89d2116e44d2307ee01c63c08$
++// $hash=366f872b03f7c25ef56677cc427a317bb529ad9c$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_XML_READER_CAPI_H_
+diff --git a/include/capi/cef_zip_reader_capi.h b/include/capi/cef_zip_reader_capi.h
+index 7c016c349..05c9cd2e3 100644
+--- a/include/capi/cef_zip_reader_capi.h
++++ b/include/capi/cef_zip_reader_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=5e121ff2140e0f1228fd8e2ad632c804ab854210$
++// $hash=83debac545c04a630270665b391f52b15484b5d3$
+ //
+ #ifndef CEF_INCLUDE_CAPI_CEF_ZIP_READER_CAPI_H_
+diff --git a/include/capi/test/cef_test_helpers_capi.h b/include/capi/test/cef_test_helpers_capi.h
+index 61a5164be..c24bcf5a2 100644
+--- a/include/capi/test/cef_test_helpers_capi.h
++++ b/include/capi/test/cef_test_helpers_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=cdc9af1b664e49e339ab7bb50d04a7ea385e07e5$
++// $hash=4d10dad2278e6d61367b3deaf501a0e7b4fd60e9$
+ //
+ #ifndef CEF_INCLUDE_CAPI_TEST_CEF_TEST_HELPERS_CAPI_H_
+diff --git a/include/capi/test/cef_test_server_capi.h b/include/capi/test/cef_test_server_capi.h
+index c6ffc5bc4..ba30e6840 100644
+--- a/include/capi/test/cef_test_server_capi.h
++++ b/include/capi/test/cef_test_server_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=7dc00d6af4e26812b78e47ec707f8d271c043a8e$
++// $hash=df532eb91caf9de44b077abdf00620dd2508402b$
+ //
+ #ifndef CEF_INCLUDE_CAPI_TEST_CEF_TEST_SERVER_CAPI_H_
+diff --git a/include/capi/test/cef_translator_test_capi.h b/include/capi/test/cef_translator_test_capi.h
+index c0b8f509a..b1e87b051 100644
+--- a/include/capi/test/cef_translator_test_capi.h
++++ b/include/capi/test/cef_translator_test_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=58c8adb936b8dba8b13a586adfe9e32e7a02d24c$
++// $hash=58809bc0a16010773cf11b5165e65b32ec4b4793$
+ //
+ #ifndef CEF_INCLUDE_CAPI_TEST_CEF_TRANSLATOR_TEST_CAPI_H_
+diff --git a/include/capi/views/cef_box_layout_capi.h b/include/capi/views/cef_box_layout_capi.h
+index e480e4a1b..f053f017f 100644
+--- a/include/capi/views/cef_box_layout_capi.h
++++ b/include/capi/views/cef_box_layout_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=fe404a2a9d429c6de2a00a8e27efe553e93e792d$
++// $hash=31153d0702b646d310e74f04e256c0f5915b8caa$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_BOX_LAYOUT_CAPI_H_
+diff --git a/include/capi/views/cef_browser_view_capi.h b/include/capi/views/cef_browser_view_capi.h
+index 89bcd8baf..1e190bf7b 100644
+--- a/include/capi/views/cef_browser_view_capi.h
++++ b/include/capi/views/cef_browser_view_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=f575718f8c4df556ba92a2aff7204cbd6ad87bd6$
++// $hash=f72e94f6bd63b6ea623c4d3170b5ad4333c136d6$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_BROWSER_VIEW_CAPI_H_
+diff --git a/include/capi/views/cef_browser_view_delegate_capi.h b/include/capi/views/cef_browser_view_delegate_capi.h
+index 63484202d..25fc074ff 100644
+--- a/include/capi/views/cef_browser_view_delegate_capi.h
++++ b/include/capi/views/cef_browser_view_delegate_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=0e7953aa553f6987fa0142a9c4848ca59d68fb69$
++// $hash=e38c41a553d518abcd1b912d32281e99b93c4fd7$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_BROWSER_VIEW_DELEGATE_CAPI_H_
+diff --git a/include/capi/views/cef_button_capi.h b/include/capi/views/cef_button_capi.h
+index 2a698c4f2..e4fa6815b 100644
+--- a/include/capi/views/cef_button_capi.h
++++ b/include/capi/views/cef_button_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=6eb1f513763884af55e28aaf1c13b67240d15b33$
++// $hash=6580dc6ef6c20d5d78dc0160982b9ef57c939f86$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_BUTTON_CAPI_H_
+diff --git a/include/capi/views/cef_button_delegate_capi.h b/include/capi/views/cef_button_delegate_capi.h
+index bf580b7fc..caa27da25 100644
+--- a/include/capi/views/cef_button_delegate_capi.h
++++ b/include/capi/views/cef_button_delegate_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=a5faae9e35df9935393dbf1db5df832f8b9a025c$
++// $hash=9843593667569cf8755386ab2d884620087a36b8$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_BUTTON_DELEGATE_CAPI_H_
+diff --git a/include/capi/views/cef_display_capi.h b/include/capi/views/cef_display_capi.h
+index 4b94ca623..3c36324db 100644
+--- a/include/capi/views/cef_display_capi.h
++++ b/include/capi/views/cef_display_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=912c23bc842c87aeca79780746c31e3fe848013a$
++// $hash=7674d3af52dd4272b454b2028e7a4ee72fb3c9ff$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_DISPLAY_CAPI_H_
+diff --git a/include/capi/views/cef_fill_layout_capi.h b/include/capi/views/cef_fill_layout_capi.h
+index 8df6df97f..c9ae6d9c6 100644
+--- a/include/capi/views/cef_fill_layout_capi.h
++++ b/include/capi/views/cef_fill_layout_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=dc1a43f52c873628c98a479ae69f6e24cbd58129$
++// $hash=fdb3457ac8b18ad3cf0144af5886586dd675c8f8$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_FILL_LAYOUT_CAPI_H_
+diff --git a/include/capi/views/cef_label_button_capi.h b/include/capi/views/cef_label_button_capi.h
+index b821bb999..07b387631 100644
+--- a/include/capi/views/cef_label_button_capi.h
++++ b/include/capi/views/cef_label_button_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=88a2e2e9e1b0e7a692aca78be34ce1620c936336$
++// $hash=eee5b9ebfa58617d5e6fa969e27cc9e378fddb22$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_LABEL_BUTTON_CAPI_H_
+diff --git a/include/capi/views/cef_layout_capi.h b/include/capi/views/cef_layout_capi.h
+index 85081f7ee..5430a4595 100644
+--- a/include/capi/views/cef_layout_capi.h
++++ b/include/capi/views/cef_layout_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=01c57abc0a004118040b58bdcec07dfd32827d4f$
++// $hash=c4a17c07bb2a3518fc5b7350efdc13ffeb803747$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_LAYOUT_CAPI_H_
+diff --git a/include/capi/views/cef_menu_button_capi.h b/include/capi/views/cef_menu_button_capi.h
+index 986a21ca9..85cec0fe3 100644
+--- a/include/capi/views/cef_menu_button_capi.h
++++ b/include/capi/views/cef_menu_button_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=cfe68fb772b0c370f6895a1e8756491326de9c14$
++// $hash=dcfa5d39d1355b2c675637a13378f43376a8053e$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_MENU_BUTTON_CAPI_H_
+diff --git a/include/capi/views/cef_menu_button_delegate_capi.h b/include/capi/views/cef_menu_button_delegate_capi.h
+index 8c05669c2..5d9386486 100644
+--- a/include/capi/views/cef_menu_button_delegate_capi.h
++++ b/include/capi/views/cef_menu_button_delegate_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=f52310d3f7e9a8be886161ae0e20e4b903a2e765$
++// $hash=38177cad78713d382b81f8b8aa4372402c62fac7$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_MENU_BUTTON_DELEGATE_CAPI_H_
+diff --git a/include/capi/views/cef_overlay_controller_capi.h b/include/capi/views/cef_overlay_controller_capi.h
+index 9c3e581b4..8084bfd65 100644
+--- a/include/capi/views/cef_overlay_controller_capi.h
++++ b/include/capi/views/cef_overlay_controller_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=937ed3958b86682a88a09493aa5e9e4014d3bbc2$
++// $hash=a5a2c7fe2c285b45268eee1710a8549ab12727f3$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_OVERLAY_CONTROLLER_CAPI_H_
+diff --git a/include/capi/views/cef_panel_capi.h b/include/capi/views/cef_panel_capi.h
+index 6e40c17c0..658b0050d 100644
+--- a/include/capi/views/cef_panel_capi.h
++++ b/include/capi/views/cef_panel_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=7dbcb8d40d3f5ac18dee74621fe472e9ab089f8a$
++// $hash=40d350f75893a1e4307b282317d55f0fceae3baf$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_PANEL_CAPI_H_
+diff --git a/include/capi/views/cef_panel_delegate_capi.h b/include/capi/views/cef_panel_delegate_capi.h
+index 73ccdaabe..227762d5d 100644
+--- a/include/capi/views/cef_panel_delegate_capi.h
++++ b/include/capi/views/cef_panel_delegate_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=ce2d8e40ebdd803221ebcd26dab9461984917fd4$
++// $hash=e8bdae70e1f16fba3a5e01d9e215a02f13291ff5$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_PANEL_DELEGATE_CAPI_H_
+diff --git a/include/capi/views/cef_scroll_view_capi.h b/include/capi/views/cef_scroll_view_capi.h
+index badffb601..dd503c286 100644
+--- a/include/capi/views/cef_scroll_view_capi.h
++++ b/include/capi/views/cef_scroll_view_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=26037d0a585f2d93f19ee0417be670a706ff42ff$
++// $hash=e3aa3fbb265a600d498884b0fbb852fc5bbf8856$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_SCROLL_VIEW_CAPI_H_
+diff --git a/include/capi/views/cef_textfield_capi.h b/include/capi/views/cef_textfield_capi.h
+index e593a6b6e..c525f216d 100644
+--- a/include/capi/views/cef_textfield_capi.h
++++ b/include/capi/views/cef_textfield_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=a38b506d8bc425f3de4809c02d0ec4bc558eb518$
++// $hash=7d5a43282c9847c5c842abd5de023f4c5c69a9f0$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_TEXTFIELD_CAPI_H_
+diff --git a/include/capi/views/cef_textfield_delegate_capi.h b/include/capi/views/cef_textfield_delegate_capi.h
+index 23457452a..a14c0bfed 100644
+--- a/include/capi/views/cef_textfield_delegate_capi.h
++++ b/include/capi/views/cef_textfield_delegate_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=43f4bcda7e81ee1750f5a4c220832455f1ab8300$
++// $hash=482b091326684014bd799fef864e3dfdfc8693a1$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_TEXTFIELD_DELEGATE_CAPI_H_
+diff --git a/include/capi/views/cef_view_capi.h b/include/capi/views/cef_view_capi.h
+index b0d669eb9..5372f61f4 100644
+--- a/include/capi/views/cef_view_capi.h
++++ b/include/capi/views/cef_view_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=dcda9eb9c6258b68faed06f9edfdcabbbb3e7000$
++// $hash=cb5950b283944d06312903eb554cc4c980713e98$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_VIEW_CAPI_H_
+diff --git a/include/capi/views/cef_view_delegate_capi.h b/include/capi/views/cef_view_delegate_capi.h
+index 0edb9d5af..4f4b8f01e 100644
+--- a/include/capi/views/cef_view_delegate_capi.h
++++ b/include/capi/views/cef_view_delegate_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=41b9addf8d38cc522879ba1abd455325e7f98bc4$
++// $hash=70646cb55b5bf98ccfa2a93b2cf57bd5ba367268$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_VIEW_DELEGATE_CAPI_H_
+diff --git a/include/capi/views/cef_window_capi.h b/include/capi/views/cef_window_capi.h
+index e4f515773..b69f47d2f 100644
+--- a/include/capi/views/cef_window_capi.h
++++ b/include/capi/views/cef_window_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=ba3a92d4e09b2f728b330a822669c64ddff1f9d6$
++// $hash=3582ae824b19ee8d1c56a527a5dff472e64804a6$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_WINDOW_CAPI_H_
+@@ -334,6 +334,49 @@ typedef struct _cef_window_t {
+   /// Remove all keyboard accelerators.
+   ///
+   void(CEF_CALLBACK* remove_all_accelerators)(struct _cef_window_t* self);
++
++  ///
++  /// Tells the agl compositor to activate the app
++  ///
++  void(CEF_CALLBACK* agl_activate_app)(struct _cef_window_t* self,
++                                       const cef_string_t* app);
++
++  ///
++  /// Tells the agl compositor the application id
++  ///
++  void(CEF_CALLBACK* agl_set_app_id)(struct _cef_window_t* self,
++                                     const cef_string_t* app_id);
++
++  ///
++  /// Tells the agl compositor that everything is set-up and good to go
++  ///
++  void(CEF_CALLBACK* agl_set_app_ready)(struct _cef_window_t* self);
++
++  ///
++  /// Tells the agl compositor that the app is the background application
++  ///
++  void(CEF_CALLBACK* agl_set_back_ground_app)(struct _cef_window_t* self);
++
++  ///
++  /// Tells the agl compositor that the app is a panel
++  ///
++  void(CEF_CALLBACK* agl_set_panel_app)(struct _cef_window_t* self,
++                                        uint32_t edge);
++
++  ///
++  /// Tells if the window wayland surface is configured
++  ///
++  int(CEF_CALLBACK* is_surface_configured)(struct _cef_window_t* self);
++
++  ///
++  /// A hint for the compositor to use a custom area, rather than inferring the
++  /// activation area.
++  ///
++  void(CEF_CALLBACK* setup_activation_area)(struct _cef_window_t* self,
++                                            uint32_t x,
++                                            uint32_t y,
++                                            uint32_t width,
++                                            uint32_t height);
+ } cef_window_t;
+ ///
+@@ -342,6 +385,13 @@ typedef struct _cef_window_t {
+ CEF_EXPORT cef_window_t* cef_window_create_top_level(
+     struct _cef_window_delegate_t* delegate);
++///
++/// Create a new Window with the provided ID
++///
++CEF_EXPORT cef_window_t* cef_window_create_top_level_with_id(
++    struct _cef_window_delegate_t* delegate,
++    const cef_string_t* app_id);
++
+ #ifdef __cplusplus
+ }
+ #endif
+diff --git a/include/capi/views/cef_window_delegate_capi.h b/include/capi/views/cef_window_delegate_capi.h
+index a74f9e910..e23c097cb 100644
+--- a/include/capi/views/cef_window_delegate_capi.h
++++ b/include/capi/views/cef_window_delegate_capi.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -33,7 +33,7 @@
+ // by hand. See the translator.README.txt file in the tools directory for
+ // more information.
+ //
+-// $hash=e1657ed68132b846ad638dc87bc5ee9b9c10f014$
++// $hash=019abf16be4e151d31181a6bdcb1ad8dfef03d00$
+ //
+ #ifndef CEF_INCLUDE_CAPI_VIEWS_CEF_WINDOW_DELEGATE_CAPI_H_
+diff --git a/include/cef_api_hash.h b/include/cef_api_hash.h
+index 47c6a7212..07f19c47a 100644
+--- a/include/cef_api_hash.h
++++ b/include/cef_api_hash.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 Marshall A. Greenblatt. All rights reserved.
++// Copyright (c) 2023 Marshall A. Greenblatt. All rights reserved.
+ //
+ // Redistribution and use in source and binary forms, with or without
+ // modification, are permitted provided that the following conditions are
+@@ -42,13 +42,13 @@
+ // way that may cause binary incompatibility with other builds. The universal
+ // hash value will change if any platform is affected whereas the platform hash
+ // values will change only if that particular platform is affected.
+-#define CEF_API_HASH_UNIVERSAL "e92cde673e73851d8841e2f3c4f38bcd0f6ed2bb"
++#define CEF_API_HASH_UNIVERSAL "3ae58e0ac999d1e3568659c3dc1726a69ff9c0e6"
+ #if defined(OS_WIN)
+-#define CEF_API_HASH_PLATFORM "162bfdae56cbfd7f76fd4178be019f0dba512c40"
++#define CEF_API_HASH_PLATFORM "3c150cc7af73ac9579681eb25a037ed70a38922e"
+ #elif defined(OS_MAC)
+-#define CEF_API_HASH_PLATFORM "31c5680dbc8d80fffc14214dd1ce4126a08e38d3"
++#define CEF_API_HASH_PLATFORM "79eb6d51d75ffe64614249cb3096c4edc2dcd7d0"
+ #elif defined(OS_LINUX)
+-#define CEF_API_HASH_PLATFORM "9682b2251f9973ee9eee0940eb9c773e522c2975"
++#define CEF_API_HASH_PLATFORM "d95070e146608d518fd0152fec6b9e78fb8236a1"
+ #endif
+ #ifdef __cplusplus
+diff --git a/libcef_dll/cpptoc/views/window_cpptoc.cc b/libcef_dll/cpptoc/views/window_cpptoc.cc
+index fc175de23..4b71b6848 100644
+--- a/libcef_dll/cpptoc/views/window_cpptoc.cc
++++ b/libcef_dll/cpptoc/views/window_cpptoc.cc
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 The Chromium Embedded Framework Authors. All rights
++// Copyright (c) 2023 The Chromium Embedded Framework Authors. All rights
+ // reserved. Use of this source code is governed by a BSD-style license that
+ // can be found in the LICENSE file.
+ //
+@@ -9,7 +9,7 @@
+ // implementations. See the translator.README.txt file in the tools directory
+ // for more information.
+ //
+-// $hash=32506537b2118f2d16285dc09174ae721447adc2$
++// $hash=1d1f538674280357dedd3f8e57854235fd4391ce$
+ //
+ #include "libcef_dll/cpptoc/views/window_cpptoc.h"
+@@ -48,6 +48,30 @@ CEF_EXPORT cef_window_t* cef_window_create_top_level(
+   return CefWindowCppToC::Wrap(_retval);
+ }
++CEF_EXPORT cef_window_t* cef_window_create_top_level_with_id(
++    struct _cef_window_delegate_t* delegate,
++    const cef_string_t* app_id) {
++  shutdown_checker::AssertNotShutdown();
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  // Verify param: delegate; type: refptr_diff
++  DCHECK(delegate);
++  if (!delegate)
++    return NULL;
++  // Verify param: app_id; type: string_byref_const
++  DCHECK(app_id);
++  if (!app_id)
++    return NULL;
++
++  // Execute
++  CefRefPtr<CefWindow> _retval = CefWindow::CreateTopLevelWindowWithId(
++      CefWindowDelegateCToCpp::Wrap(delegate), CefString(app_id));
++
++  // Return type: refptr_same
++  return CefWindowCppToC::Wrap(_retval);
++}
++
+ namespace {
+ // MEMBER FUNCTIONS - Body may be edited by hand.
+@@ -652,6 +676,115 @@ void CEF_CALLBACK window_remove_all_accelerators(struct _cef_window_t* self) {
+   CefWindowCppToC::Get(self)->RemoveAllAccelerators();
+ }
++void CEF_CALLBACK window_agl_activate_app(struct _cef_window_t* self,
++                                          const cef_string_t* app) {
++  shutdown_checker::AssertNotShutdown();
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  DCHECK(self);
++  if (!self)
++    return;
++  // Verify param: app; type: string_byref_const
++  DCHECK(app);
++  if (!app)
++    return;
++
++  // Execute
++  CefWindowCppToC::Get(self)->AglActivateApp(CefString(app));
++}
++
++void CEF_CALLBACK window_agl_set_app_id(struct _cef_window_t* self,
++                                        const cef_string_t* app_id) {
++  shutdown_checker::AssertNotShutdown();
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  DCHECK(self);
++  if (!self)
++    return;
++  // Verify param: app_id; type: string_byref_const
++  DCHECK(app_id);
++  if (!app_id)
++    return;
++
++  // Execute
++  CefWindowCppToC::Get(self)->AglSetAppId(CefString(app_id));
++}
++
++void CEF_CALLBACK window_agl_set_app_ready(struct _cef_window_t* self) {
++  shutdown_checker::AssertNotShutdown();
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  DCHECK(self);
++  if (!self)
++    return;
++
++  // Execute
++  CefWindowCppToC::Get(self)->AglSetAppReady();
++}
++
++void CEF_CALLBACK window_agl_set_back_ground_app(struct _cef_window_t* self) {
++  shutdown_checker::AssertNotShutdown();
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  DCHECK(self);
++  if (!self)
++    return;
++
++  // Execute
++  CefWindowCppToC::Get(self)->AglSetBackGroundApp();
++}
++
++void CEF_CALLBACK window_agl_set_panel_app(struct _cef_window_t* self,
++                                           uint32_t edge) {
++  shutdown_checker::AssertNotShutdown();
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  DCHECK(self);
++  if (!self)
++    return;
++
++  // Execute
++  CefWindowCppToC::Get(self)->AglSetPanelApp(edge);
++}
++
++int CEF_CALLBACK window_is_surface_configured(struct _cef_window_t* self) {
++  shutdown_checker::AssertNotShutdown();
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  DCHECK(self);
++  if (!self)
++    return 0;
++
++  // Execute
++  bool _retval = CefWindowCppToC::Get(self)->IsSurfaceConfigured();
++
++  // Return type: bool
++  return _retval;
++}
++
++void CEF_CALLBACK window_setup_activation_area(struct _cef_window_t* self,
++                                               uint32_t x,
++                                               uint32_t y,
++                                               uint32_t width,
++                                               uint32_t height) {
++  shutdown_checker::AssertNotShutdown();
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  DCHECK(self);
++  if (!self)
++    return;
++
++  // Execute
++  CefWindowCppToC::Get(self)->SetupActivationArea(x, y, width, height);
++}
++
+ struct _cef_window_t* CEF_CALLBACK window_as_window(struct _cef_panel_t* self) {
+   shutdown_checker::AssertNotShutdown();
+@@ -1876,6 +2009,13 @@ CefWindowCppToC::CefWindowCppToC() {
+   GetStruct()->set_accelerator = window_set_accelerator;
+   GetStruct()->remove_accelerator = window_remove_accelerator;
+   GetStruct()->remove_all_accelerators = window_remove_all_accelerators;
++  GetStruct()->agl_activate_app = window_agl_activate_app;
++  GetStruct()->agl_set_app_id = window_agl_set_app_id;
++  GetStruct()->agl_set_app_ready = window_agl_set_app_ready;
++  GetStruct()->agl_set_back_ground_app = window_agl_set_back_ground_app;
++  GetStruct()->agl_set_panel_app = window_agl_set_panel_app;
++  GetStruct()->is_surface_configured = window_is_surface_configured;
++  GetStruct()->setup_activation_area = window_setup_activation_area;
+   GetStruct()->base.as_window = window_as_window;
+   GetStruct()->base.set_to_fill_layout = window_set_to_fill_layout;
+   GetStruct()->base.set_to_box_layout = window_set_to_box_layout;
+diff --git a/libcef_dll/cpptoc/views/window_cpptoc.h b/libcef_dll/cpptoc/views/window_cpptoc.h
+index de348f70d..e02be4494 100644
+--- a/libcef_dll/cpptoc/views/window_cpptoc.h
++++ b/libcef_dll/cpptoc/views/window_cpptoc.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 The Chromium Embedded Framework Authors. All rights
++// Copyright (c) 2023 The Chromium Embedded Framework Authors. All rights
+ // reserved. Use of this source code is governed by a BSD-style license that
+ // can be found in the LICENSE file.
+ //
+@@ -9,7 +9,7 @@
+ // implementations. See the translator.README.txt file in the tools directory
+ // for more information.
+ //
+-// $hash=5b14236c7e00a7dafa47fdc32ce78d347de477a1$
++// $hash=12ff3d7d14f9977ff1f62e9a35b04b153a135480$
+ //
+ #ifndef CEF_LIBCEF_DLL_CPPTOC_VIEWS_WINDOW_CPPTOC_H_
+diff --git a/libcef_dll/ctocpp/views/window_ctocpp.cc b/libcef_dll/ctocpp/views/window_ctocpp.cc
+index 145fa125d..718089e21 100644
+--- a/libcef_dll/ctocpp/views/window_ctocpp.cc
++++ b/libcef_dll/ctocpp/views/window_ctocpp.cc
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 The Chromium Embedded Framework Authors. All rights
++// Copyright (c) 2023 The Chromium Embedded Framework Authors. All rights
+ // reserved. Use of this source code is governed by a BSD-style license that
+ // can be found in the LICENSE file.
+ //
+@@ -9,7 +9,7 @@
+ // implementations. See the translator.README.txt file in the tools directory
+ // for more information.
+ //
+-// $hash=a71d84e671749331e5ad99c84ef790f09613b145$
++// $hash=b94adc237573ebd64f88bbc85aa95810e8efa891$
+ //
+ #include "libcef_dll/ctocpp/views/window_ctocpp.h"
+@@ -49,6 +49,31 @@ CefRefPtr<CefWindow> CefWindow::CreateTopLevelWindow(
+   return CefWindowCToCpp::Wrap(_retval);
+ }
++NO_SANITIZE("cfi-icall")
++CefRefPtr<CefWindow> CefWindow::CreateTopLevelWindowWithId(
++    CefRefPtr<CefWindowDelegate> delegate,
++    const CefString& app_id) {
++  shutdown_checker::AssertNotShutdown();
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  // Verify param: delegate; type: refptr_diff
++  DCHECK(delegate.get());
++  if (!delegate.get())
++    return nullptr;
++  // Verify param: app_id; type: string_byref_const
++  DCHECK(!app_id.empty());
++  if (app_id.empty())
++    return nullptr;
++
++  // Execute
++  cef_window_t* _retval = cef_window_create_top_level_with_id(
++      CefWindowDelegateCppToC::Wrap(delegate), app_id.GetStruct());
++
++  // Return type: refptr_same
++  return CefWindowCToCpp::Wrap(_retval);
++}
++
+ // VIRTUAL METHODS - Body may be edited by hand.
+ NO_SANITIZE("cfi-icall") void CefWindowCToCpp::Show() {
+@@ -642,6 +667,116 @@ NO_SANITIZE("cfi-icall") void CefWindowCToCpp::RemoveAllAccelerators() {
+   _struct->remove_all_accelerators(_struct);
+ }
++NO_SANITIZE("cfi-icall")
++void CefWindowCToCpp::AglActivateApp(const CefString& app) {
++  shutdown_checker::AssertNotShutdown();
++
++  cef_window_t* _struct = GetStruct();
++  if (CEF_MEMBER_MISSING(_struct, agl_activate_app))
++    return;
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  // Verify param: app; type: string_byref_const
++  DCHECK(!app.empty());
++  if (app.empty())
++    return;
++
++  // Execute
++  _struct->agl_activate_app(_struct, app.GetStruct());
++}
++
++NO_SANITIZE("cfi-icall")
++void CefWindowCToCpp::AglSetAppId(const CefString& app_id) {
++  shutdown_checker::AssertNotShutdown();
++
++  cef_window_t* _struct = GetStruct();
++  if (CEF_MEMBER_MISSING(_struct, agl_set_app_id))
++    return;
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  // Verify param: app_id; type: string_byref_const
++  DCHECK(!app_id.empty());
++  if (app_id.empty())
++    return;
++
++  // Execute
++  _struct->agl_set_app_id(_struct, app_id.GetStruct());
++}
++
++NO_SANITIZE("cfi-icall") void CefWindowCToCpp::AglSetAppReady() {
++  shutdown_checker::AssertNotShutdown();
++
++  cef_window_t* _struct = GetStruct();
++  if (CEF_MEMBER_MISSING(_struct, agl_set_app_ready))
++    return;
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  // Execute
++  _struct->agl_set_app_ready(_struct);
++}
++
++NO_SANITIZE("cfi-icall") void CefWindowCToCpp::AglSetBackGroundApp() {
++  shutdown_checker::AssertNotShutdown();
++
++  cef_window_t* _struct = GetStruct();
++  if (CEF_MEMBER_MISSING(_struct, agl_set_back_ground_app))
++    return;
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  // Execute
++  _struct->agl_set_back_ground_app(_struct);
++}
++
++NO_SANITIZE("cfi-icall") void CefWindowCToCpp::AglSetPanelApp(uint32_t edge) {
++  shutdown_checker::AssertNotShutdown();
++
++  cef_window_t* _struct = GetStruct();
++  if (CEF_MEMBER_MISSING(_struct, agl_set_panel_app))
++    return;
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  // Execute
++  _struct->agl_set_panel_app(_struct, edge);
++}
++
++NO_SANITIZE("cfi-icall") bool CefWindowCToCpp::IsSurfaceConfigured() {
++  shutdown_checker::AssertNotShutdown();
++
++  cef_window_t* _struct = GetStruct();
++  if (CEF_MEMBER_MISSING(_struct, is_surface_configured))
++    return false;
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  // Execute
++  int _retval = _struct->is_surface_configured(_struct);
++
++  // Return type: bool
++  return _retval ? true : false;
++}
++
++NO_SANITIZE("cfi-icall")
++void CefWindowCToCpp::SetupActivationArea(uint32_t x,
++                                          uint32_t y,
++                                          uint32_t width,
++                                          uint32_t height) {
++  shutdown_checker::AssertNotShutdown();
++
++  cef_window_t* _struct = GetStruct();
++  if (CEF_MEMBER_MISSING(_struct, setup_activation_area))
++    return;
++
++  // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
++
++  // Execute
++  _struct->setup_activation_area(_struct, x, y, width, height);
++}
++
+ NO_SANITIZE("cfi-icall") CefRefPtr<CefWindow> CefWindowCToCpp::AsWindow() {
+   shutdown_checker::AssertNotShutdown();
+diff --git a/libcef_dll/ctocpp/views/window_ctocpp.h b/libcef_dll/ctocpp/views/window_ctocpp.h
+index dfdc0c686..160e541e5 100644
+--- a/libcef_dll/ctocpp/views/window_ctocpp.h
++++ b/libcef_dll/ctocpp/views/window_ctocpp.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 The Chromium Embedded Framework Authors. All rights
++// Copyright (c) 2023 The Chromium Embedded Framework Authors. All rights
+ // reserved. Use of this source code is governed by a BSD-style license that
+ // can be found in the LICENSE file.
+ //
+@@ -9,7 +9,7 @@
+ // implementations. See the translator.README.txt file in the tools directory
+ // for more information.
+ //
+-// $hash=5afd032b23745d114bc95d45139cf5d92a82f89a$
++// $hash=1162283afe7d77f108ab6a4dee7ce58a2222b0fb$
+ //
+ #ifndef CEF_LIBCEF_DLL_CTOCPP_VIEWS_WINDOW_CTOCPP_H_
+@@ -82,6 +82,16 @@ class CefWindowCToCpp
+                       bool alt_pressed) override;
+   void RemoveAccelerator(int command_id) override;
+   void RemoveAllAccelerators() override;
++  void AglActivateApp(const CefString& app) override;
++  void AglSetAppId(const CefString& app_id) override;
++  void AglSetAppReady() override;
++  void AglSetBackGroundApp() override;
++  void AglSetPanelApp(uint32_t edge) override;
++  bool IsSurfaceConfigured() override;
++  void SetupActivationArea(uint32_t x,
++                           uint32_t y,
++                           uint32_t width,
++                           uint32_t height) override;
+   // CefPanel methods.
+   CefRefPtr<CefWindow> AsWindow() override;
+diff --git a/libcef_dll/libcef_dll.cc b/libcef_dll/libcef_dll.cc
+index c3d5f2b5d..563f597fd 100644
+--- a/libcef_dll/libcef_dll.cc
++++ b/libcef_dll/libcef_dll.cc
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 The Chromium Embedded Framework Authors. All rights
++// Copyright (c) 2023 The Chromium Embedded Framework Authors. All rights
+ // reserved. Use of this source code is governed by a BSD-style license that
+ // can be found in the LICENSE file.
+ //
+@@ -9,7 +9,7 @@
+ // implementations. See the translator.README.txt file in the tools directory
+ // for more information.
+ //
+-// $hash=6bc0085b04e78068511eb7198a3f9bda103adc85$
++// $hash=60eb166db44900db1e9270d781e83b06544a1a3e$
+ //
+ #include "include/capi/cef_app_capi.h"
+diff --git a/libcef_dll/wrapper/libcef_dll_dylib.cc b/libcef_dll/wrapper/libcef_dll_dylib.cc
+index 295b3514e..6e57f2859 100644
+--- a/libcef_dll/wrapper/libcef_dll_dylib.cc
++++ b/libcef_dll/wrapper/libcef_dll_dylib.cc
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 The Chromium Embedded Framework Authors. All rights
++// Copyright (c) 2023 The Chromium Embedded Framework Authors. All rights
+ // reserved. Use of this source code is governed by a BSD-style license that
+ // can be found in the LICENSE file.
+ //
+@@ -9,7 +9,7 @@
+ // implementations. See the translator.README.txt file in the tools directory
+ // for more information.
+ //
+-// $hash=aa091bc741fcefee760906fce4c8f86937dd74ca$
++// $hash=637b28567ccfd4b89ed18bdf77fa81d4a8206173$
+ //
+ #include <dlfcn.h>
+@@ -249,6 +249,8 @@ struct libcef_pointers {
+   decltype(&cef_scroll_view_create) cef_scroll_view_create;
+   decltype(&cef_textfield_create) cef_textfield_create;
+   decltype(&cef_window_create_top_level) cef_window_create_top_level;
++  decltype(&cef_window_create_top_level_with_id)
++      cef_window_create_top_level_with_id;
+   decltype(&cef_api_hash) cef_api_hash;
+   decltype(&cef_version_info) cef_version_info;
+   decltype(&cef_get_min_log_level) cef_get_min_log_level;
+@@ -463,6 +465,7 @@ int libcef_init_pointers(const char* path) {
+   INIT_ENTRY(cef_scroll_view_create);
+   INIT_ENTRY(cef_textfield_create);
+   INIT_ENTRY(cef_window_create_top_level);
++  INIT_ENTRY(cef_window_create_top_level_with_id);
+   INIT_ENTRY(cef_api_hash);
+   INIT_ENTRY(cef_version_info);
+   INIT_ENTRY(cef_get_min_log_level);
+@@ -704,8 +707,8 @@ int cef_create_url(const struct _cef_urlparts_t* parts, cef_string_t* url) {
+ }
+ NO_SANITIZE("cfi-icall")
+-cef_string_userfree_t cef_format_url_for_security_display(
+-    const cef_string_t* origin_url) {
++cef_string_userfree_t
++    cef_format_url_for_security_display(const cef_string_t* origin_url) {
+   return g_libcef_pointers.cef_format_url_for_security_display(origin_url);
+ }
+@@ -977,9 +980,10 @@ void cef_server_create(const cef_string_t* address,
+ }
+ NO_SANITIZE("cfi-icall")
+-struct _cef_shared_process_message_builder_t*
+-cef_shared_process_message_builder_create(const cef_string_t* name,
+-                                          size_t byte_size) {
++struct
++    _cef_shared_process_message_builder_t* cef_shared_process_message_builder_create(
++        const cef_string_t* name,
++        size_t byte_size) {
+   return g_libcef_pointers.cef_shared_process_message_builder_create(name,
+                                                                      byte_size);
+ }
+@@ -1191,46 +1195,54 @@ struct _cef_translator_test_t* cef_translator_test_create() {
+ }
+ NO_SANITIZE("cfi-icall")
+-struct _cef_translator_test_ref_ptr_library_t*
+-cef_translator_test_ref_ptr_library_create(int value) {
++struct
++    _cef_translator_test_ref_ptr_library_t* cef_translator_test_ref_ptr_library_create(
++        int value) {
+   return g_libcef_pointers.cef_translator_test_ref_ptr_library_create(value);
+ }
+ NO_SANITIZE("cfi-icall")
+-struct _cef_translator_test_ref_ptr_library_child_t*
+-cef_translator_test_ref_ptr_library_child_create(int value, int other_value) {
++struct
++    _cef_translator_test_ref_ptr_library_child_t* cef_translator_test_ref_ptr_library_child_create(
++        int value,
++        int other_value) {
+   return g_libcef_pointers.cef_translator_test_ref_ptr_library_child_create(
+       value, other_value);
+ }
+ NO_SANITIZE("cfi-icall")
+-struct _cef_translator_test_ref_ptr_library_child_child_t*
+-cef_translator_test_ref_ptr_library_child_child_create(int value,
+-                                                       int other_value,
+-                                                       int other_other_value) {
++struct
++    _cef_translator_test_ref_ptr_library_child_child_t* cef_translator_test_ref_ptr_library_child_child_create(
++        int value,
++        int other_value,
++        int other_other_value) {
+   return g_libcef_pointers
+       .cef_translator_test_ref_ptr_library_child_child_create(
+           value, other_value, other_other_value);
+ }
+ NO_SANITIZE("cfi-icall")
+-struct _cef_translator_test_scoped_library_t*
+-cef_translator_test_scoped_library_create(int value) {
++struct
++    _cef_translator_test_scoped_library_t* cef_translator_test_scoped_library_create(
++        int value) {
+   return g_libcef_pointers.cef_translator_test_scoped_library_create(value);
+ }
+ NO_SANITIZE("cfi-icall")
+-struct _cef_translator_test_scoped_library_child_t*
+-cef_translator_test_scoped_library_child_create(int value, int other_value) {
++struct
++    _cef_translator_test_scoped_library_child_t* cef_translator_test_scoped_library_child_create(
++        int value,
++        int other_value) {
+   return g_libcef_pointers.cef_translator_test_scoped_library_child_create(
+       value, other_value);
+ }
+ NO_SANITIZE("cfi-icall")
+-struct _cef_translator_test_scoped_library_child_child_t*
+-cef_translator_test_scoped_library_child_child_create(int value,
+-                                                      int other_value,
+-                                                      int other_other_value) {
++struct
++    _cef_translator_test_scoped_library_child_child_t* cef_translator_test_scoped_library_child_child_create(
++        int value,
++        int other_value,
++        int other_other_value) {
+   return g_libcef_pointers
+       .cef_translator_test_scoped_library_child_child_create(value, other_value,
+                                                              other_other_value);
+@@ -1283,14 +1295,14 @@ void cef_display_get_alls(size_t* displaysCount,
+ }
+ NO_SANITIZE("cfi-icall")
+-cef_point_t cef_display_convert_screen_point_to_pixels(
+-    const cef_point_t* point) {
++cef_point_t
++    cef_display_convert_screen_point_to_pixels(const cef_point_t* point) {
+   return g_libcef_pointers.cef_display_convert_screen_point_to_pixels(point);
+ }
+ NO_SANITIZE("cfi-icall")
+-cef_point_t cef_display_convert_screen_point_from_pixels(
+-    const cef_point_t* point) {
++cef_point_t
++    cef_display_convert_screen_point_from_pixels(const cef_point_t* point) {
+   return g_libcef_pointers.cef_display_convert_screen_point_from_pixels(point);
+ }
+@@ -1341,6 +1353,14 @@ struct _cef_window_t* cef_window_create_top_level(
+   return g_libcef_pointers.cef_window_create_top_level(delegate);
+ }
++NO_SANITIZE("cfi-icall")
++struct _cef_window_t* cef_window_create_top_level_with_id(
++    struct _cef_window_delegate_t* delegate,
++    const cef_string_t* app_id) {
++  return g_libcef_pointers.cef_window_create_top_level_with_id(delegate,
++                                                               app_id);
++}
++
+ NO_SANITIZE("cfi-icall") const char* cef_api_hash(int entry) {
+   return g_libcef_pointers.cef_api_hash(entry);
+ }
+diff --git a/libcef_dll/wrapper/libcef_dll_wrapper.cc b/libcef_dll/wrapper/libcef_dll_wrapper.cc
+index eec632f7f..0f119ff76 100644
+--- a/libcef_dll/wrapper/libcef_dll_wrapper.cc
++++ b/libcef_dll/wrapper/libcef_dll_wrapper.cc
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 The Chromium Embedded Framework Authors. All rights
++// Copyright (c) 2023 The Chromium Embedded Framework Authors. All rights
+ // reserved. Use of this source code is governed by a BSD-style license that
+ // can be found in the LICENSE file.
+ //
+@@ -9,7 +9,7 @@
+ // implementations. See the translator.README.txt file in the tools directory
+ // for more information.
+ //
+-// $hash=24d0396cbcb6e2af587c1126c899277d4ac0b4d2$
++// $hash=d5a08cdf0fed1ce8d92526cd0423706f3385d098$
+ //
+ #include "include/capi/cef_app_capi.h"
+@@ -150,7 +150,7 @@ NO_SANITIZE("cfi-icall") CEF_GLOBAL bool CefCrashReportingEnabled() {
+ NO_SANITIZE("cfi-icall")
+ CEF_GLOBAL
+-void CefSetCrashKeyValue(const CefString& key, const CefString& value) {
++    void CefSetCrashKeyValue(const CefString& key, const CefString& value) {
+   // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
+   // Verify param: key; type: string_byref_const
+@@ -305,10 +305,10 @@ NO_SANITIZE("cfi-icall") CEF_GLOBAL bool CefIsRTL() {
+ NO_SANITIZE("cfi-icall")
+ CEF_GLOBAL
+-bool CefAddCrossOriginWhitelistEntry(const CefString& source_origin,
+-                                     const CefString& target_protocol,
+-                                     const CefString& target_domain,
+-                                     bool allow_target_subdomains) {
++    bool CefAddCrossOriginWhitelistEntry(const CefString& source_origin,
++                                         const CefString& target_protocol,
++                                         const CefString& target_domain,
++                                         bool allow_target_subdomains) {
+   // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
+   // Verify param: source_origin; type: string_byref_const
+@@ -332,10 +332,10 @@ bool CefAddCrossOriginWhitelistEntry(const CefString& source_origin,
+ NO_SANITIZE("cfi-icall")
+ CEF_GLOBAL
+-bool CefRemoveCrossOriginWhitelistEntry(const CefString& source_origin,
+-                                        const CefString& target_protocol,
+-                                        const CefString& target_domain,
+-                                        bool allow_target_subdomains) {
++    bool CefRemoveCrossOriginWhitelistEntry(const CefString& source_origin,
++                                            const CefString& target_protocol,
++                                            const CefString& target_domain,
++                                            bool allow_target_subdomains) {
+   // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
+   // Verify param: source_origin; type: string_byref_const
+@@ -419,7 +419,7 @@ CEF_GLOBAL bool CefCreateURL(const CefURLParts& parts, CefString& url) {
+ NO_SANITIZE("cfi-icall")
+ CEF_GLOBAL CefString
+-CefFormatUrlForSecurityDisplay(const CefString& origin_url) {
++    CefFormatUrlForSecurityDisplay(const CefString& origin_url) {
+   // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
+   // Verify param: origin_url; type: string_byref_const
+@@ -457,8 +457,8 @@ CEF_GLOBAL CefString CefGetMimeType(const CefString& extension) {
+ NO_SANITIZE("cfi-icall")
+ CEF_GLOBAL
+-void CefGetExtensionsForMimeType(const CefString& mime_type,
+-                                 std::vector<CefString>& extensions) {
++    void CefGetExtensionsForMimeType(const CefString& mime_type,
++                                     std::vector<CefString>& extensions) {
+   // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
+   // Verify param: mime_type; type: string_byref_const
+@@ -612,8 +612,8 @@ CEF_GLOBAL CefRefPtr<CefValue> CefParseJSONAndReturnError(
+ }
+ NO_SANITIZE("cfi-icall")
+-CEF_GLOBAL CefString CefWriteJSON(CefRefPtr<CefValue> node,
+-                                  cef_json_writer_options_t options) {
++CEF_GLOBAL CefString
++    CefWriteJSON(CefRefPtr<CefValue> node, cef_json_writer_options_t options) {
+   // AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
+   // Verify param: node; type: refptr_same
+diff --git a/libcef_dll/wrapper_types.h b/libcef_dll/wrapper_types.h
+index 1157bfd1c..eddb3ec90 100644
+--- a/libcef_dll/wrapper_types.h
++++ b/libcef_dll/wrapper_types.h
+@@ -1,4 +1,4 @@
+-// Copyright (c) 2022 The Chromium Embedded Framework Authors. All rights
++// Copyright (c) 2023 The Chromium Embedded Framework Authors. All rights
+ // reserved. Use of this source code is governed by a BSD-style license that
+ // can be found in the LICENSE file.
+ //
+@@ -9,7 +9,7 @@
+ // implementations. See the translator.README.txt file in the tools directory
+ // for more information.
+ //
+-// $hash=e8bf5997bf7a4e77f39247068da48b539ef838b0$
++// $hash=220cf66311a9b87b0edfadf9617138d7cf3273f8$
+ //
+ #ifndef CEF_LIBCEF_DLL_WRAPPER_TYPES_H_
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/chromium/0001-sql-relax-constraints-on-VirtualCursor-layout.patch b/recipes-wam/cef/files/chromium/0001-sql-relax-constraints-on-VirtualCursor-layout.patch
new file mode 100644 (file)
index 0000000..624dd50
--- /dev/null
@@ -0,0 +1,51 @@
+From 94ffefa81d00466fabcf1050080c95fa4b294dda Mon Sep 17 00:00:00 2001
+From: Elly Fong-Jones <ellyjones@chromium.org>
+Date: Thu, 2 Mar 2023 00:15:11 +0000
+Subject: [PATCH 1/9] sql: relax constraints on VirtualCursor layout
+
+VirtualCursor::FromSqliteCursor required that VirtualCursor had a
+standard layout, but in fact VirtualCursor shouldn't have a standard
+layout, and the fact that it does with libc++ is a deviation from the
+C++ standard. This change:
+
+1. Relaxes the requirement that VirtualCursor has a standard layout, and
+2. Relaxes the requirement that the sqlite_cursor_ field has to be at
+   offset 0
+
+by use of offsetof() and pointer subtraction. This change both improves
+standards compliance and makes this code build with libstdc++.
+
+Bug: 1380656
+Change-Id: I9c47abd9197b187da0360ca5619ccf7dadab4f33
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4292313
+Reviewed-by: Austin Sullivan <asully@chromium.org>
+Commit-Queue: Elly Fong-Jones <ellyjones@chromium.org>
+Cr-Commit-Position: refs/heads/main@{#1111925}
+---
+ sql/recover_module/cursor.h | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+diff --git a/sql/recover_module/cursor.h b/sql/recover_module/cursor.h
+index 1970bdca8c6f1..4cb0655700977 100644
+--- a/sql/recover_module/cursor.h
++++ b/sql/recover_module/cursor.h
+@@ -63,12 +63,10 @@ class VirtualCursor {
+   // |sqlite_cursor| must have been returned by VirtualTable::SqliteCursor().
+   static inline VirtualCursor* FromSqliteCursor(
+       sqlite3_vtab_cursor* sqlite_cursor) {
+-    static_assert(std::is_standard_layout<VirtualCursor>::value,
+-                  "needed for the reinterpret_cast below");
+-    static_assert(offsetof(VirtualCursor, sqlite_cursor_) == 0,
+-                  "sqlite_cursor_ must be the first member of the class");
+-    VirtualCursor* result = reinterpret_cast<VirtualCursor*>(sqlite_cursor);
+-    DCHECK_EQ(sqlite_cursor, &result->sqlite_cursor_);
++    VirtualCursor* result = reinterpret_cast<VirtualCursor*>(
++        (reinterpret_cast<char*>(sqlite_cursor) -
++         offsetof(VirtualCursor, sqlite_cursor_)));
++    CHECK_EQ(sqlite_cursor, &result->sqlite_cursor_);
+     return result;
+   }
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/chromium/0002-Don-t-look-for-depot_tools-in-chrommium-s-third_part.patch b/recipes-wam/cef/files/chromium/0002-Don-t-look-for-depot_tools-in-chrommium-s-third_part.patch
new file mode 100644 (file)
index 0000000..dd05b37
--- /dev/null
@@ -0,0 +1,32 @@
+From dd5ce9e0d0dbf55184a9c57c4c81eeaf9a7dd3a9 Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Fri, 7 Apr 2023 16:28:51 +0200
+Subject: [PATCH 2/9] Don't look for depot_tools in chrommium's third_party
+ folder
+
+---
+ build/find_depot_tools.py | 8 --------
+ 1 file changed, 8 deletions(-)
+
+diff --git a/build/find_depot_tools.py b/build/find_depot_tools.py
+index 94985fe7b3495..6d2adcfa63531 100755
+--- a/build/find_depot_tools.py
++++ b/build/find_depot_tools.py
+@@ -28,14 +28,6 @@ def IsRealDepotTools(path):
+ def add_depot_tools_to_path():
+   """Search for depot_tools and add it to sys.path."""
+-  # First, check if we have a DEPS'd in "depot_tools".
+-  deps_depot_tools = os.path.join(SRC, 'third_party', 'depot_tools')
+-  if IsRealDepotTools(deps_depot_tools):
+-    # Put the pinned version at the start of the sys.path, in case there
+-    # are other non-pinned versions already on the sys.path.
+-    sys.path.insert(0, deps_depot_tools)
+-    return deps_depot_tools
+-
+   # Then look if depot_tools is already in PYTHONPATH.
+   for i in sys.path:
+     if i.rstrip(os.sep).endswith('depot_tools') and IsRealDepotTools(i):
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/chromium/0003-Remove-the-GN-settings-done-for-clang-that-conflict-.patch b/recipes-wam/cef/files/chromium/0003-Remove-the-GN-settings-done-for-clang-that-conflict-.patch
new file mode 100644 (file)
index 0000000..68c37f2
--- /dev/null
@@ -0,0 +1,116 @@
+From 22de50ac2371aed1e04e4cb248beabb7f8ad3ebe Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Thu, 27 Apr 2023 16:16:28 +0200
+Subject: [PATCH 3/9] Remove the GN settings done for clang that conflict with
+ OE
+
+clang cross compiler that is build with meta-clang has lot of these
+settings built-in and specifying them here confuses the compiler
+
+--target option and -no-canonical-prefixes options result in clang
+
+finding the headers in target sysroot
+
+Upstream-Status: Inappropriate [OE-Specific]
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+Rebased-by: Maksim Sisov <msisov@igalia.com>
+Rebased-by: Randy MacLeod <randy.macleod@windriver.com>
+Rebased-by: Roger Zanoni <rzanoni@igalia.com>
+---
+ build/config/compiler/BUILD.gn | 37 ----------------------------------
+ 1 file changed, 37 deletions(-)
+
+diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
+index 531b326c498d0..244a6757613d5 100644
+--- a/build/config/compiler/BUILD.gn
++++ b/build/config/compiler/BUILD.gn
+@@ -924,11 +924,6 @@ config("compiler_cpu_abi") {
+         ]
+       }
+     } else if (current_cpu == "arm") {
+-      if (is_clang && !is_android && !is_nacl &&
+-          !(is_chromeos_lacros && is_chromeos_device)) {
+-        cflags += [ "--target=arm-linux-gnueabihf" ]
+-        ldflags += [ "--target=arm-linux-gnueabihf" ]
+-      }
+       if (!is_nacl) {
+         cflags += [
+           "-march=$arm_arch",
+@@ -939,11 +934,6 @@ config("compiler_cpu_abi") {
+         cflags += [ "-mtune=$arm_tune" ]
+       }
+     } else if (current_cpu == "arm64") {
+-      if (is_clang && !is_android && !is_nacl && !is_fuchsia &&
+-          !(is_chromeos_lacros && is_chromeos_device)) {
+-        cflags += [ "--target=aarch64-linux-gnu" ]
+-        ldflags += [ "--target=aarch64-linux-gnu" ]
+-      }
+       if (is_android) {
+         # Outline atomics crash on Exynos 9810. http://crbug.com/1272795
+         cflags += [ "-mno-outline-atomics" ]
+@@ -955,9 +945,6 @@ config("compiler_cpu_abi") {
+           if (is_android) {
+             cflags += [ "--target=mipsel-linux-android" ]
+             ldflags += [ "--target=mipsel-linux-android" ]
+-          } else {
+-            cflags += [ "--target=mipsel-linux-gnu" ]
+-            ldflags += [ "--target=mipsel-linux-gnu" ]
+           }
+         } else {
+           cflags += [ "-EL" ]
+@@ -1037,8 +1024,6 @@ config("compiler_cpu_abi") {
+       ldflags += [ "-Wl,--hash-style=sysv" ]
+       if (custom_toolchain == "") {
+         if (is_clang) {
+-          cflags += [ "--target=mips-linux-gnu" ]
+-          ldflags += [ "--target=mips-linux-gnu" ]
+         } else {
+           cflags += [ "-EB" ]
+           ldflags += [ "-EB" ]
+@@ -1086,9 +1071,6 @@ config("compiler_cpu_abi") {
+           if (is_android) {
+             cflags += [ "--target=mips64el-linux-android" ]
+             ldflags += [ "--target=mips64el-linux-android" ]
+-          } else {
+-            cflags += [ "--target=mips64el-linux-gnuabi64" ]
+-            ldflags += [ "--target=mips64el-linux-gnuabi64" ]
+           }
+         } else {
+           cflags += [
+@@ -1146,8 +1128,6 @@ config("compiler_cpu_abi") {
+       ldflags += [ "-Wl,--hash-style=sysv" ]
+       if (custom_toolchain == "") {
+         if (is_clang) {
+-          cflags += [ "--target=mips64-linux-gnuabi64" ]
+-          ldflags += [ "--target=mips64-linux-gnuabi64" ]
+         } else {
+           cflags += [
+             "-EB",
+@@ -1309,23 +1289,6 @@ config("compiler_deterministic") {
+       }
+     }
+   }
+-
+-  # Tells the compiler not to use absolute paths when passing the default
+-  # paths to the tools it invokes. We don't want this because we don't
+-  # really need it and it can mess up the goma cache entries.
+-  if (is_clang && (!is_nacl || is_nacl_saigo)) {
+-    cflags += [ "-no-canonical-prefixes" ]
+-
+-    # Same for links: Let the compiler driver invoke the linker
+-    # with a relative path and pass relative paths to built-in
+-    # libraries. Not needed on Windows because we call the linker
+-    # directly there, not through the compiler driver.
+-    # We don't link on goma, so this change is just for cleaner
+-    # internal linker invocations, for people who work on the build.
+-    if (!is_win) {
+-      ldflags += [ "-no-canonical-prefixes" ]
+-    }
+-  }
+ }
+ config("clang_revision") {
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/chromium/0004-Don-t-use-DRI-for-renesas.patch b/recipes-wam/cef/files/chromium/0004-Don-t-use-DRI-for-renesas.patch
new file mode 100644 (file)
index 0000000..332e1f2
--- /dev/null
@@ -0,0 +1,42 @@
+From 60b8b1379f2eb154a3c58c00dabbf0f9f0bd5445 Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Thu, 4 May 2023 10:42:06 +0200
+Subject: [PATCH 4/9] Don't use DRI for renesas
+
+This adds the use_dri flag that defauls to true and
+can be disabled if we are building CEF using ozone + wayland
+
+Signed-off-by: Roger Zanoni <rzanoni@igalia.com>
+---
+ content/gpu/BUILD.gn | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/content/gpu/BUILD.gn b/content/gpu/BUILD.gn
+index 9f5f303b2f220..f7639030ac30c 100644
+--- a/content/gpu/BUILD.gn
++++ b/content/gpu/BUILD.gn
+@@ -8,6 +8,10 @@ import("//build/config/ui.gni")
+ import("//gpu/vulkan/features.gni")
+ import("//media/media_options.gni")
++declare_args() {
++  use_dri = true
++}
++
+ # See //content/BUILD.gn for how this works.
+ group("gpu") {
+   visibility = [ "//content/*" ]  # This is an internal content API.
+@@ -137,8 +141,8 @@ target(link_target_type, "gpu_sources") {
+   }
+   # Use DRI on desktop Linux builds.
+-  if (current_cpu != "s390x" && current_cpu != "ppc64" && is_linux &&
+-      !is_castos) {
++  if (use_dri && current_cpu != "s390x" && current_cpu != "ppc64" &&
++      is_linux && !is_castos) {
+     configs += [ "//build/config/linux/dri" ]
+   }
+ }
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/chromium/0005-Add-the-essential-parts-of-wayland-extensions-and-ag.patch b/recipes-wam/cef/files/chromium/0005-Add-the-essential-parts-of-wayland-extensions-and-ag.patch
new file mode 100644 (file)
index 0000000..fea8c04
--- /dev/null
@@ -0,0 +1,912 @@
+From 7e927a21ecaa70c14873d5f06667dfc3bdaa4d25 Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Mon, 15 May 2023 20:32:06 +0200
+Subject: [PATCH 5/9] Add the essential parts of wayland extensions and
+ agl_shell
+
+---
+ ui/base/ui_base_switches.cc                   |   2 +
+ ui/base/ui_base_switches.h                    |   3 +
+ ui/ozone/platform/wayland/BUILD.gn            |   7 +
+ .../platform/wayland/extensions/agl/BUILD.gn  |  40 ++++
+ .../agl/common/wayland_object_agl.cc          |  26 +++
+ .../agl/common/wayland_object_agl.h           |  34 ++++
+ .../extensions/agl/host/agl_shell_wrapper.cc  | 113 +++++++++++
+ .../extensions/agl/host/agl_shell_wrapper.h   |  62 ++++++
+ .../agl/host/wayland_extensions_agl.h         |  37 ++++
+ .../agl/host/wayland_extensions_agl_impl.cc   |  93 +++++++++
+ .../agl/host/wayland_extensions_agl_impl.h    |  54 ++++++
+ .../extensions/agl/protocol/agl-shell.xml     | 179 ++++++++++++++++++
+ .../wayland/host/wayland_connection.cc        |  12 +-
+ .../wayland/host/wayland_connection.h         |   6 +
+ .../wayland/host/wayland_extensions.h         |  56 ++++++
+ 15 files changed, 722 insertions(+), 2 deletions(-)
+ create mode 100644 ui/ozone/platform/wayland/extensions/agl/BUILD.gn
+ create mode 100644 ui/ozone/platform/wayland/extensions/agl/common/wayland_object_agl.cc
+ create mode 100644 ui/ozone/platform/wayland/extensions/agl/common/wayland_object_agl.h
+ create mode 100644 ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.cc
+ create mode 100644 ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h
+ create mode 100644 ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl.h
+ create mode 100644 ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
+ create mode 100644 ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.h
+ create mode 100644 ui/ozone/platform/wayland/extensions/agl/protocol/agl-shell.xml
+ create mode 100644 ui/ozone/platform/wayland/host/wayland_extensions.h
+
+diff --git a/ui/base/ui_base_switches.cc b/ui/base/ui_base_switches.cc
+index f8556679a79d8..e72ae83737c04 100644
+--- a/ui/base/ui_base_switches.cc
++++ b/ui/base/ui_base_switches.cc
+@@ -100,4 +100,6 @@ const char kUIDisablePartialSwap[] = "ui-disable-partial-swap";
+ // Enables the ozone x11 clipboard for linux-chromeos.
+ const char kUseSystemClipboard[] = "use-system-clipboard";
++const char kAglShellAppId[] = "agl-shell-appid";
++
+ }  // namespace switches
+diff --git a/ui/base/ui_base_switches.h b/ui/base/ui_base_switches.h
+index d35e544f2bc2f..019ba0e5151e5 100644
+--- a/ui/base/ui_base_switches.h
++++ b/ui/base/ui_base_switches.h
+@@ -45,6 +45,9 @@ COMPONENT_EXPORT(UI_BASE) extern const char kTopChromeTouchUiEnabled[];
+ COMPONENT_EXPORT(UI_BASE) extern const char kUIDisablePartialSwap[];
+ COMPONENT_EXPORT(UI_BASE) extern const char kUseSystemClipboard[];
++// Agl related
++COMPONENT_EXPORT(UI_BASE) extern const char kAglShellAppId[];
++
+ // Test related.
+ COMPONENT_EXPORT(UI_BASE) extern const char kDisallowNonExactResourceReuse[];
+ COMPONENT_EXPORT(UI_BASE) extern const char kMangleLocalizedStrings[];
+diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn
+index e0f0d7dea3747..1a2f889dc8947 100644
+--- a/ui/ozone/platform/wayland/BUILD.gn
++++ b/ui/ozone/platform/wayland/BUILD.gn
+@@ -407,6 +407,13 @@ source_set("wayland") {
+     ]
+   }
++  sources += [
++   "host/wayland_extensions.h",
++   "host/wayland_extensions_stub.cc",
++  ]
++
++  deps += [ "extensions/agl" ]
++
+   configs += [ "//third_party/khronos:khronos_headers" ]
+ }
+diff --git a/ui/ozone/platform/wayland/extensions/agl/BUILD.gn b/ui/ozone/platform/wayland/extensions/agl/BUILD.gn
+new file mode 100644
+index 0000000000000..ce289bc5dbbca
+--- /dev/null
++++ b/ui/ozone/platform/wayland/extensions/agl/BUILD.gn
+@@ -0,0 +1,40 @@
++# Copyright 2021 LG Electronics, Inc.
++#
++# Licensed under the Apache License, Version 2.0 (the "License");
++# you may not use this file except in compliance with the License.
++# You may obtain a copy of the License at
++#
++# http://www.apache.org/licenses/LICENSE-2.0
++#
++# Unless required by applicable law or agreed to in writing, software
++# distributed under the License is distributed on an "AS IS" BASIS,
++# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++# See the License for the specific language governing permissions and
++# limitations under the License.
++#
++# SPDX-License-Identifier: Apache-2.0
++
++import("//third_party/wayland/wayland_protocol.gni")
++
++visibility = [ "//ui/ozone/*" ]
++
++wayland_protocol("agl_shell_protocol") {
++  sources = [ "protocol/agl-shell.xml" ]
++}
++
++source_set("agl") {
++  sources = [
++    "common/wayland_object_agl.cc",
++    "common/wayland_object_agl.h",
++    "host/agl_shell_wrapper.cc",
++    "host/agl_shell_wrapper.h",
++    "host/wayland_extensions_agl.h",
++    "host/wayland_extensions_agl_impl.cc",
++    "host/wayland_extensions_agl_impl.h",
++  ]
++
++  deps = [
++    ":agl_shell_protocol",
++    "//ui/ozone/platform/wayland/mojom",
++  ]
++}
+diff --git a/ui/ozone/platform/wayland/extensions/agl/common/wayland_object_agl.cc b/ui/ozone/platform/wayland/extensions/agl/common/wayland_object_agl.cc
+new file mode 100644
+index 0000000000000..9f3300766df2c
+--- /dev/null
++++ b/ui/ozone/platform/wayland/extensions/agl/common/wayland_object_agl.cc
+@@ -0,0 +1,26 @@
++// Copyright 2021 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++
++#include "ui/ozone/platform/wayland/extensions/agl/common/wayland_object_agl.h"
++
++#include <agl-shell-client-protocol.h>
++
++namespace wl {
++
++const wl_interface* ObjectTraits<agl_shell>::interface = &agl_shell_interface;
++void (*ObjectTraits<agl_shell>::deleter)(agl_shell*) = &agl_shell_destroy;
++
++}  // namespace wl
+\ No newline at end of file
+diff --git a/ui/ozone/platform/wayland/extensions/agl/common/wayland_object_agl.h b/ui/ozone/platform/wayland/extensions/agl/common/wayland_object_agl.h
+new file mode 100644
+index 0000000000000..e91ac0da8d2fc
+--- /dev/null
++++ b/ui/ozone/platform/wayland/extensions/agl/common/wayland_object_agl.h
+@@ -0,0 +1,34 @@
++// Copyright 2021 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++
++#ifndef UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_COMMON_WAYLAND_OBJECT_AGL_H_
++#define UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_COMMON_WAYLAND_OBJECT_AGL_H_
++
++#include "ui/ozone/platform/wayland/common/wayland_object.h"
++
++struct agl_shell;
++
++namespace wl {
++
++template <>
++struct ObjectTraits<agl_shell> {
++  static const wl_interface* interface;
++  static void (*deleter)(agl_shell*);
++};
++
++}  // namespace wl
++
++#endif  // UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_COMMON_WAYLAND_OBJECT_AGL_H_
+\ No newline at end of file
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.cc b/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.cc
+new file mode 100644
+index 0000000000000..c74fa5d9cd221
+--- /dev/null
++++ b/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.cc
+@@ -0,0 +1,113 @@
++// Copyright 2021 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++
++#include "ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h"
++
++#include "agl_shell_wrapper.h"
++#include "base/logging.h"
++#include "ui/base/ui_base_switches.h"
++#include "ui/ozone/platform/wayland/host/wayland_connection.h"
++#include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
++#include "ui/ozone/platform/wayland/host/wayland_window.h"
++
++namespace ui {
++
++static const struct agl_shell_listener shell_listener = {
++    &AglShellWrapper::AglShellBoundOk,
++    &AglShellWrapper::AglShellBoundFail,
++#ifdef AGL_SHELL_APP_STATE_SINCE_VERSION
++    &AglShellWrapper::AglAppState,
++#endif
++};
++
++AglShellWrapper::AglShellWrapper(agl_shell* agl_shell,
++                                 WaylandConnection* wayland_connection)
++    : agl_shell_(agl_shell), connection_(wayland_connection) {
++  if (wl::get_version_of_object(agl_shell) >= AGL_SHELL_BOUND_OK_SINCE_VERSION)
++    agl_shell_add_listener(agl_shell, &shell_listener, this);
++}
++
++AglShellWrapper::~AglShellWrapper() = default;
++
++void AglShellWrapper::SetAglActivateApp(const std::string& app_id) {
++  wl_output* output =
++      connection_->wayland_output_manager()->GetPrimaryOutput()->get_output();
++  agl_shell_activate_app(agl_shell_.get(), app_id.c_str(), output);
++}
++
++void AglShellWrapper::SetAglPanel(WaylandWindow* window, uint32_t edge) {
++  wl_surface* surface = window->root_surface()->surface();
++  wl_output* output =
++      connection_->wayland_output_manager()->GetPrimaryOutput()->get_output();
++
++  agl_shell_set_panel(agl_shell_.get(), surface, output, edge);
++}
++
++void AglShellWrapper::SetAglBackground(WaylandWindow* window) {
++  wl_surface* surface = window->root_surface()->surface();
++  wl_output* output =
++      connection_->wayland_output_manager()->GetPrimaryOutput()->get_output();
++
++  agl_shell_set_background(agl_shell_.get(), surface, output);
++}
++
++void AglShellWrapper::SetAglReady() {
++  agl_shell_ready(agl_shell_.get());
++}
++
++// static
++void AglShellWrapper::AglShellBoundOk(void* data, struct agl_shell*) {
++  AglShellWrapper* wrapper = static_cast<AglShellWrapper*>(data);
++  wrapper->wait_for_bound_ = false;
++  wrapper->bound_ok_ = true;
++  LOG(INFO) << "Bound to agl_shell (bound_ok)";
++}
++
++// static
++void AglShellWrapper::AglShellBoundFail(void* data, struct agl_shell*) {
++  AglShellWrapper* wrapper = static_cast<AglShellWrapper*>(data);
++  wrapper->wait_for_bound_ = false;
++  wrapper->bound_ok_ = false;
++  LOG(INFO) << "Failed to bind to agl_shell (bound_fail)";
++}
++
++#ifdef AGL_SHELL_APP_STATE_SINCE_VERSION
++// static
++void AglShellWrapper::AglAppState(void* data,
++                                  struct agl_shell*,
++                                  const char* app_id,
++                                  uint32_t state) {
++  AglShellWrapper* wrapper = static_cast<AglShellWrapper*>(data);
++
++  LOG(INFO) << "State for app " << app_id << " changed to " << state;
++
++  if (state == AGL_SHELL_APP_STATE_STARTED) {
++    wrapper->SetAglActivateApp(app_id);
++    LOG(INFO) << "Activating app " << app_id;
++  }
++}
++#endif
++
++bool AglShellWrapper::WaitUntilBoundOk() {
++  int ret = 0;
++  while (ret != -1 && wait_for_bound_) {
++    ret = wl_display_dispatch(connection_->display());
++  }
++
++  return bound_ok_;
++}
++
++}  // namespace ui
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h b/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h
+new file mode 100644
+index 0000000000000..2ab765883057e
+--- /dev/null
++++ b/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h
+@@ -0,0 +1,62 @@
++// Copyright 2021 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++
++#ifndef UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_AGL_SHELL_WRAPPER_H_
++#define UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_AGL_SHELL_WRAPPER_H_
++
++#include <string>
++
++#include <agl-shell-client-protocol.h>
++
++#include "ui/ozone/platform/wayland/extensions/agl/common/wayland_object_agl.h"
++
++namespace ui {
++
++class WaylandConnection;
++class WaylandWindow;
++
++class AglShellWrapper {
++ public:
++  AglShellWrapper(agl_shell* agl_shell, WaylandConnection* wayland_connection);
++  AglShellWrapper(const AglShellWrapper&) = delete;
++  AglShellWrapper& operator=(const AglShellWrapper&) = delete;
++  ~AglShellWrapper();
++
++  void SetAglActivateApp(const std::string& app_id);
++  void SetAglPanel(WaylandWindow* window, uint32_t edge);
++  void SetAglBackground(WaylandWindow* window);
++  void SetAglReady();
++  bool WaitUntilBoundOk();
++
++  static void AglShellBoundOk(void* data, struct agl_shell*);
++  static void AglShellBoundFail(void* data, struct agl_shell*);
++#ifdef AGL_SHELL_APP_STATE_SINCE_VERSION
++  static void AglAppState(void* data,
++                          struct agl_shell*,
++                          const char* app_id,
++                          uint32_t state);
++#endif
++
++ private:
++  wl::Object<agl_shell> agl_shell_;
++  WaylandConnection* connection_;
++  bool wait_for_bound_ = true;
++  bool bound_ok_ = false;
++};
++
++}  // namespace ui
++
++#endif  // UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_AGL_SHELL_WRAPPER_H_
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl.h b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl.h
+new file mode 100644
+index 0000000000000..df42fc00c84da
+--- /dev/null
++++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl.h
+@@ -0,0 +1,37 @@
++// Copyright 2021 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++
++#ifndef UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_WAYLAND_EXTENSIONS_AGL_H_
++#define UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_WAYLAND_EXTENSIONS_AGL_H_
++
++namespace ui {
++
++class AglShellWrapper;
++
++// AGL extensions implementation for webOS/Lite
++class WaylandExtensionsAgl {
++ public:
++  WaylandExtensionsAgl() = default;
++  WaylandExtensionsAgl(const WaylandExtensionsAgl&) = delete;
++  WaylandExtensionsAgl& operator=(const WaylandExtensionsAgl&) = delete;
++  virtual ~WaylandExtensionsAgl() = default;
++
++  virtual AglShellWrapper* GetAglShell() = 0;
++};
++
++}  // namespace ui
++
++#endif  // UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_WAYLAND_EXTENSIONS_AGL_H_
+\ No newline at end of file
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
+new file mode 100644
+index 0000000000000..26a5f0550c302
+--- /dev/null
++++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
+@@ -0,0 +1,93 @@
++// Copyright 2021 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++
++#include "ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.h"
++
++#include <cstring>
++
++#include "base/command_line.h"
++#include "base/logging.h"
++#include "ui/base/ui_base_switches.h"
++#include "ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h"
++#include "ui/ozone/platform/wayland/extensions/agl/common/wayland_object_agl.h"
++#include "ui/ozone/platform/wayland/host/wayland_connection.h"
++
++namespace ui {
++
++namespace {
++
++constexpr uint32_t kMinAglShellExtensionVersion = 1;
++constexpr uint32_t kMaxAglShellExtensionVersion = 3;
++
++}  // namespace
++
++WaylandExtensionsAglImpl::WaylandExtensionsAglImpl(
++    WaylandConnection* connection)
++    : connection_(connection) {}
++
++WaylandExtensionsAglImpl::~WaylandExtensionsAglImpl() = default;
++
++bool WaylandExtensionsAglImpl::Bind(wl_registry* registry,
++                                    uint32_t name,
++                                    const char* interface,
++                                    uint32_t version) {
++  bool should_use_agl_shell = base::CommandLine::ForCurrentProcess()->HasSwitch(
++      switches::kAglShellAppId);
++  bool can_bind = wl::CanBind(interface, version, kMinAglShellExtensionVersion,
++                              kMaxAglShellExtensionVersion);
++  bool is_agl_shell_interface = (strcmp(interface, "agl_shell") == 0);
++
++  if (!is_agl_shell_interface) {
++      return false;
++  }
++
++  LOG(INFO) << "should_use_agl_shell: " << should_use_agl_shell <<
++               " can_bind: " << can_bind;
++
++  if (should_use_agl_shell && !agl_shell_ &&
++      is_agl_shell_interface && can_bind) {
++    wl::Object<agl_shell> aglshell = wl::Bind<agl_shell>(
++        registry, name, std::min(version, kMaxAglShellExtensionVersion));
++    if (!aglshell) {
++      LOG(ERROR) << "Failed to bind to agl_shell global";
++      return false;
++    }
++    agl_shell_ =
++        std::make_unique<AglShellWrapper>(aglshell.release(), connection_);
++
++    LOG(INFO) << "Waiting until bound...";
++    return agl_shell_->WaitUntilBoundOk();
++  } else {
++    LOG(INFO) << "Cant bind.";
++  }
++
++  return false;
++}
++
++bool WaylandExtensionsAglImpl::HasShellObject() const {
++  return !!agl_shell_;
++}
++
++AglShellWrapper* WaylandExtensionsAglImpl::GetAglShell() {
++  return agl_shell_.get();
++}
++
++std::unique_ptr<WaylandExtensions> CreateWaylandExtensions(
++    WaylandConnection* connection) {
++  return std::make_unique<WaylandExtensionsAglImpl>(connection);
++}
++
++}  // namespace ui
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.h b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.h
+new file mode 100644
+index 0000000000000..f6cbabe99ed0b
+--- /dev/null
++++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.h
+@@ -0,0 +1,54 @@
++// Copyright 2021 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++
++#ifndef UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_WAYLAND_EXTENSIONS_AGL_IMPL_H_
++#define UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_WAYLAND_EXTENSIONS_AGL_IMPL_H_
++
++#include "ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl.h"
++#include "ui/ozone/platform/wayland/host/wayland_extensions.h"
++
++namespace ui {
++
++class AglShellWrapper;
++
++// AGL extension implementation for webOS/Lite
++class WaylandExtensionsAglImpl : public WaylandExtensions,
++                                 public WaylandExtensionsAgl {
++ public:
++  explicit WaylandExtensionsAglImpl(WaylandConnection* connection);
++  WaylandExtensionsAglImpl(const WaylandExtensionsAglImpl&) = delete;
++  WaylandExtensionsAglImpl& operator=(const WaylandExtensionsAglImpl&) = delete;
++  ~WaylandExtensionsAglImpl() override;
++
++  // WaylandExtensions overrides
++  bool Bind(wl_registry* registry,
++            uint32_t name,
++            const char* interface,
++            uint32_t version) override;
++
++  bool HasShellObject() const override;
++
++  // WaylandExtensionsAgl overrides
++  AglShellWrapper* GetAglShell() override;
++
++ private:
++  std::unique_ptr<AglShellWrapper> agl_shell_;
++  WaylandConnection* connection_;
++};
++
++}  // namespace ui
++
++#endif  // UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_WAYLAND_EXTENSIONS_AGL_IMPL_H_
+diff --git a/ui/ozone/platform/wayland/extensions/agl/protocol/agl-shell.xml b/ui/ozone/platform/wayland/extensions/agl/protocol/agl-shell.xml
+new file mode 100644
+index 0000000000000..ad5553d61f189
+--- /dev/null
++++ b/ui/ozone/platform/wayland/extensions/agl/protocol/agl-shell.xml
+@@ -0,0 +1,179 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<protocol name="agl_shell">
++  <copyright>
++    Copyright Â© 2019, 2022 Collabora, Ltd.
++
++    Permission is hereby granted, free of charge, to any person obtaining a
++    copy of this software and associated documentation files (the "Software"),
++    to deal in the Software without restriction, including without limitation
++    the rights to use, copy, modify, merge, publish, distribute, sublicense,
++    and/or sell copies of the Software, and to permit persons to whom the
++    Software is furnished to do so, subject to the following conditions:
++
++    The above copyright notice and this permission notice (including the next
++    paragraph) shall be included in all copies or substantial portions of the
++    Software.
++
++    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
++    THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++    DEALINGS IN THE SOFTWARE.
++  </copyright>
++  <interface name="agl_shell" version="3">
++    <description summary="user interface for Automotive Grade Linux platform">
++      Starting with version 2 of the protocol, the client is required to wait
++      for the 'bound_ok' or 'bound_fail' events in order to proceed further.
++
++      In case the client gets a 'bound_fail' event then it should consider that
++      there's another client already bound to the agl_shell protocol.
++      A client that receives a 'bound_ok' event should consider that there's
++      no other client already bound to the interface and can proceed further.
++
++      If the client uses an older version of the protocol it will receive
++      automatically an error and the compositor will terminate the connection,
++      if there's another client already bound the interface.
++
++      If the client receives the 'bound_fail' event and attempts to use the
++      interface further it will receive an error and the compositor will
++      terminate the connection. After the 'bound_fail' event was received the
++      client should call the destructor, which has been added with version 2
++      of the protocol. The client is free to try at a later point in time to
++      see if it will receive the 'bound_ok' event, but there's no explicit way
++      of finding out when that event will be delivered.
++      It is assumed that it can infer that information through other
++      means/other channels.
++    </description>
++
++    <enum name="error">
++      <entry name="invalid_argument" value="0"/>
++      <entry name="background_exists" value="1"/>
++      <entry name="panel_exists" value="2"/>
++    </enum>
++
++    <enum name="edge">
++      <entry name="top" value="0"/>
++      <entry name="bottom" value="1"/>
++      <entry name="left" value="2"/>
++      <entry name="right" value="3"/>
++    </enum>
++
++    <enum name="app_state" since="3">
++      <entry name="started" value="0"/>
++      <entry name="terminated" value="1"/>
++      <entry name="activated" value="2"/>
++      <entry name="deactivated" value="3"/>
++    </enum>
++
++    <request name="ready">
++      <description summary="client is ready to be shown">
++        Tell the server that this client is ready to be shown. The server
++        will delay presentation during start-up until all shell clients are
++        ready to be shown, and will display a black screen instead.
++        This gives the client an opportunity to set up and configure several
++        surfaces into a coherent interface.
++
++        The client that binds to this interface must send this request, otherwise
++        they may stall the compositor unnecessarily.
++
++        If this request is called after the compositor has already finished
++        start-up, no operation is performed.
++      </description>
++    </request>
++
++    <request name="set_background">
++      <description summary="set surface as output's background">
++        Set the surface to act as the background of an output. After this
++        request, the server will immediately send a configure event with
++        the dimensions the client should use to cover the entire output.
++
++        The surface must have a "desktop" surface role, as supported by
++        libweston-desktop.
++
++        Only a single surface may be the background for any output. If a
++        background surface already exists, a protocol error is raised.
++      </description>
++      <arg name="surface" type="object" interface="wl_surface"/>
++      <arg name="output" type="object" interface="wl_output"/>
++    </request>
++
++    <request name="set_panel">
++      <description summary="set surface as panel">
++        Set the surface to act as a panel of an output. The 'edge' argument
++        says what edge of the output the surface will be anchored to.
++        After this request, the server will send a configure event with the
++        corresponding width/height that the client should use, and 0 for the
++        other dimension. E.g. if the edge is 'top', the width will be the
++        output's width, and the height will be 0.
++
++        The surface must have a "desktop" surface role, as supported by
++        libweston-desktop.
++
++        The compositor will take the panel's window geometry into account when
++        positioning other windows, so the panels are not covered.
++
++        XXX: What happens if e.g. both top and left are used at the same time?
++        Who gets to have the corner?
++
++        Only a single surface may be the panel for an output's edge. If a
++        surface already exists on an edge, a protocol error is raised.
++      </description>
++      <arg name="surface" type="object" interface="wl_surface"/>
++      <arg name="output" type="object" interface="wl_output"/>
++      <arg name="edge" type="uint" enum="edge"/>
++    </request>
++
++    <request name="activate_app">
++      <description summary="make client current window">
++        Ask the compositor to make a toplevel to become the current/focused
++        window for window management purposes.
++
++        See xdg_toplevel.set_app_id from the xdg-shell protocol for a
++        description of app_id.
++
++        If multiple toplevels have the same app_id, the result is unspecified.
++
++        XXX: Do we need feedback to say it didn't work? (e.g. client does
++        not exist)
++      </description>
++      <arg name="app_id" type="string"/>
++      <arg name="output" type="object" interface="wl_output"/>
++    </request>
++
++    <event name="bound_ok" since="2">
++     <description summary="event sent if binding was ok">
++        Informs the client that it was able to bind the agl_shell
++        interface succesfully. Clients are required to wait for this
++        event before continuing further.
++     </description>
++    </event>
++
++    <event name="bound_fail" since="2">
++      <description summary="event sent if binding was nok">
++        Informs the client that binding to the agl_shell interface was
++        unsuccesfull. Clients are required to wait for this event for
++        continuing further.
++      </description>
++    </event>
++
++    <request name="destroy" type="destructor" since="2">
++      <description summary="destroys the factory object">
++      </description>
++    </request>
++
++    <event name="app_state" since="3">
++      <description summary="event sent when an application suffered state modification">
++        Informs the client that an application has changed its state to another,
++        specified by the app_state enum. Client can use this event to track
++        current application state. For instance to know when the application has
++        started, or when terminated/stopped.
++      </description>
++      <arg name="app_id" type="string"/>
++      <arg name="state" type="uint" enum="app_state"/>
++    </event>
++
++
++  </interface>
++</protocol>
+diff --git a/ui/ozone/platform/wayland/host/wayland_connection.cc b/ui/ozone/platform/wayland/host/wayland_connection.cc
+index 6d44128e56458..93427c52e1284 100644
+--- a/ui/ozone/platform/wayland/host/wayland_connection.cc
++++ b/ui/ozone/platform/wayland/host/wayland_connection.cc
+@@ -64,6 +64,8 @@
+ #include "ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.h"
+ #include "ui/platform_window/common/platform_window_defaults.h"
++#include "ui/ozone/platform/wayland/host/wayland_extensions.h"
++
+ #if defined(USE_LIBWAYLAND_STUBS)
+ #include <dlfcn.h>
+@@ -238,6 +240,10 @@ bool WaylandConnection::Initialize() {
+     return false;
+   }
++  if (!extensions_) {
++    extensions_ = CreateWaylandExtensions(this);
++  }
++
+   // Now that the connection with the display server has been properly
+   // estabilished, initialize the event source and input objects.
+   DCHECK(!event_source_);
+@@ -264,7 +270,7 @@ bool WaylandConnection::Initialize() {
+     LOG(ERROR) << "No wl_shm object";
+     return false;
+   }
+-  if (!shell_v6_ && !shell_) {
++  if (!shell_v6_ && !shell_ && !(extensions_ && extensions_->HasShellObject())) {
+     LOG(ERROR) << "No Wayland shell found";
+     return false;
+   }
+@@ -434,7 +440,9 @@ void WaylandConnection::Global(void* data,
+   auto* connection = static_cast<WaylandConnection*>(data);
+   auto factory_it = connection->global_object_factories_.find(interface);
+-  if (factory_it != connection->global_object_factories_.end()) {
++  if (connection->extensions_->Bind(registry, name, interface, version)) {
++    DVLOG(1) << "Successfully bound to " << interface;
++  } else if (factory_it != connection->global_object_factories_.end()) {
+     (*factory_it->second)(connection, registry, name, interface, version);
+   } else if (!connection->compositor_ &&
+              strcmp(interface, "wl_compositor") == 0) {
+diff --git a/ui/ozone/platform/wayland/host/wayland_connection.h b/ui/ozone/platform/wayland/host/wayland_connection.h
+index d33959ad4066f..dfd1d060c73f2 100644
+--- a/ui/ozone/platform/wayland/host/wayland_connection.h
++++ b/ui/ozone/platform/wayland/host/wayland_connection.h
+@@ -45,6 +45,7 @@ class WaylandBufferManagerHost;
+ class WaylandCursor;
+ class WaylandCursorBufferListener;
+ class WaylandEventSource;
++class WaylandExtensions;
+ class WaylandOutputManager;
+ class WaylandSeat;
+ class WaylandZAuraShell;
+@@ -185,6 +186,8 @@ class WaylandConnection {
+   WaylandZAuraShell* zaura_shell() const { return zaura_shell_.get(); }
++  WaylandExtensions* extensions() { return extensions_.get(); }
++
+   WaylandZcrColorManager* zcr_color_manager() const {
+     return zcr_color_manager_.get();
+   }
+@@ -424,6 +427,9 @@ class WaylandConnection {
+   std::unique_ptr<OverlayPrioritizer> overlay_prioritizer_;
+   std::unique_ptr<SurfaceAugmenter> surface_augmenter_;
++  std::unique_ptr<WaylandExtensions> extensions_;
++
++
+   // Clipboard-related objects. |clipboard_| must be declared after all
+   // DeviceManager instances it depends on, otherwise tests may crash with
+   // UAFs while attempting to access already destroyed manager pointers.
+diff --git a/ui/ozone/platform/wayland/host/wayland_extensions.h b/ui/ozone/platform/wayland/host/wayland_extensions.h
+new file mode 100644
+index 0000000000000..3bd2fd7a211ae
+--- /dev/null
++++ b/ui/ozone/platform/wayland/host/wayland_extensions.h
+@@ -0,0 +1,56 @@
++// Copyright 2019 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++
++#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_EXTENSIONS_H_
++#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_EXTENSIONS_H_
++
++#include <memory>
++
++#include "ui/ozone/platform/wayland/common/wayland_object.h"
++
++namespace ui {
++
++class ShellToplevelWrapper;
++class ShellPopupWrapper;
++class WaylandConnection;
++
++// Wayland extensions abstract interface to support extending of the Wayland
++// protocol. Inherit it to provide your own Wayland extensions implementation.
++class WaylandExtensions {
++ public:
++  WaylandExtensions() = default;
++  WaylandExtensions(const WaylandExtensions&) = delete;
++  WaylandExtensions& operator=(const WaylandExtensions&) = delete;
++  virtual ~WaylandExtensions() = default;
++
++  // Binds to the extensions interface(s). Can encapsulate binding of several
++  // interfaces, defined by |interface|.
++  virtual bool Bind(wl_registry* registry,
++                    uint32_t name,
++                    const char* interface,
++                    uint32_t version) = 0;
++
++  // Checks whether the extensions have bound shell object(s).
++  virtual bool HasShellObject() const = 0;
++};
++
++// Creates Wayland extensions.
++std::unique_ptr<WaylandExtensions> CreateWaylandExtensions(
++  WaylandConnection* connection);
++
++}  // namespace ui
++
++#endif  // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_EXTENSIONS_H_
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/chromium/0006-Add-webos-agl-waylandwindow-window-tree-host-essenti.patch b/recipes-wam/cef/files/chromium/0006-Add-webos-agl-waylandwindow-window-tree-host-essenti.patch
new file mode 100644 (file)
index 0000000..5ea8b83
--- /dev/null
@@ -0,0 +1,1379 @@
+From a99977eb329ca0e114ad13ce31acc6ed38bb6a7b Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Wed, 17 May 2023 21:25:53 +0200
+Subject: [PATCH 6/9] Add webos/agl waylandwindow/window tree host essential
+ parts
+
+---
+ ui/aura/BUILD.gn                              |  7 ++
+ ui/aura/agl/window_tree_host_agl.h            | 42 +++++++++
+ ui/aura/agl/window_tree_host_platform_agl.cc  | 50 +++++++++++
+ ui/aura/agl/window_tree_host_platform_agl.h   | 51 +++++++++++
+ ui/aura/window_tree_host.h                    |  5 +-
+ ui/aura/window_tree_host_platform.cc          |  4 +-
+ ui/aura/window_tree_host_platform.h           |  4 +-
+ ui/ozone/platform/wayland/BUILD.gn            |  1 -
+ .../platform/wayland/extensions/agl/BUILD.gn  |  2 +
+ .../agl/host/wayland_extensions_agl.h         | 10 ++-
+ .../agl/host/wayland_extensions_agl_impl.cc   | 11 ++-
+ .../agl/host/wayland_extensions_agl_impl.h    |  9 ++
+ .../extensions/agl/host/wayland_window_agl.cc | 86 +++++++++++++++++++
+ .../extensions/agl/host/wayland_window_agl.h  | 49 +++++++++++
+ .../wayland/gpu/gl_surface_wayland.cc         | 10 ++-
+ .../host/gtk_primary_selection_device.cc      |  2 +-
+ .../gtk_primary_selection_device_manager.cc   |  4 +-
+ .../wayland/host/proxy/wayland_proxy_impl.cc  |  2 +-
+ .../wayland/host/wayland_connection.cc        | 23 ++++-
+ .../wayland/host/wayland_connection.h         |  9 +-
+ .../platform/wayland/host/wayland_cursor.cc   |  4 +-
+ .../wayland/host/wayland_data_device.cc       | 10 +--
+ .../wayland/host/wayland_data_device_base.cc  |  2 +-
+ .../host/wayland_data_drag_controller.cc      |  2 +-
+ .../wayland/host/wayland_data_source.cc       |  6 +-
+ ui/ozone/platform/wayland/host/wayland_drm.cc |  6 +-
+ .../wayland/host/wayland_extensions.h         |  6 ++
+ .../platform/wayland/host/wayland_keyboard.cc |  4 +-
+ .../platform/wayland/host/wayland_popup.cc    |  4 +-
+ ui/ozone/platform/wayland/host/wayland_shm.cc |  2 +-
+ .../platform/wayland/host/wayland_surface.cc  |  2 +-
+ .../wayland/host/wayland_toplevel_window.cc   | 14 +--
+ .../platform/wayland/host/wayland_window.cc   | 14 +--
+ .../platform/wayland/host/wayland_window.h    |  2 +
+ .../host/wayland_window_drag_controller.cc    |  2 +-
+ .../wayland/host/wayland_window_factory.cc    | 15 ++++
+ .../wayland/host/wayland_zwp_linux_dmabuf.cc  |  4 +-
+ .../wayland/host/xdg_foreign_wrapper.cc       |  4 +-
+ .../wayland/host/xdg_popup_wrapper_impl.cc    |  2 +-
+ .../wayland/host/xdg_surface_wrapper_impl.cc  |  2 +-
+ .../host/zwp_primary_selection_device.cc      |  2 +-
+ .../zwp_primary_selection_device_manager.cc   |  4 +-
+ .../host/zxdg_surface_v6_wrapper_impl.cc      |  2 +-
+ ui/platform_window/agl/platform_window_agl.h  | 36 ++++++++
+ ui/platform_window/platform_window.h          |  4 +-
+ 45 files changed, 471 insertions(+), 65 deletions(-)
+ create mode 100644 ui/aura/agl/window_tree_host_agl.h
+ create mode 100644 ui/aura/agl/window_tree_host_platform_agl.cc
+ create mode 100644 ui/aura/agl/window_tree_host_platform_agl.h
+ create mode 100644 ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.cc
+ create mode 100644 ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h
+ create mode 100644 ui/platform_window/agl/platform_window_agl.h
+
+diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn
+index 1beb9003b2fad..f3d3e359a9704 100644
+--- a/ui/aura/BUILD.gn
++++ b/ui/aura/BUILD.gn
+@@ -99,6 +99,13 @@ component("aura") {
+     "window_tree_host_platform.cc",
+   ]
++  public += [
++    "agl/window_tree_host_agl.h",
++    "agl/window_tree_host_platform_agl.h"
++  ]
++
++  sources += [ "agl/window_tree_host_platform_agl.cc" ]
++
+   friend = [ ":*" ]
+   defines = [ "AURA_IMPLEMENTATION" ]
+diff --git a/ui/aura/agl/window_tree_host_agl.h b/ui/aura/agl/window_tree_host_agl.h
+new file mode 100644
+index 0000000000000..858a078d939d0
+--- /dev/null
++++ b/ui/aura/agl/window_tree_host_agl.h
+@@ -0,0 +1,42 @@
++// Copyright 2021 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++
++#ifndef UI_AURA_AGL_WINDOW_TREE_HOST_AGL_H_
++#define UI_AURA_AGL_WINDOW_TREE_HOST_AGL_H_
++
++#include <string>
++
++#include "ui/aura/aura_export.h"
++
++namespace aura {
++
++class AURA_EXPORT WindowTreeHostAgl {
++ public:
++  WindowTreeHostAgl() = default;
++  WindowTreeHostAgl(const WindowTreeHostAgl&) = delete;
++  WindowTreeHostAgl& operator=(const WindowTreeHostAgl&) = delete;
++  ~WindowTreeHostAgl() = default;
++
++  virtual void SetAglActivateApp(const std::string& app) {}
++  virtual void SetAglAppId(const std::string& title) {}
++  virtual void SetAglReady() {}
++  virtual void SetAglBackground() {}
++  virtual void SetAglPanel(uint32_t edge) {}
++};
++
++}  // namespace aura
++
++#endif  // UI_AURA_AGL_WINDOW_TREE_HOST_AGL_H_
+diff --git a/ui/aura/agl/window_tree_host_platform_agl.cc b/ui/aura/agl/window_tree_host_platform_agl.cc
+new file mode 100644
+index 0000000000000..e34595fe0ed9c
+--- /dev/null
++++ b/ui/aura/agl/window_tree_host_platform_agl.cc
+@@ -0,0 +1,50 @@
++// Copyright 2021 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++
++#include "ui/aura/agl/window_tree_host_platform_agl.h"
++
++#include "ui/aura/window_tree_host_platform.h"
++#include "ui/platform_window/platform_window.h"
++
++namespace aura {
++
++WindowTreeHostPlatformAgl::WindowTreeHostPlatformAgl(
++    std::unique_ptr<Window> window,
++    aura::WindowTreeHostPlatform* window_tree_host_platform)
++    : aura::WindowTreeHost(std::move(window)),
++      window_tree_host_platform_(window_tree_host_platform) {}
++
++void WindowTreeHostPlatformAgl::SetAglActivateApp(const std::string& app) {
++  window_tree_host_platform_->platform_window()->SetAglActivateApp(app);
++}
++
++void WindowTreeHostPlatformAgl::SetAglAppId(const std::string& title) {
++  window_tree_host_platform_->platform_window()->SetAglAppId(title);
++}
++
++void WindowTreeHostPlatformAgl::SetAglReady() {
++  window_tree_host_platform_->platform_window()->SetAglReady();
++}
++
++void WindowTreeHostPlatformAgl::SetAglBackground() {
++  window_tree_host_platform_->platform_window()->SetAglBackground();
++}
++
++void WindowTreeHostPlatformAgl::SetAglPanel(uint32_t edge) {
++  window_tree_host_platform_->platform_window()->SetAglPanel(edge);
++}
++
++}  // namespace aura
+diff --git a/ui/aura/agl/window_tree_host_platform_agl.h b/ui/aura/agl/window_tree_host_platform_agl.h
+new file mode 100644
+index 0000000000000..181eefae346f7
+--- /dev/null
++++ b/ui/aura/agl/window_tree_host_platform_agl.h
+@@ -0,0 +1,51 @@
++// Copyright 2021 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++
++#ifndef UI_AURA_AGL_WINDOW_TREE_HOST_PLATFORM_AGL_H_
++#define UI_AURA_AGL_WINDOW_TREE_HOST_PLATFORM_AGL_H_
++
++#include <memory>
++
++#include "ui/aura/aura_export.h"
++#include "ui/aura/window_tree_host.h"
++
++namespace aura {
++
++class Window;
++class WindowTreeHostPlatform;
++
++class AURA_EXPORT WindowTreeHostPlatformAgl : public aura::WindowTreeHost {
++ public:
++  explicit WindowTreeHostPlatformAgl(
++      std::unique_ptr<Window> window,
++      aura::WindowTreeHostPlatform* window_tree_host_platform);
++  WindowTreeHostPlatformAgl(const WindowTreeHostPlatformAgl&) = delete;
++  WindowTreeHostPlatformAgl& operator=(const WindowTreeHostPlatformAgl&) = delete;
++  ~WindowTreeHostPlatformAgl() override = default;
++
++  void SetAglActivateApp(const std::string& app) override;
++  void SetAglAppId(const std::string& title) override;
++  void SetAglReady() override;
++  void SetAglBackground() override;
++  void SetAglPanel(uint32_t edge) override;
++
++ private:
++  aura::WindowTreeHostPlatform* window_tree_host_platform_;
++};
++
++}  // namespace aura
++
++#endif  // UI_AURA_AGL_WINDOW_TREE_HOST_PLATFORM_AGL_H_
+diff --git a/ui/aura/window_tree_host.h b/ui/aura/window_tree_host.h
+index 0bdb86be66ba3..b7696e6373284 100644
+--- a/ui/aura/window_tree_host.h
++++ b/ui/aura/window_tree_host.h
+@@ -30,6 +30,8 @@
+ #include "ui/gfx/native_widget_types.h"
+ #include "ui/gfx/overlay_transform.h"
++#include "ui/aura/agl/window_tree_host_agl.h"
++
+ namespace gfx {
+ class Point;
+ class Rect;
+@@ -66,7 +68,8 @@ class WindowTreeHostObserver;
+ class AURA_EXPORT WindowTreeHost : public ui::ImeKeyEventDispatcher,
+                                    public ui::EventSource,
+                                    public display::DisplayObserver,
+-                                   public ui::CompositorObserver {
++                                   public ui::CompositorObserver,
++                                   public WindowTreeHostAgl {
+  public:
+   // VideoCaptureLock ensures state necessary for capturing video remains in
+   // effect. For example, this may force keeping the compositor visible when
+diff --git a/ui/aura/window_tree_host_platform.cc b/ui/aura/window_tree_host_platform.cc
+index 4c31e785d7692..cecd1f4fc03fd 100644
+--- a/ui/aura/window_tree_host_platform.cc
++++ b/ui/aura/window_tree_host_platform.cc
+@@ -51,7 +51,7 @@ std::unique_ptr<WindowTreeHost> WindowTreeHost::Create(
+ WindowTreeHostPlatform::WindowTreeHostPlatform(
+     ui::PlatformWindowInitProperties properties,
+     std::unique_ptr<Window> window)
+-    : WindowTreeHost(std::move(window)) {
++    : WindowTreeHostPlatformAgl(std::move(window), this) {
+   size_in_pixels_ = properties.bounds.size();
+   CreateCompositor(false, false, properties.enable_compositing_based_throttling,
+                    properties.compositor_memory_limit_mb);
+@@ -59,7 +59,7 @@ WindowTreeHostPlatform::WindowTreeHostPlatform(
+ }
+ WindowTreeHostPlatform::WindowTreeHostPlatform(std::unique_ptr<Window> window)
+-    : WindowTreeHost(std::move(window)),
++    : WindowTreeHostPlatformAgl(std::move(window), this),
+       widget_(gfx::kNullAcceleratedWidget),
+       current_cursor_(ui::mojom::CursorType::kNull) {}
+diff --git a/ui/aura/window_tree_host_platform.h b/ui/aura/window_tree_host_platform.h
+index 3a9232743bda3..6c1e3a424afd4 100644
+--- a/ui/aura/window_tree_host_platform.h
++++ b/ui/aura/window_tree_host_platform.h
+@@ -15,6 +15,8 @@
+ #include "ui/gfx/native_widget_types.h"
+ #include "ui/platform_window/platform_window_delegate.h"
++#include "ui/aura/agl/window_tree_host_platform_agl.h"
++
+ namespace ui {
+ enum class DomCode;
+ class PlatformWindow;
+@@ -26,7 +28,7 @@ namespace aura {
+ // The unified WindowTreeHost implementation for platforms
+ // that implement PlatformWindow.
+-class AURA_EXPORT WindowTreeHostPlatform : public WindowTreeHost,
++class AURA_EXPORT WindowTreeHostPlatform : public WindowTreeHostPlatformAgl,
+                                            public ui::PlatformWindowDelegate {
+  public:
+   explicit WindowTreeHostPlatform(ui::PlatformWindowInitProperties properties,
+diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn
+index 1a2f889dc8947..86ff8269af9e0 100644
+--- a/ui/ozone/platform/wayland/BUILD.gn
++++ b/ui/ozone/platform/wayland/BUILD.gn
+@@ -409,7 +409,6 @@ source_set("wayland") {
+   sources += [
+    "host/wayland_extensions.h",
+-   "host/wayland_extensions_stub.cc",
+   ]
+   deps += [ "extensions/agl" ]
+diff --git a/ui/ozone/platform/wayland/extensions/agl/BUILD.gn b/ui/ozone/platform/wayland/extensions/agl/BUILD.gn
+index ce289bc5dbbca..01c590e53df58 100644
+--- a/ui/ozone/platform/wayland/extensions/agl/BUILD.gn
++++ b/ui/ozone/platform/wayland/extensions/agl/BUILD.gn
+@@ -31,6 +31,8 @@ source_set("agl") {
+     "host/wayland_extensions_agl.h",
+     "host/wayland_extensions_agl_impl.cc",
+     "host/wayland_extensions_agl_impl.h",
++    "host/wayland_window_agl.cc",
++    "host/wayland_window_agl.h",
+   ]
+   deps = [
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl.h b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl.h
+index df42fc00c84da..295154dfb437d 100644
+--- a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl.h
++++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl.h
+@@ -20,6 +20,9 @@
+ namespace ui {
+ class AglShellWrapper;
++class PlatformWindowDelegate;
++class WaylandConnection;
++class WaylandWindow;
+ // AGL extensions implementation for webOS/Lite
+ class WaylandExtensionsAgl {
+@@ -29,9 +32,14 @@ class WaylandExtensionsAgl {
+   WaylandExtensionsAgl& operator=(const WaylandExtensionsAgl&) = delete;
+   virtual ~WaylandExtensionsAgl() = default;
++  virtual std::unique_ptr<WaylandWindow> CreateWaylandWindow(
++      PlatformWindowDelegate* delegate,
++      WaylandConnection* connection) = 0;
++
++
+   virtual AglShellWrapper* GetAglShell() = 0;
+ };
+ }  // namespace ui
+-#endif  // UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_WAYLAND_EXTENSIONS_AGL_H_
+\ No newline at end of file
++#endif  // UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_WAYLAND_EXTENSIONS_AGL_H_
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
+index 26a5f0550c302..87376cbb8a9d3 100644
+--- a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
++++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
+@@ -22,6 +22,7 @@
+ #include "base/logging.h"
+ #include "ui/base/ui_base_switches.h"
+ #include "ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h"
++#include "ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h"
+ #include "ui/ozone/platform/wayland/extensions/agl/common/wayland_object_agl.h"
+ #include "ui/ozone/platform/wayland/host/wayland_connection.h"
+@@ -68,8 +69,8 @@ bool WaylandExtensionsAglImpl::Bind(wl_registry* registry,
+     agl_shell_ =
+         std::make_unique<AglShellWrapper>(aglshell.release(), connection_);
+-    LOG(INFO) << "Waiting until bound...";
+-    return agl_shell_->WaitUntilBoundOk();
++    //LOG(INFO) << "Waiting until bound...";
++    //return agl_shell_->WaitUntilBoundOk();
+   } else {
+     LOG(INFO) << "Cant bind.";
+   }
+@@ -85,6 +86,12 @@ AglShellWrapper* WaylandExtensionsAglImpl::GetAglShell() {
+   return agl_shell_.get();
+ }
++std::unique_ptr<WaylandWindow> WaylandExtensionsAglImpl::CreateWaylandWindow(
++    PlatformWindowDelegate* delegate,
++    WaylandConnection* connection) {
++  return std::make_unique<WaylandWindowAgl>(delegate, connection, this);
++}
++
+ std::unique_ptr<WaylandExtensions> CreateWaylandExtensions(
+     WaylandConnection* connection) {
+   return std::make_unique<WaylandExtensionsAglImpl>(connection);
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.h b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.h
+index f6cbabe99ed0b..3218589f1a09a 100644
+--- a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.h
++++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.h
+@@ -17,12 +17,17 @@
+ #ifndef UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_WAYLAND_EXTENSIONS_AGL_IMPL_H_
+ #define UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_WAYLAND_EXTENSIONS_AGL_IMPL_H_
++#include <memory>
++
+ #include "ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl.h"
+ #include "ui/ozone/platform/wayland/host/wayland_extensions.h"
+ namespace ui {
+ class AglShellWrapper;
++class PlatformWindowDelegate;
++class WaylandConnection;
++class WaylandWindow;
+ // AGL extension implementation for webOS/Lite
+ class WaylandExtensionsAglImpl : public WaylandExtensions,
+@@ -44,6 +49,10 @@ class WaylandExtensionsAglImpl : public WaylandExtensions,
+   // WaylandExtensionsAgl overrides
+   AglShellWrapper* GetAglShell() override;
++  std::unique_ptr<WaylandWindow> CreateWaylandWindow(
++      PlatformWindowDelegate* delegate,
++      WaylandConnection* connection) override;
++
+  private:
+   std::unique_ptr<AglShellWrapper> agl_shell_;
+   WaylandConnection* connection_;
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.cc b/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.cc
+new file mode 100644
+index 0000000000000..97b21ae537658
+--- /dev/null
++++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.cc
+@@ -0,0 +1,86 @@
++// Copyright 2021 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++
++#include "ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h"
++
++#include "base/logging.h"
++#include "ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h"
++#include "ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl.h"
++#include "ui/ozone/platform/wayland/host/shell_surface_wrapper.h"
++#include "ui/ozone/platform/wayland/host/shell_toplevel_wrapper.h"
++#include "ui/ozone/platform/wayland/host/wayland_connection.h"
++
++namespace ui {
++
++WaylandWindowAgl::WaylandWindowAgl(PlatformWindowDelegate* delegate,
++                                   WaylandConnection* connection,
++                                   WaylandExtensionsAgl* agl_extensions)
++    : WaylandToplevelWindow(delegate, connection),
++      agl_extensions_(agl_extensions) {}
++
++WaylandWindowAgl::~WaylandWindowAgl() = default;
++
++void WaylandWindowAgl::SetAglActivateApp(const std::string& app) {
++  if (!agl_extensions_->GetAglShell()) {
++    LOG(ERROR) << "Agl shell wrapper is not created";
++    return;
++  }
++
++  agl_extensions_->GetAglShell()->SetAglActivateApp(app);
++  connection()->ScheduleFlush();
++}
++
++void WaylandWindowAgl::SetAglAppId(const std::string& title) {
++  if (!shell_toplevel()) {
++    LOG(ERROR) << "Shell toplevel is not created";
++    return;
++  }
++
++  shell_toplevel()->SetAppId(title);
++  connection()->ScheduleFlush();
++}
++
++void WaylandWindowAgl::SetAglReady() {
++  if (!agl_extensions_->GetAglShell()) {
++    LOG(ERROR) << "Agl shell wrapper is not created";
++    return;
++  }
++
++  agl_extensions_->GetAglShell()->SetAglReady();
++  connection()->ScheduleFlush();
++}
++
++void WaylandWindowAgl::SetAglBackground() {
++  if (!agl_extensions_->GetAglShell()) {
++    LOG(ERROR) << "Agl shell wrapper is not created";
++    return;
++  }
++
++  agl_extensions_->GetAglShell()->SetAglBackground(this);
++  connection()->ScheduleFlush();
++}
++
++void WaylandWindowAgl::SetAglPanel(uint32_t edge) {
++  if (!agl_extensions_->GetAglShell()) {
++    LOG(ERROR) << "Agl shell wrapper is not created";
++    return;
++  }
++
++  agl_extensions_->GetAglShell()->SetAglPanel(this, edge);
++  connection()->ScheduleFlush();
++}
++
++}  // namespace ui
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h b/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h
+new file mode 100644
+index 0000000000000..b2a922604c001
+--- /dev/null
++++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h
+@@ -0,0 +1,49 @@
++// Copyright 2021 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++//
++
++#ifndef UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_WAYLAND_WINDOW_AGL_H_
++#define UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_WAYLAND_WINDOW_AGL_H_
++
++#include "ui/ozone/platform/wayland/host/wayland_toplevel_window.h"
++
++namespace ui {
++
++class WaylandExtensionsAgl;
++
++class WaylandWindowAgl : public WaylandToplevelWindow {
++ public:
++  explicit WaylandWindowAgl(PlatformWindowDelegate* delegate,
++                            WaylandConnection* connection,
++                            WaylandExtensionsAgl* agl_extensions);
++  WaylandWindowAgl(const WaylandWindowAgl&) = delete;
++  WaylandWindowAgl& operator=(const WaylandWindowAgl&) = delete;
++  ~WaylandWindowAgl() override;
++
++  // Overrides PlatformWindowAgl
++  void SetAglActivateApp(const std::string& app) override;
++  void SetAglAppId(const std::string& title) override;
++  void SetAglReady() override;
++  void SetAglBackground() override;
++  void SetAglPanel(uint32_t edge) override;
++
++ private:
++  WaylandExtensionsAgl* agl_extensions_;
++};
++
++}  // namespace ui
++
++#endif  // UI_OZONE_PLATFORM_WAYLAND_EXTENSIONS_AGL_HOST_WAYLAND_WINDOW_AGL_H_
+diff --git a/ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc b/ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc
+index 1cef91bb39912..26ad374718005 100644
+--- a/ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc
++++ b/ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc
+@@ -89,8 +89,14 @@ gfx::SwapResult GLSurfaceWayland::SwapBuffers(PresentationCallback callback,
+     return scoped_swap_buffers.result();
+   }
+   window_->root_surface()->set_surface_buffer_scale(scale_factor_);
+-  return gl::NativeViewGLSurfaceEGL::SwapBuffers(std::move(callback),
+-                                                 std::move(data));
++  gfx::SwapResult result = gl::NativeViewGLSurfaceEGL::SwapBuffers(std::move(callback),
++                                                                   std::move(data));
++
++  if (window_) {
++    window_->OnSurfaceContentChanged();
++  }
++
++  return result;
+ }
+ gfx::SwapResult GLSurfaceWayland::PostSubBuffer(int x,
+diff --git a/ui/ozone/platform/wayland/host/gtk_primary_selection_device.cc b/ui/ozone/platform/wayland/host/gtk_primary_selection_device.cc
+index 43445ea2442b4..94f0739599142 100644
+--- a/ui/ozone/platform/wayland/host/gtk_primary_selection_device.cc
++++ b/ui/ozone/platform/wayland/host/gtk_primary_selection_device.cc
+@@ -31,7 +31,7 @@ void GtkPrimarySelectionDevice::SetSelectionSource(
+   auto* data_source = source ? source->data_source() : nullptr;
+   gtk_primary_selection_device_set_selection(data_device_.get(), data_source,
+                                              serial);
+-  connection()->Flush();
++  connection()->ScheduleFlush();
+ }
+ // static
+diff --git a/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.cc b/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.cc
+index 2c39409808128..1e07ae6009776 100644
+--- a/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.cc
++++ b/ui/ozone/platform/wayland/host/gtk_primary_selection_device_manager.cc
+@@ -66,7 +66,7 @@ GtkPrimarySelectionDevice* GtkPrimarySelectionDeviceManager::GetDevice() {
+         connection_,
+         gtk_primary_selection_device_manager_get_device(
+             device_manager_.get(), connection_->seat()->wl_object()));
+-    connection_->Flush();
++    connection_->ScheduleFlush();
+   }
+   DCHECK(device_);
+   return device_.get();
+@@ -77,7 +77,7 @@ GtkPrimarySelectionDeviceManager::CreateSource(
+     GtkPrimarySelectionSource::Delegate* delegate) {
+   auto* data_source =
+       gtk_primary_selection_device_manager_create_source(device_manager_.get());
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+   return std::make_unique<GtkPrimarySelectionSource>(data_source, connection_,
+                                                      delegate);
+ }
+diff --git a/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.cc b/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.cc
+index dee90b1aaaf72..caad70e0ab1cb 100644
+--- a/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.cc
++++ b/ui/ozone/platform/wayland/host/proxy/wayland_proxy_impl.cc
+@@ -75,7 +75,7 @@ void WaylandProxyImpl::DestroyShmForWlBuffer(wl_buffer* buffer) {
+ }
+ void WaylandProxyImpl::FlushForTesting() {
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+ }
+ ui::PlatformWindowType WaylandProxyImpl::GetWindowType(
+diff --git a/ui/ozone/platform/wayland/host/wayland_connection.cc b/ui/ozone/platform/wayland/host/wayland_connection.cc
+index 93427c52e1284..e2d45a6f5dc67 100644
+--- a/ui/ozone/platform/wayland/host/wayland_connection.cc
++++ b/ui/ozone/platform/wayland/host/wayland_connection.cc
+@@ -285,6 +285,20 @@ bool WaylandConnection::Initialize() {
+   return true;
+ }
++void WaylandConnection::ScheduleFlush() {
++  // When we are in tests, the message loop is set later when the
++  // initialization of the OzonePlatform complete. Thus, just
++  // flush directly. This doesn't happen in normal run.
++  if (!base::CurrentUIThread::IsSet()) {
++    Flush();
++  } else if (!scheduled_flush_) {
++    base::ThreadTaskRunnerHandle::Get()->PostTask(
++        FROM_HERE,
++        base::BindOnce(&WaylandConnection::Flush, base::Unretained(this)));
++    scheduled_flush_ = true;
++  }
++}
++
+ void WaylandConnection::RoundTripQueue() {
+   if (roundtrip_closure_for_testing_) {
+     roundtrip_closure_for_testing_.Run();
+@@ -354,6 +368,7 @@ void WaylandConnection::RegisterGlobalObjectFactory(
+ void WaylandConnection::Flush() {
+   wl_display_flush(display_.get());
++  scheduled_flush_ = false;
+ }
+ void WaylandConnection::UpdateInputDevices() {
+@@ -441,7 +456,7 @@ void WaylandConnection::Global(void* data,
+   auto factory_it = connection->global_object_factories_.find(interface);
+   if (connection->extensions_->Bind(registry, name, interface, version)) {
+-    DVLOG(1) << "Successfully bound to " << interface;
++    LOG(INFO) << "Successfully bound to " << interface;
+   } else if (factory_it != connection->global_object_factories_.end()) {
+     (*factory_it->second)(connection, registry, name, interface, version);
+   } else if (!connection->compositor_ &&
+@@ -609,7 +624,7 @@ void WaylandConnection::Global(void* data,
+   connection->available_globals_.emplace_back(interface, version);
+-  connection->Flush();
++  connection->ScheduleFlush();
+ }
+ base::TimeTicks WaylandConnection::ConvertPresentationTime(uint32_t tv_sec_hi,
+@@ -674,14 +689,14 @@ void WaylandConnection::PingV6(void* data,
+                                uint32_t serial) {
+   WaylandConnection* connection = static_cast<WaylandConnection*>(data);
+   zxdg_shell_v6_pong(shell_v6, serial);
+-  connection->Flush();
++  connection->ScheduleFlush();
+ }
+ // static
+ void WaylandConnection::Ping(void* data, xdg_wm_base* shell, uint32_t serial) {
+   WaylandConnection* connection = static_cast<WaylandConnection*>(data);
+   xdg_wm_base_pong(shell, serial);
+-  connection->Flush();
++  connection->ScheduleFlush();
+ }
+ // static
+diff --git a/ui/ozone/platform/wayland/host/wayland_connection.h b/ui/ozone/platform/wayland/host/wayland_connection.h
+index dfd1d060c73f2..d2d7a866d3af8 100644
+--- a/ui/ozone/platform/wayland/host/wayland_connection.h
++++ b/ui/ozone/platform/wayland/host/wayland_connection.h
+@@ -94,8 +94,8 @@ class WaylandConnection {
+   bool Initialize();
+-  // Immediately flushes the Wayland display.
+-  void Flush();
++  // Schedules a flush of the Wayland connection.
++  void ScheduleFlush();
+   // Calls wl_display_roundtrip_queue. Might be required during initialization
+   // of some objects that should block until they are initialized.
+@@ -340,6 +340,9 @@ class WaylandConnection {
+   friend class ZwpIdleInhibitManager;
+   friend class ZwpPrimarySelectionDeviceManager;
++  // Immediately flushes the Wayland display.
++  void Flush();
++
+   void RegisterGlobalObjectFactory(const char* interface_name,
+                                    wl::GlobalObjectFactory factory);
+@@ -467,6 +470,8 @@ class WaylandConnection {
+   // sizes.
+   bool surface_submission_in_pixel_coordinates_ = false;
++  bool scheduled_flush_ = false;
++
+   wl::SerialTracker serial_tracker_;
+   // Global Wayland interfaces available in the current session, with their
+diff --git a/ui/ozone/platform/wayland/host/wayland_cursor.cc b/ui/ozone/platform/wayland/host/wayland_cursor.cc
+index 891ca2e5e1f3c..48ac8b8925ddd 100644
+--- a/ui/ozone/platform/wayland/host/wayland_cursor.cc
++++ b/ui/ozone/platform/wayland/host/wayland_cursor.cc
+@@ -109,7 +109,7 @@ void WaylandCursor::HideCursor() {
+   wl_surface_attach(pointer_surface_.get(), nullptr, 0, 0);
+   wl_surface_commit(pointer_surface_.get());
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+   if (listener_)
+     listener_->OnCursorBufferAttached(nullptr);
+@@ -160,7 +160,7 @@ void WaylandCursor::AttachAndCommit(wl_buffer* buffer,
+   wl_surface_attach(pointer_surface_.get(), buffer, 0, 0);
+   wl_surface_commit(pointer_surface_.get());
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+ }
+ }  // namespace ui
+diff --git a/ui/ozone/platform/wayland/host/wayland_data_device.cc b/ui/ozone/platform/wayland/host/wayland_data_device.cc
+index a1d691b6315ac..ccc7bfb0305a8 100644
+--- a/ui/ozone/platform/wayland/host/wayland_data_device.cc
++++ b/ui/ozone/platform/wayland/host/wayland_data_device.cc
+@@ -46,7 +46,7 @@ void WaylandDataDevice::StartDrag(const WaylandDataSource& data_source,
+                             origin_window.root_surface()->surface(),
+                             icon_surface, serial);
+   drag_delegate_->DrawIcon();
+-  connection()->Flush();
++  connection()->ScheduleFlush();
+ }
+ void WaylandDataDevice::ResetDragDelegate() {
+@@ -78,7 +78,7 @@ void WaylandDataDevice::SetSelectionSource(WaylandDataSource* source,
+                                            uint32_t serial) {
+   auto* data_source = source ? source->data_source() : nullptr;
+   wl_data_device_set_selection(data_device_.get(), data_source, serial);
+-  connection()->Flush();
++  connection()->ScheduleFlush();
+ }
+ void WaylandDataDevice::ReadDragDataFromFD(base::ScopedFD fd,
+@@ -140,7 +140,7 @@ void WaylandDataDevice::OnEnter(void* data,
+       gfx::PointF(wl_fixed_to_double(x), wl_fixed_to_double(y)), window);
+   self->drag_delegate_->OnDragEnter(window, point, serial);
+-  self->connection()->Flush();
++  self->connection()->ScheduleFlush();
+ }
+ void WaylandDataDevice::OnMotion(void* data,
+@@ -161,7 +161,7 @@ void WaylandDataDevice::OnDrop(void* data, wl_data_device* data_device) {
+   auto* self = static_cast<WaylandDataDevice*>(data);
+   if (self->drag_delegate_) {
+     self->drag_delegate_->OnDragDrop();
+-    self->connection()->Flush();
++    self->connection()->ScheduleFlush();
+   }
+   // There are buggy Exo versions, which send 'drop' event (even for
+@@ -178,7 +178,7 @@ void WaylandDataDevice::OnLeave(void* data, wl_data_device* data_device) {
+   auto* self = static_cast<WaylandDataDevice*>(data);
+   if (self->drag_delegate_) {
+     self->drag_delegate_->OnDragLeave();
+-    self->connection()->Flush();
++    self->connection()->ScheduleFlush();
+   }
+   self->ResetDragDelegateIfNeeded();
+ }
+diff --git a/ui/ozone/platform/wayland/host/wayland_data_device_base.cc b/ui/ozone/platform/wayland/host/wayland_data_device_base.cc
+index 4287f72617708..d0c077c2e69ea 100644
+--- a/ui/ozone/platform/wayland/host/wayland_data_device_base.cc
++++ b/ui/ozone/platform/wayland/host/wayland_data_device_base.cc
+@@ -72,7 +72,7 @@ void WaylandDataDeviceBase::RegisterDeferredReadCallback() {
+   wl_callback_add_listener(deferred_read_callback_.get(), &kListener, this);
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+ }
+ void WaylandDataDeviceBase::RegisterDeferredReadClosure(
+diff --git a/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc b/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc
+index f2123ec8bac3f..11750a3f55da2 100644
+--- a/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc
++++ b/ui/ozone/platform/wayland/host/wayland_data_drag_controller.cc
+@@ -217,7 +217,7 @@ void WaylandDataDragController::OnDragSurfaceFrame(void* data,
+   DCHECK(self);
+   self->DrawIconInternal();
+   self->icon_frame_callback_.reset();
+-  self->connection_->Flush();
++  self->connection_->ScheduleFlush();
+ }
+ void WaylandDataDragController::DrawIconInternal() {
+diff --git a/ui/ozone/platform/wayland/host/wayland_data_source.cc b/ui/ozone/platform/wayland/host/wayland_data_source.cc
+index de1e110f73b11..e24f31b1a8f52 100644
+--- a/ui/ozone/platform/wayland/host/wayland_data_source.cc
++++ b/ui/ozone/platform/wayland/host/wayland_data_source.cc
+@@ -119,7 +119,7 @@ void DataSource<wl_data_source>::Offer(
+     const std::vector<std::string>& mime_types) {
+   for (auto& mime_type : mime_types)
+     wl_data_source_offer(data_source_.get(), mime_type.c_str());
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+ }
+ template <typename T>
+@@ -154,7 +154,7 @@ void DataSource<gtk_primary_selection_source>::Offer(
+     const std::vector<std::string>& mime_types) {
+   for (const auto& mime_type : mime_types)
+     gtk_primary_selection_source_offer(data_source_.get(), mime_type.c_str());
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+ }
+ template <>
+@@ -173,7 +173,7 @@ void DataSource<zwp_primary_selection_source_v1>::Offer(
+   for (const auto& mime_type : mime_types)
+     zwp_primary_selection_source_v1_offer(data_source_.get(),
+                                           mime_type.c_str());
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+ }
+ template class DataSource<gtk_primary_selection_source>;
+diff --git a/ui/ozone/platform/wayland/host/wayland_drm.cc b/ui/ozone/platform/wayland/host/wayland_drm.cc
+index 7edc0da798b9b..280350d9286c0 100644
+--- a/ui/ozone/platform/wayland/host/wayland_drm.cc
++++ b/ui/ozone/platform/wayland/host/wayland_drm.cc
+@@ -57,7 +57,7 @@ WaylandDrm::WaylandDrm(wl_drm* drm, WaylandConnection* connection)
+       &Capabilities,
+   };
+   wl_drm_add_listener(wl_drm_.get(), &kDrmListener, this);
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+   // A roundtrip after binding guarantees that the client has received all
+   // supported formats and capabilities of the device.
+@@ -91,7 +91,7 @@ void WaylandDrm::CreateBuffer(const base::ScopedFD& fd,
+   wl::Object<wl_buffer> buffer(wl_drm_create_prime_buffer(
+       wl_drm_.get(), fd.get(), size.width(), size.height(), format, offset[0],
+       stride[0], offset[1], stride[1], offset[2], stride[2]));
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+   std::move(callback).Run(std::move(buffer));
+ }
+@@ -145,7 +145,7 @@ void WaylandDrm::Authenticate(const char* drm_device_path) {
+   }
+   wl_drm_authenticate(wl_drm_.get(), magic);
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+   // Do the roundtrip to make sure the server processes this request and
+   // authenticates us.
+diff --git a/ui/ozone/platform/wayland/host/wayland_extensions.h b/ui/ozone/platform/wayland/host/wayland_extensions.h
+index 3bd2fd7a211ae..f6ed47507d217 100644
+--- a/ui/ozone/platform/wayland/host/wayland_extensions.h
++++ b/ui/ozone/platform/wayland/host/wayland_extensions.h
+@@ -25,7 +25,9 @@ namespace ui {
+ class ShellToplevelWrapper;
+ class ShellPopupWrapper;
++class PlatformWindowDelegate;
+ class WaylandConnection;
++class WaylandWindow;
+ // Wayland extensions abstract interface to support extending of the Wayland
+ // protocol. Inherit it to provide your own Wayland extensions implementation.
+@@ -45,6 +47,10 @@ class WaylandExtensions {
+   // Checks whether the extensions have bound shell object(s).
+   virtual bool HasShellObject() const = 0;
++
++  virtual std::unique_ptr<WaylandWindow> CreateWaylandWindow(
++      PlatformWindowDelegate* delegate,
++      WaylandConnection* connection) = 0;
+ };
+ // Creates Wayland extensions.
+diff --git a/ui/ozone/platform/wayland/host/wayland_keyboard.cc b/ui/ozone/platform/wayland/host/wayland_keyboard.cc
+index c6e64f1e55da3..473a702bf8987 100644
+--- a/ui/ozone/platform/wayland/host/wayland_keyboard.cc
++++ b/ui/ozone/platform/wayland/host/wayland_keyboard.cc
+@@ -54,7 +54,7 @@ class WaylandKeyboard::ZCRExtendedKeyboard {
+   void AckKey(uint32_t serial, bool handled) {
+     zcr_extended_keyboard_v1_ack_key(obj_.get(), serial, handled);
+-    keyboard_->connection_->Flush();
++    keyboard_->connection_->ScheduleFlush();
+   }
+   // Returns true if connected object will send zcr_extended_keyboard::peek_key.
+@@ -247,7 +247,7 @@ void WaylandKeyboard::FlushInput(base::OnceClosure closure) {
+   // get spurious repeats.
+   sync_callback_.reset(wl_display_sync(connection_->display_wrapper()));
+   wl_callback_add_listener(sync_callback_.get(), &callback_listener_, this);
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+ }
+ void WaylandKeyboard::DispatchKey(unsigned int key,
+diff --git a/ui/ozone/platform/wayland/host/wayland_popup.cc b/ui/ozone/platform/wayland/host/wayland_popup.cc
+index 84e429457462e..cb13557093dc2 100644
+--- a/ui/ozone/platform/wayland/host/wayland_popup.cc
++++ b/ui/ozone/platform/wayland/host/wayland_popup.cc
+@@ -124,7 +124,7 @@ void WaylandPopup::Show(bool inactive) {
+     return;
+   }
+-  connection()->Flush();
++  connection()->ScheduleFlush();
+   WaylandWindow::Show(inactive);
+ }
+@@ -147,7 +147,7 @@ void WaylandPopup::Hide() {
+     decorated_via_aura_popup_ = false;
+   }
+-  connection()->Flush();
++  connection()->ScheduleFlush();
+ }
+ bool WaylandPopup::IsVisible() const {
+diff --git a/ui/ozone/platform/wayland/host/wayland_shm.cc b/ui/ozone/platform/wayland/host/wayland_shm.cc
+index 80d27227b9ab3..2b6c4f31ca0d8 100644
+--- a/ui/ozone/platform/wayland/host/wayland_shm.cc
++++ b/ui/ozone/platform/wayland/host/wayland_shm.cc
+@@ -62,7 +62,7 @@ wl::Object<wl_buffer> WaylandShm::CreateBuffer(const base::ScopedFD& fd,
+       with_alpha_channel ? WL_SHM_FORMAT_ARGB8888 : WL_SHM_FORMAT_XRGB8888;
+   wl::Object<wl_buffer> shm_buffer(wl_shm_pool_create_buffer(
+       pool.get(), 0, size.width(), size.height(), size.width() * 4, format));
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+   return shm_buffer;
+ }
+diff --git a/ui/ozone/platform/wayland/host/wayland_surface.cc b/ui/ozone/platform/wayland/host/wayland_surface.cc
+index cd178f9aaee00..ffe5062402b33 100644
+--- a/ui/ozone/platform/wayland/host/wayland_surface.cc
++++ b/ui/ozone/platform/wayland/host/wayland_surface.cc
+@@ -267,7 +267,7 @@ void WaylandSurface::UpdateBufferDamageRegion(const gfx::Rect& damage_px) {
+ void WaylandSurface::Commit(bool flush) {
+   wl_surface_commit(surface_.get());
+   if (flush)
+-    connection_->Flush();
++    connection_->ScheduleFlush();
+ }
+ void WaylandSurface::set_surface_buffer_scale(float scale) {
+diff --git a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
+index e39daa898c9a5..68aebd357fdc2 100644
+--- a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
++++ b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
+@@ -131,7 +131,7 @@ void WaylandToplevelWindow::DispatchHostWindowDragMovement(
+   else
+     shell_toplevel_->SurfaceResize(connection(), hittest);
+-  connection()->Flush();
++  connection()->ScheduleFlush();
+ }
+ void WaylandToplevelWindow::Show(bool inactive) {
+@@ -166,7 +166,7 @@ void WaylandToplevelWindow::Hide() {
+     aura_surface_.reset();
+   }
+   shell_toplevel_.reset();
+-  connection()->Flush();
++  connection()->ScheduleFlush();
+ }
+ bool WaylandToplevelWindow::IsVisible() const {
+@@ -183,7 +183,7 @@ void WaylandToplevelWindow::SetTitle(const std::u16string& title) {
+   if (shell_toplevel_) {
+     shell_toplevel_->SetTitle(title);
+-    connection()->Flush();
++    connection()->ScheduleFlush();
+   }
+ }
+@@ -262,13 +262,13 @@ void WaylandToplevelWindow::Activate() {
+   // but nothing more happens (until the user moves the mouse over a Lacros
+   // window in which case events will start and the activation will come
+   // through).
+-  connection()->Flush();
++  connection()->ScheduleFlush();
+ }
+ void WaylandToplevelWindow::Deactivate() {
+   if (shell_toplevel_ && shell_toplevel_->SupportsActivation()) {
+     shell_toplevel_->Deactivate();
+-    connection()->Flush();
++    connection()->ScheduleFlush();
+   }
+ }
+@@ -877,7 +877,7 @@ void WaylandToplevelWindow::TriggerStateChanges() {
+   delegate()->OnWindowStateChanged(previous_state_, state_);
+-  connection()->Flush();
++  connection()->ScheduleFlush();
+ }
+ void WaylandToplevelWindow::SetWindowState(PlatformWindowState state) {
+@@ -908,7 +908,7 @@ void WaylandToplevelWindow::SetSizeConstraints() {
+   if (max_size_dip.has_value())
+     shell_toplevel_->SetMaxSize(max_size_dip->width(), max_size_dip->height());
+-  connection()->Flush();
++  connection()->ScheduleFlush();
+ }
+ void WaylandToplevelWindow::SetOrResetRestoredBounds() {
+diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc
+index f8b8c36a745e5..e415efde8ccd8 100644
+--- a/ui/ozone/platform/wayland/host/wayland_window.cc
++++ b/ui/ozone/platform/wayland/host/wayland_window.cc
+@@ -430,7 +430,7 @@ void WaylandWindow::SetDecorationInsets(const gfx::Insets* insets_px) {
+   else
+     frame_insets_px_ = absl::nullopt;
+   UpdateDecorations();
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+ }
+ void WaylandWindow::SetWindowIcons(const gfx::ImageSkia& window_icon,
+@@ -522,6 +522,10 @@ void WaylandWindow::HandleSurfaceConfigure(uint32_t serial) {
+       << "Only shell surfaces must receive HandleSurfaceConfigure calls.";
+ }
++void WaylandWindow::OnSurfaceContentChanged() {
++  connection_->ScheduleFlush();
++}
++
+ void WaylandWindow::HandleToplevelConfigure(int32_t widht,
+                                             int32_t height,
+                                             const WindowStates& window_states) {
+@@ -551,7 +555,7 @@ void WaylandWindow::UpdateVisualSize(const gfx::Size& size_px) {
+   if (apply_pending_state_on_update_visual_size_for_testing_) {
+     root_surface_->ApplyPendingState();
+-    connection_->Flush();
++    connection_->ScheduleFlush();
+   }
+ }
+@@ -661,7 +665,7 @@ bool WaylandWindow::Initialize(PlatformWindowInitProperties properties) {
+   std::vector<gfx::Rect> region{gfx::Rect{size_px_}};
+   root_surface_->set_opaque_region(&region);
+   root_surface_->ApplyPendingState();
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+   return true;
+ }
+@@ -957,7 +961,7 @@ void WaylandWindow::ProcessPendingBoundsDip(uint32_t serial) {
+     // window has been applied.
+     SetWindowGeometry(pending_bounds_dip_);
+     AckConfigure(serial);
+-    connection()->Flush();
++    connection()->ScheduleFlush();
+   } else if (!pending_configures_.empty() &&
+              pending_bounds_dip_.size() ==
+                  pending_configures_.back().bounds_dip.size()) {
+@@ -1051,7 +1055,7 @@ bool WaylandWindow::ProcessVisualSizeUpdate(const gfx::Size& size_px) {
+     auto serial = result->serial;
+     SetWindowGeometry(result->bounds_dip);
+     AckConfigure(serial);
+-    connection()->Flush();
++    connection()->ScheduleFlush();
+     pending_configures_.erase(pending_configures_.begin(), ++result);
+     return true;
+   }
+diff --git a/ui/ozone/platform/wayland/host/wayland_window.h b/ui/ozone/platform/wayland/host/wayland_window.h
+index f0f75d4481cd2..dae1ddcd2933f 100644
+--- a/ui/ozone/platform/wayland/host/wayland_window.h
++++ b/ui/ozone/platform/wayland/host/wayland_window.h
+@@ -218,6 +218,8 @@ class WaylandWindow : public PlatformWindow,
+   // currently bound to.
+   virtual void HandleSurfaceConfigure(uint32_t serial);
++  void OnSurfaceContentChanged();
++
+   struct WindowStates {
+     bool is_maximized = false;
+     bool is_fullscreen = false;
+diff --git a/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc b/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc
+index 6f45f47a71c25..a269ec9b368a4 100644
+--- a/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc
++++ b/ui/ozone/platform/wayland/host/wayland_window_drag_controller.cc
+@@ -84,7 +84,7 @@ class WaylandWindowDragController::ExtendedDragSource {
+     auto* surface = window ? window->root_surface()->surface() : nullptr;
+     zcr_extended_drag_source_v1_drag(source_.get(), surface, offset.x(),
+                                      offset.y());
+-    connection_.Flush();
++    connection_.ScheduleFlush();
+   }
+  private:
+diff --git a/ui/ozone/platform/wayland/host/wayland_window_factory.cc b/ui/ozone/platform/wayland/host/wayland_window_factory.cc
+index 4857125bb5f34..b2f73218681b9 100644
+--- a/ui/ozone/platform/wayland/host/wayland_window_factory.cc
++++ b/ui/ozone/platform/wayland/host/wayland_window_factory.cc
+@@ -13,6 +13,8 @@
+ #include "ui/ozone/platform/wayland/host/wayland_window.h"
+ #include "ui/platform_window/platform_window_init_properties.h"
++#include "ui/ozone/platform/wayland/host/wayland_extensions.h"
++
+ namespace ui {
+ namespace {
+@@ -41,6 +43,13 @@ std::unique_ptr<WaylandWindow> WaylandWindow::Create(
+       // toplevel window instead.
+       if (auto* parent =
+               GetParentWindow(connection, properties.parent_widget)) {
++
++        if (connection->extensions()) {
++          window = connection->extensions()->CreateWaylandWindow(delegate,
++                                                                 connection);
++          if (window)
++            break;
++        }
+         window = std::make_unique<WaylandPopup>(delegate, connection, parent);
+       } else {
+         DLOG(WARNING) << "Failed to determine for menu/popup window.";
+@@ -52,6 +61,12 @@ std::unique_ptr<WaylandWindow> WaylandWindow::Create(
+     case PlatformWindowType::kDrag:
+       // TODO(msisov): Figure out what kind of surface we need to create for
+       // bubble and drag windows.
++      if (connection->extensions()) {
++        window =
++            connection->extensions()->CreateWaylandWindow(delegate, connection);
++        if (window)
++          break;
++      }
+       window = std::make_unique<WaylandToplevelWindow>(delegate, connection);
+       break;
+     default:
+diff --git a/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc b/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc
+index 3db8cb5e5dba9..5d6293e016842 100644
+--- a/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc
++++ b/ui/ozone/platform/wayland/host/wayland_zwp_linux_dmabuf.cc
+@@ -104,7 +104,7 @@ void WaylandZwpLinuxDmabuf::CreateBuffer(const base::ScopedFD& fd,
+     // created buffer and notify the client about it via the |callback|.
+     pending_params_.emplace(std::move(params), std::move(callback));
+   }
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+ }
+ bool WaylandZwpLinuxDmabuf::CanCreateBufferImmed() const {
+@@ -150,7 +150,7 @@ void WaylandZwpLinuxDmabuf::NotifyRequestCreateBufferDone(
+   pending_params_.erase(it);
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+ }
+ // static
+diff --git a/ui/ozone/platform/wayland/host/xdg_foreign_wrapper.cc b/ui/ozone/platform/wayland/host/xdg_foreign_wrapper.cc
+index 8b8591fabe015..9b3c6e5136d5d 100644
+--- a/ui/ozone/platform/wayland/host/xdg_foreign_wrapper.cc
++++ b/ui/ozone/platform/wayland/host/xdg_foreign_wrapper.cc
+@@ -162,7 +162,7 @@ void XdgForeignWrapperImpl<zxdg_exporter_v1, zxdg_exported_v1>::
+   zxdg_exported_v1_add_listener(exported_surface.exported.get(),
+                                 &kExportedListener, this);
+   exported_surfaces_.emplace_back(std::move(exported_surface));
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+ }
+ template <>
+@@ -176,7 +176,7 @@ void XdgForeignWrapperImpl<zxdg_exporter_v2, zxdg_exported_v2>::
+   zxdg_exported_v2_add_listener(exported_surface.exported.get(),
+                                 &kExportedListener, this);
+   exported_surfaces_.emplace_back(std::move(exported_surface));
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+ }
+ // static
+diff --git a/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc b/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc
+index 23b7ad8fbf3cc..2e1f8fc129bf7 100644
+--- a/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc
++++ b/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.cc
+@@ -230,7 +230,7 @@ bool XDGPopupWrapperImpl::SetBounds(const gfx::Rect& new_bounds) {
+   xdg_popup_reposition(xdg_popup_.get(), positioner.get(),
+                        ++next_reposition_token_);
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+   return true;
+ }
+diff --git a/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc b/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc
+index 048071b4b7b76..692f562e203f0 100644
+--- a/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc
++++ b/ui/ozone/platform/wayland/host/xdg_surface_wrapper_impl.cc
+@@ -40,7 +40,7 @@ bool XDGSurfaceWrapperImpl::Initialize() {
+   }
+   xdg_surface_add_listener(xdg_surface_.get(), &xdg_surface_listener, this);
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+   return true;
+ }
+diff --git a/ui/ozone/platform/wayland/host/zwp_primary_selection_device.cc b/ui/ozone/platform/wayland/host/zwp_primary_selection_device.cc
+index d02c76db80aa2..9e7e0a916d66d 100644
+--- a/ui/ozone/platform/wayland/host/zwp_primary_selection_device.cc
++++ b/ui/ozone/platform/wayland/host/zwp_primary_selection_device.cc
+@@ -31,7 +31,7 @@ void ZwpPrimarySelectionDevice::SetSelectionSource(
+   auto* data_source = source ? source->data_source() : nullptr;
+   zwp_primary_selection_device_v1_set_selection(data_device_.get(), data_source,
+                                                 serial);
+-  connection()->Flush();
++  connection()->ScheduleFlush();
+ }
+ // static
+diff --git a/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.cc b/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.cc
+index 9d5d79635b66d..2ca82ce6031ba 100644
+--- a/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.cc
++++ b/ui/ozone/platform/wayland/host/zwp_primary_selection_device_manager.cc
+@@ -66,7 +66,7 @@ ZwpPrimarySelectionDevice* ZwpPrimarySelectionDeviceManager::GetDevice() {
+         connection_,
+         zwp_primary_selection_device_manager_v1_get_device(
+             device_manager_.get(), connection_->seat()->wl_object()));
+-    connection_->Flush();
++    connection_->ScheduleFlush();
+   }
+   DCHECK(device_);
+   return device_.get();
+@@ -77,7 +77,7 @@ ZwpPrimarySelectionDeviceManager::CreateSource(
+     ZwpPrimarySelectionSource::Delegate* delegate) {
+   auto* data_source = zwp_primary_selection_device_manager_v1_create_source(
+       device_manager_.get());
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+   return std::make_unique<ZwpPrimarySelectionSource>(data_source, connection_,
+                                                      delegate);
+ }
+diff --git a/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.cc b/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.cc
+index e900f9d37e8ad..5c4c538800f65 100644
+--- a/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.cc
++++ b/ui/ozone/platform/wayland/host/zxdg_surface_v6_wrapper_impl.cc
+@@ -43,7 +43,7 @@ bool ZXDGSurfaceV6WrapperImpl::Initialize() {
+   zxdg_surface_v6_add_listener(zxdg_surface_v6_.get(),
+                                &zxdg_surface_v6_listener, this);
+-  connection_->Flush();
++  connection_->ScheduleFlush();
+   return true;
+ }
+diff --git a/ui/platform_window/agl/platform_window_agl.h b/ui/platform_window/agl/platform_window_agl.h
+new file mode 100644
+index 0000000000000..4bc915d663e72
+--- /dev/null
++++ b/ui/platform_window/agl/platform_window_agl.h
+@@ -0,0 +1,36 @@
++// Copyright 2021 LG Electronics, Inc.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++//
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++// Unless required by applicable law or agreed to in writing, software
++// distributed under the License is distributed on an "AS IS" BASIS,
++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
++// See the License for the specific language governing permissions and
++// limitations under the License.
++//
++// SPDX-License-Identifier: Apache-2.0
++
++#ifndef UI_PLATFORM_WINDOW_AGL_PLATFORM_WINDOW_AGL_H_
++#define UI_PLATFORM_WINDOW_AGL_PLATFORM_WINDOW_AGL_H_
++
++#include <string>
++
++namespace ui {
++
++// AGL additions for platform window.
++class PlatformWindowAgl {
++ public:
++  virtual void SetAglActivateApp(const std::string& app) {}
++  virtual void SetAglAppId(const std::string& title) {}
++  virtual void SetAglReady() {}
++  virtual void SetAglBackground() {}
++  virtual void SetAglPanel(uint32_t edge) {}
++};
++
++}  // namespace ui
++
++#endif  // UI_PLATFORM_WINDOW_AGL_PLATFORM_WINDOW_AGL_H_
+diff --git a/ui/platform_window/platform_window.h b/ui/platform_window/platform_window.h
+index a7bd3ef17a728..80f67671b88cf 100644
+--- a/ui/platform_window/platform_window.h
++++ b/ui/platform_window/platform_window.h
+@@ -9,6 +9,7 @@
+ #include <string>
+ #include <vector>
++#include "agl/platform_window_agl.h"
+ #include "base/component_export.h"
+ #include "ui/base/class_property.h"
+ #include "ui/base/ui_base_types.h"
+@@ -32,7 +33,8 @@ class PlatformCursor;
+ // Generic PlatformWindow interface.
+ class COMPONENT_EXPORT(PLATFORM_WINDOW) PlatformWindow
+-    : public PropertyHandler {
++    : public PropertyHandler,
++      public PlatformWindowAgl {
+  public:
+   PlatformWindow();
+   ~PlatformWindow() override;
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/chromium/0007-Only-bind-to-agl_shell-if-it-s-the-browser-process.patch b/recipes-wam/cef/files/chromium/0007-Only-bind-to-agl_shell-if-it-s-the-browser-process.patch
new file mode 100644 (file)
index 0000000..8961b46
--- /dev/null
@@ -0,0 +1,39 @@
+From 1b60d7d98be14175b5175ee6ba4c19da03d8188e Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Sat, 27 May 2023 15:55:17 +0200
+Subject: [PATCH 7/9] Only bind to agl_shell if it's the browser process
+
+---
+ .../extensions/agl/host/wayland_extensions_agl_impl.cc   | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
+index 87376cbb8a9d3..075b3010ea8a1 100644
+--- a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
++++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
+@@ -20,6 +20,7 @@
+ #include "base/command_line.h"
+ #include "base/logging.h"
++#include "content/public/common/content_switches.h"
+ #include "ui/base/ui_base_switches.h"
+ #include "ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h"
+ #include "ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h"
+@@ -45,8 +46,12 @@ bool WaylandExtensionsAglImpl::Bind(wl_registry* registry,
+                                     uint32_t name,
+                                     const char* interface,
+                                     uint32_t version) {
+-  bool should_use_agl_shell = base::CommandLine::ForCurrentProcess()->HasSwitch(
+-      switches::kAglShellAppId);
++  bool has_agl_shell_switch = base::CommandLine::ForCurrentProcess()->HasSwitch(
++          switches::kAglShellAppId);
++  bool is_browser_process = !base::CommandLine::ForCurrentProcess()->HasSwitch(
++          switches::kProcessType);
++  bool should_use_agl_shell = has_agl_shell_switch && is_browser_process;
++
+   bool can_bind = wl::CanBind(interface, version, kMinAglShellExtensionVersion,
+                               kMaxAglShellExtensionVersion);
+   bool is_agl_shell_interface = (strcmp(interface, "agl_shell") == 0);
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/chromium/0008-Add-a-method-to-check-if-the-agl-window-is-configure.patch b/recipes-wam/cef/files/chromium/0008-Add-a-method-to-check-if-the-agl-window-is-configure.patch
new file mode 100644 (file)
index 0000000..bae799d
--- /dev/null
@@ -0,0 +1,64 @@
+From d76f1575fd5abd31d488f7456700af0ead9712f0 Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Fri, 30 Jun 2023 10:25:10 +0200
+Subject: [PATCH 8/9] Add a method to check if the agl window is configured
+
+---
+ ui/aura/agl/window_tree_host_agl.h           | 1 +
+ ui/aura/agl/window_tree_host_platform_agl.cc | 4 ++++
+ ui/aura/agl/window_tree_host_platform_agl.h  | 1 +
+ ui/platform_window/agl/platform_window_agl.h | 1 +
+ 4 files changed, 7 insertions(+)
+
+diff --git a/ui/aura/agl/window_tree_host_agl.h b/ui/aura/agl/window_tree_host_agl.h
+index 858a078d939d0..b9aa451c8332e 100644
+--- a/ui/aura/agl/window_tree_host_agl.h
++++ b/ui/aura/agl/window_tree_host_agl.h
+@@ -35,6 +35,7 @@ class AURA_EXPORT WindowTreeHostAgl {
+   virtual void SetAglReady() {}
+   virtual void SetAglBackground() {}
+   virtual void SetAglPanel(uint32_t edge) {}
++  virtual bool IsSurfaceConfigured() const { return false; }
+ };
+ }  // namespace aura
+diff --git a/ui/aura/agl/window_tree_host_platform_agl.cc b/ui/aura/agl/window_tree_host_platform_agl.cc
+index e34595fe0ed9c..67190e1da6973 100644
+--- a/ui/aura/agl/window_tree_host_platform_agl.cc
++++ b/ui/aura/agl/window_tree_host_platform_agl.cc
+@@ -47,4 +47,8 @@ void WindowTreeHostPlatformAgl::SetAglPanel(uint32_t edge) {
+   window_tree_host_platform_->platform_window()->SetAglPanel(edge);
+ }
++bool WindowTreeHostPlatformAgl::IsSurfaceConfigured() const {
++  return window_tree_host_platform_->platform_window()->IsSurfaceConfigured();
++}
++
+ }  // namespace aura
+diff --git a/ui/aura/agl/window_tree_host_platform_agl.h b/ui/aura/agl/window_tree_host_platform_agl.h
+index 181eefae346f7..e5a29fa1bfca3 100644
+--- a/ui/aura/agl/window_tree_host_platform_agl.h
++++ b/ui/aura/agl/window_tree_host_platform_agl.h
+@@ -41,6 +41,7 @@ class AURA_EXPORT WindowTreeHostPlatformAgl : public aura::WindowTreeHost {
+   void SetAglReady() override;
+   void SetAglBackground() override;
+   void SetAglPanel(uint32_t edge) override;
++  bool IsSurfaceConfigured() const override;
+  private:
+   aura::WindowTreeHostPlatform* window_tree_host_platform_;
+diff --git a/ui/platform_window/agl/platform_window_agl.h b/ui/platform_window/agl/platform_window_agl.h
+index 4bc915d663e72..cab1f42272772 100644
+--- a/ui/platform_window/agl/platform_window_agl.h
++++ b/ui/platform_window/agl/platform_window_agl.h
+@@ -29,6 +29,7 @@ class PlatformWindowAgl {
+   virtual void SetAglReady() {}
+   virtual void SetAglBackground() {}
+   virtual void SetAglPanel(uint32_t edge) {}
++  virtual bool IsSurfaceConfigured() { return false; }
+ };
+ }  // namespace ui
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/files/chromium/0009-Start-using-agl-shell-version-4.patch b/recipes-wam/cef/files/chromium/0009-Start-using-agl-shell-version-4.patch
new file mode 100644 (file)
index 0000000..1cf9143
--- /dev/null
@@ -0,0 +1,347 @@
+From 87e8811a2fc95b57f958e2bdfe5f3e434ecbff1e Mon Sep 17 00:00:00 2001
+From: Roger Zanoni <rzanoni@igalia.com>
+Date: Sun, 2 Jul 2023 11:11:07 +0200
+Subject: [PATCH 9/9] Start using agl-shell version 4
+
+---
+ ui/aura/agl/window_tree_host_agl.h            |   1 +
+ ui/aura/agl/window_tree_host_platform_agl.cc  |   4 +
+ ui/aura/agl/window_tree_host_platform_agl.h   |   1 +
+ .../extensions/agl/host/agl_shell_wrapper.cc  |   9 +
+ .../extensions/agl/host/agl_shell_wrapper.h   |   1 +
+ .../agl/host/wayland_extensions_agl_impl.cc   |   2 +-
+ .../extensions/agl/host/wayland_window_agl.cc |  10 +
+ .../extensions/agl/host/wayland_window_agl.h  |   1 +
+ .../extensions/agl/protocol/agl-shell.xml     | 185 +++++++++++++++++-
+ ui/platform_window/agl/platform_window_agl.h  |   1 +
+ 10 files changed, 213 insertions(+), 2 deletions(-)
+
+diff --git a/ui/aura/agl/window_tree_host_agl.h b/ui/aura/agl/window_tree_host_agl.h
+index b9aa451c8332e..c5213f75e623e 100644
+--- a/ui/aura/agl/window_tree_host_agl.h
++++ b/ui/aura/agl/window_tree_host_agl.h
+@@ -36,6 +36,7 @@ class AURA_EXPORT WindowTreeHostAgl {
+   virtual void SetAglBackground() {}
+   virtual void SetAglPanel(uint32_t edge) {}
+   virtual bool IsSurfaceConfigured() const { return false; }
++  virtual void SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) {}
+ };
+ }  // namespace aura
+diff --git a/ui/aura/agl/window_tree_host_platform_agl.cc b/ui/aura/agl/window_tree_host_platform_agl.cc
+index 67190e1da6973..b9bae3f3b9bdc 100644
+--- a/ui/aura/agl/window_tree_host_platform_agl.cc
++++ b/ui/aura/agl/window_tree_host_platform_agl.cc
+@@ -51,4 +51,8 @@ bool WindowTreeHostPlatformAgl::IsSurfaceConfigured() const {
+   return window_tree_host_platform_->platform_window()->IsSurfaceConfigured();
+ }
++void WindowTreeHostPlatformAgl::SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) {
++  window_tree_host_platform_->platform_window()->SetupActivationArea(x, y, width, height);
++}
++
+ }  // namespace aura
+diff --git a/ui/aura/agl/window_tree_host_platform_agl.h b/ui/aura/agl/window_tree_host_platform_agl.h
+index e5a29fa1bfca3..30e160736e327 100644
+--- a/ui/aura/agl/window_tree_host_platform_agl.h
++++ b/ui/aura/agl/window_tree_host_platform_agl.h
+@@ -42,6 +42,7 @@ class AURA_EXPORT WindowTreeHostPlatformAgl : public aura::WindowTreeHost {
+   void SetAglBackground() override;
+   void SetAglPanel(uint32_t edge) override;
+   bool IsSurfaceConfigured() const override;
++  void SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) override;
+  private:
+   aura::WindowTreeHostPlatform* window_tree_host_platform_;
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.cc b/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.cc
+index c74fa5d9cd221..0d5d79c4738df 100644
+--- a/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.cc
++++ b/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.cc
+@@ -110,4 +110,13 @@ bool AglShellWrapper::WaitUntilBoundOk() {
+   return bound_ok_;
+ }
++void AglShellWrapper::SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) {
++#ifdef AGL_SHELL_SET_ACTIVATE_REGION_SINCE_VERSION
++  wl_output* output =
++    connection_->wayland_output_manager()->GetPrimaryOutput()->get_output();
++  agl_shell_set_activate_region(agl_shell_.get(), output, x, y,
++                                width, height);
++#endif
++}
++
+ }  // namespace ui
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h b/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h
+index 2ab765883057e..1c2074e1b4306 100644
+--- a/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h
++++ b/ui/ozone/platform/wayland/extensions/agl/host/agl_shell_wrapper.h
+@@ -39,6 +39,7 @@ class AglShellWrapper {
+   void SetAglPanel(WaylandWindow* window, uint32_t edge);
+   void SetAglBackground(WaylandWindow* window);
+   void SetAglReady();
++  void SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height);
+   bool WaitUntilBoundOk();
+   static void AglShellBoundOk(void* data, struct agl_shell*);
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
+index 075b3010ea8a1..8f9d938cdd1f6 100644
+--- a/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
++++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_extensions_agl_impl.cc
+@@ -32,7 +32,7 @@ namespace ui {
+ namespace {
+ constexpr uint32_t kMinAglShellExtensionVersion = 1;
+-constexpr uint32_t kMaxAglShellExtensionVersion = 3;
++constexpr uint32_t kMaxAglShellExtensionVersion = 4;
+ }  // namespace
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.cc b/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.cc
+index 97b21ae537658..f92406d455de1 100644
+--- a/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.cc
++++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.cc
+@@ -83,4 +83,14 @@ void WaylandWindowAgl::SetAglPanel(uint32_t edge) {
+   connection()->ScheduleFlush();
+ }
++void WaylandWindowAgl::SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) {
++  if (!agl_extensions_->GetAglShell()) {
++    LOG(ERROR) << "Agl shell wrapper is not created";
++    return;
++  }
++
++  agl_extensions_->GetAglShell()->SetupActivationArea(x, y, width, height);
++  connection()->ScheduleFlush();
++}
++
+ }  // namespace ui
+diff --git a/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h b/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h
+index b2a922604c001..d21d2d9387215 100644
+--- a/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h
++++ b/ui/ozone/platform/wayland/extensions/agl/host/wayland_window_agl.h
+@@ -39,6 +39,7 @@ class WaylandWindowAgl : public WaylandToplevelWindow {
+   void SetAglReady() override;
+   void SetAglBackground() override;
+   void SetAglPanel(uint32_t edge) override;
++  void SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) override;
+  private:
+   WaylandExtensionsAgl* agl_extensions_;
+diff --git a/ui/ozone/platform/wayland/extensions/agl/protocol/agl-shell.xml b/ui/ozone/platform/wayland/extensions/agl/protocol/agl-shell.xml
+index ad5553d61f189..e010a80808c69 100644
+--- a/ui/ozone/platform/wayland/extensions/agl/protocol/agl-shell.xml
++++ b/ui/ozone/platform/wayland/extensions/agl/protocol/agl-shell.xml
+@@ -22,7 +22,7 @@
+     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+     DEALINGS IN THE SOFTWARE.
+   </copyright>
+-  <interface name="agl_shell" version="3">
++  <interface name="agl_shell" version="8">
+     <description summary="user interface for Automotive Grade Linux platform">
+       Starting with version 2 of the protocol, the client is required to wait
+       for the 'bound_ok' or 'bound_fail' events in order to proceed further.
+@@ -174,6 +174,189 @@
+       <arg name="state" type="uint" enum="app_state"/>
+     </event>
++    <request name="set_activate_region" since="4">
++      <description summary="sets a specific region to activate">
++      A hint for the compositor to use a custom area, rather than
++      inferring the activation area. If any panels are used
++      the compositor computes the activation area by subtracting the
++      panels geometry area. If no panels are used then the entire output
++      is being used. This request changes that as to hint the compositor
++      to use the supplied rectangle and ignore any potential panels
++      that might been set-up previously.
++      In order for this request to take effect it will need to happen
++      before the 'ready' request in order for the compositor to make use of it.
++      Note that any 'set_panel' request be will not be honored, if this request
++      has been called.
++
++      The x and y coordinates use the top-left corner as the origin. The
++      rectangle area shouldn't exceed the output area, while an area smaller
++      than the output, would basically result in showing up the background
++      surface.
++      </description>
++      <arg name="output" type="object" interface="wl_output"/>
++      <arg name="x" type="int" summary="x position of rectangle"/>
++      <arg name="y" type="int" summary="y position of rectangle"/>
++      <arg name="width" type="int" summary="width of rectangle"/>
++      <arg name="height" type="int" summary="height of rectangle"/>
++    </request>
++
++    <request name="deactivate_app" since="5">
++      <description summary="de-activate/hide window identified by app_id">
++        Ask the compositor to hide the toplevel window for window
++        management purposes. Depending on the window role, this request
++        will either display the previously active window (or the background
++        in case there's no previously active surface) or temporarily (or
++        until a 'activate_app' is called upon) hide the surface.
++
++        All the surfaces are identifiable by using the app_id, and no actions
++        are taken in case the app_id is not/was not present.
++
++        See xdg_toplevel.set_app_id from the xdg-shell protocol for a
++        description of app_id.
++      </description>
++      <arg name="app_id" type="string"/>
++    </request>
++
++    <request name="set_app_float" since="6">
++      <description summary="set the window identified by app_id as float">
++        Makes the application identified by app_id as floating. If the
++        application's window is already mapped, in a maximized, normal state,
++        it would transition to the float state.
++
++        For applications that want to modify their own state, this request
++        must be done before the initial surface commit in order to take effect.
++
++        If the application is already in floating state, this request wouldn't
++        do anything.
++
++        There's no persistence of this request, once the application terminated
++        you'll to issue this request again for that particular app_id.
++
++        The x, and y values would be initial position of the window where the
++        window surface will be placed.
++
++        See xdg_toplevel.set_app_id from the xdg-shell protocol for a
++        description of app_id.
++      </description>
++      <arg name="app_id" type="string"/>
++      <arg name="x" type="int" summary="x position"/>
++      <arg name="y" type="int" summary="y position"/>
++    </request>
++
++    <request name="set_app_normal" since="6">
++      <description summary="set the window identified by app_id as normally started">
++      Returns the application identified by app_id as it was in the normal state.
++      This is useful to come back from other states to the maximized state, the
++      normal state applications are started.
++      </description>
++      <arg name="app_id" type="string"/>
++    </request>
++
++    <request name="set_app_fullscreen" since="7">
++      <description summary="">
++        Makes the application identified by app_id as fullscreen. If the
++        application's window is already mapped, in a maximized, normal state,
++        it would transition to the fullscreen state.
++
++        For applications that want to modify their own state, this request
++        must be done before the initial surface commit in order to take effect.
++
++        If the application is already in fullscreen state, this request wouldn't
++        do anything.
++
++        There's no persistence of this request, once the application terminated
++        you'll to issue this request again for that particular app_id.
++
++        See xdg_toplevel.set_app_id from the xdg-shell protocol for a
++        description of app_id.
++      </description>
++      <arg name="app_id" type="string"/>
++    </request>
++
++    <request name="set_app_output" since="8">
++      <description summary="Assign an application to a particular output">
++        This would allow the compositor to place an application on a particular
++        output, if that output is indeed available. This can happen before
++        application is started which would make the application start on that
++        particular output. If the application is already started it would
++        move the application to that output.
++
++        There's no persistence of this request, once the application terminated
++        you'll need to issue this request again for that particular app_id.
++
++        See xdg_toplevel.set_app_id from the xdg-shell protocol for a
++        description of app_id.
++      </description>
++      <arg name="app_id" type="string"/>
++      <arg name="output" type="object" interface="wl_output"/>
++    </request>
++
++    <event name="app_on_output" since="8">
++      <description summary="Event sent as a reponse to set_app_output">
++        Clients can use this event to be notified when an application
++        wants to be displayed on a certain output. This event is sent in
++        response to the set_app_output request.
++
++        See xdg_toplevel.set_app_id from the xdg-shell protocol for a
++        description of app_id.
++      </description>
++      <arg name="app_id" type="string"/>
++      <arg name="output_name" type="string"/>
++    </event>
++  </interface>
++
++  <interface name="agl_shell_ext" version="1">
++    <description summary="extended user interface for Automotive Grade Linux platform">
++      This interface allows another client bind to the agl_shell interface,
++      while there's another shell client already present.
++
++      The client should first bind to this interface and then inform the
++      compositor with the 'doas_shell_client' request and it wants to bind to
++      the agl_shell interface. The client is still expected, if using a new
++      version of the agl_shell interface, to wait for the 'bound_ok' and
++      'bound_fail' events before issueing any other requests/events.
++
++      Note that this interface has its limitations, and the compositor would
++      still refuse the act for 'set_panel' or 'set_background' requests
++      of the agl_shell interface if there's already a client that used them.
++
++      Any other requests or events should be delievered and handled as it would
++      a client bound to the agl_shell interface.
++    </description>
++
++    <enum name="doas_shell_client_status">
++      <entry name="success" value="0"/>
++      <entry name="failed" value="1"/>
++    </enum>
++
++    <request name="destroy" type="destructor">
++      <description summary="destroys the factory object">
++        Call the destructor once you're ready with agl_shell_ext interface.
++        This would reset the state and would make any requests made
++        on the agl_shell interface be terminated. The client would need 
++        to bind again the agl_shell_ext and issue a 'doas_shell_client'
++        request.
++      </description>
++    </request>
++
++    <request name="doas_shell_client">
++      <description summary="Informs the compositor it wants to bind to the
++      agl_shell interface">
++        Prior to binding to agl_shell interface, this request would inform
++        the compositor that it wants to gain access the agl_shell interface.
++        The client is expected to wait for 'doas_shell_client_done' event and 
++        check for a successful status before going further with binding to
++        the agl_shell interface.
++      </description>
++    </request>
++
++    <event name="doas_done">
++      <description summary="event sent as a reply to doas_shell_client">
++        The client should check the status event to verify that the
++        compositor was able to handle the request.
++      </description>
++      <arg name="status" type="uint" enum="doas_shell_client_status"/>
++    </event>
+   </interface>
+ </protocol>
+diff --git a/ui/platform_window/agl/platform_window_agl.h b/ui/platform_window/agl/platform_window_agl.h
+index cab1f42272772..b1a6150fff950 100644
+--- a/ui/platform_window/agl/platform_window_agl.h
++++ b/ui/platform_window/agl/platform_window_agl.h
+@@ -30,6 +30,7 @@ class PlatformWindowAgl {
+   virtual void SetAglBackground() {}
+   virtual void SetAglPanel(uint32_t edge) {}
+   virtual bool IsSurfaceConfigured() { return false; }
++  virtual void SetupActivationArea(uint32_t x, uint32_t y, uint32_t width, uint32_t height) {}
+ };
+ }  // namespace ui
+-- 
+2.39.2
+
diff --git a/recipes-wam/cef/gn-utils.inc b/recipes-wam/cef/gn-utils.inc
new file mode 100644 (file)
index 0000000..156b56d
--- /dev/null
@@ -0,0 +1,32 @@
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+def gn_arch_name(yocto_arch):
+    """Translates between Yocto's architecture values and the corresponding
+    ones used by GN."""
+    translation_table = {
+        'aarch64': 'arm64',
+        'arm': 'arm',
+        'i586': 'x86',
+        'i686': 'x86',
+        'x86_64': 'x64',
+    }
+    try:
+        return translation_table[yocto_arch]
+    except KeyError:
+        bb.fatal('"%s" is not a supported architecture.' % yocto_arch)