diff --git a/.cursorignore b/.cursorignore
index 17d7690..58e664d 100644
--- a/.cursorignore
+++ b/.cursorignore
@@ -1,6 +1,7 @@
 # TODO(crbug.com/423945285): figure out less restricted blockage for
 # Chromium third_party/
 third_party/
+!third_party/blink
 
 # No AI features or AI indexing is needed for out/ dir
 out/
diff --git a/AUTHORS b/AUTHORS
index 148d35c1..9ef5696 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -223,6 +223,7 @@
 Brian Merrell, Novell Inc. <bgmerrell@gmail.com>
 Brian Salomon <briansalomon@gmail.com>
 Brian Yip <itsbriany@gmail.com>
+Brijesh Giri <brijeshvgiri@gmail.com>
 Brook Hong <hzgmaxwell@gmail.com>
 Bruce Dai <feng.dai@intel.com>
 Bruno Calvignac <bruno@flock.com>
diff --git a/DEPS b/DEPS
index 59e16e66..0b6a11bc 100644
--- a/DEPS
+++ b/DEPS
@@ -290,11 +290,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': '26795f31e4ce2586e12dfb1897cbd87573277cff',
+  'src_internal_revision': 'e6bcedcaefb97479ce80b4611257b3149cae2409',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '23eb7ba719d9eaaec63da6d9e56b6fb28eb25b3e',
+  'skia_revision': 'ee69d5d1cf0ef8f8335a57132ea7ae30e9b6f888',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -302,11 +302,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '2fd033d0976456dc5baa4f7612192a7c3c8e2ae2',
+  'angle_revision': '0a47f441faebb6286116e0503c4152719e9047ee',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '0ce9bc68d3fc995f76dcab4771c26471100ce759',
+  'swiftshader_revision': 'ed01d9931de34d3a6fb4d615050db5080d9cea16',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -314,7 +314,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
-  'boringssl_revision': 'f51d8b099832f805022a6ff2e9466dbcacdfb0ab',
+  'boringssl_revision': '6f1a411710141bb3c0c3755bf3da38d99a3a9bfe',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
@@ -358,11 +358,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'a03b70978cc52840b549947f0fb165f03764c700',
+  'catapult_revision': '43a00ab5a2b6f86c9eaeb00fef1cea6ba0e7db20',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
-  'crossbench_revision': 'c7a48f4524307e279ed2b82b97aa1a43cfa600f6',
+  'crossbench_revision': '43e6d12f78b1e9132b9a153dc791488eb78c3fe8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -402,7 +402,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '40b32e94113dfd8da971f93adf46eafa7025b36d',
+  'dawn_revision': '119b9226d771fcb04a4154f7e686bd284b79cd94',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -502,7 +502,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling webpagereplay
   # and whatever else without interference from each other.
-  'webpagereplay_revision': 'e463cb47fd355a21463d0f567ee78c0316e198d6',
+  'webpagereplay_revision': 'f3397454e39a7c0b35af192e6d8a1896af7bd9ec',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling llvm-libc
   # and whatever else without interference from each other.
@@ -1563,7 +1563,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '42ba606e843b4a89eb3bfa3954ddd285fb1cf324',
+    'fe18a946fd0b94293fc90107fbf7ba606bff27fb',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1572,7 +1572,7 @@
   },
 
   'src/ios/third_party/earl_grey2/src': {
-      'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '26e72194d8863202aeaad2f124f7964ae3f3934f',
+      'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '3894e319725773683ded248ee6dedea5b29a3189',
       'condition': 'checkout_ios',
   },
 
@@ -2023,7 +2023,7 @@
   # Tools used when building Chrome for Chrome OS. This affects both the Simple
   # Chrome workflow, as well as the chromeos-chrome ebuild.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'f561aa984b9604d341687dba237ab5c11af171e4',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '341c29acc0a4e66ced602961622ad06a434de62d',
       'condition': 'checkout_chromeos',
   },
 
@@ -2053,7 +2053,7 @@
 
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '8f878438075a8d5d76f57bd10ab866d58d706319',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'ea7a0baff0d8554cf6d38f525b4e7882c2b4ec18',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -2453,7 +2453,7 @@
     Var('chromium_git') + '/webm/libwebp.git' + '@' +  '2af6c034ac871c967e04c8c9f8bf2dbc2e271b18',
 
   'src/third_party/libyuv':
-    Var('chromium_git') + '/libyuv/libyuv.git' + '@' + '61bdaee13a701d2b52c6dc943ccc5c888077a591',
+    Var('chromium_git') + '/libyuv/libyuv.git' + '@' + '88798bcd636a93e92d69242da914deb4cec1dfb6',
 
   'src/third_party/lighttpd': {
       'url': Var('chromium_git') + '/chromium/deps/lighttpd.git' + '@' + Var('lighttpd_revision'),
@@ -2593,7 +2593,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '0028ac091740d391b1dfc6f7b0171a6c25ed5bbb',
+    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '18d4fdc15d027a989db705592585b924f93f1d42',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -2912,7 +2912,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@02a9ce0423c41768fdb0236f9782209b55edb358',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@a177e95454b54fe7b81c0e2d1cc9267ba466f6ee',
   'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@21b4e37133868b3a50ef15fc027ecd6d3a52c875',
   'src/third_party/spirv-cross/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3',
   'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@2a611a970fdbc41ac2e3e328802aed9985352dca',
@@ -2921,7 +2921,7 @@
   'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@c8a2c8c9164a58ce71c1c77104e28e8de724539e',
   'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@e3fc64396755191b3c51e5c57d0454872e7fa487',
   'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@72665ee1e50db3d949080df8d727dffa8067f5f8',
-  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@69e6081acb3d2f55cb98ae1d5faa17b6db2044c7',
+  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@64bc432edfcc8624f81dd969759f0b5b7eb63f71',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '56300b29fbfcc693ee6609ddad3fdd5b7a449a21',
@@ -3012,7 +3012,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/linux-amd64',
-          'version': 'I1LygzXVm-v4LePMcFJ9j0k1AZoLq1UFO5FvEue2TbsC',
+          'version': 'DuaWI_iN1aKYqw68BNRC2gsLbwarydFdh-0pBp8HS6UC',
         },
       ],
       'dep_type': 'cipd',
@@ -3022,7 +3022,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/windows-amd64',
-          'version': '72BoyHuvkKlIhZ3QJunOfOnQ4xpyI3ImPWyF8OcXrHMC',
+          'version': '2KZkcCD9mC9MsaKQTOIECvyDm_gtn0YaOjpfdhXw9wcC',
         },
       ],
       'dep_type': 'cipd',
@@ -3033,7 +3033,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-amd64',
-          'version': 'uI8NbGw_UiTJ3W2CTVNlIycIt9w6x1ozArj3Y3F4UtkC',
+          'version': 'kfSAMIADvMhxx5OoeY0EajZqqvBTlkVsrDEiWApdnsMC',
         },
       ],
       'dep_type': 'cipd',
@@ -3044,7 +3044,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-arm64',
-          'version': 'QSSJvE4WdrL_WsuphR6xIEvHYbO5MAX3yzL1OZUDCMEC',
+          'version': 'TMdajugFqfAjHrtZbG5sFxtFgsHk5GeyYgO7Exhlx20C',
         },
       ],
       'dep_type': 'cipd',
@@ -4496,7 +4496,7 @@
 
   'src/chrome/browser/glic/resources/internal': {
       'url': Var('chrome_git') + '/chrome/browser/glic/resources/internal.git' + '@' +
-        '17c4e2565b19e4156b304349df23964da915e3ed',
+        'cb320ba11dc958d243b0fd4dc1c93021d078ea5b',
       'condition': 'checkout_src_internal',
   },
 
@@ -4686,7 +4686,7 @@
 
   'src/components/optimization_guide/internal': {
       'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' +
-        '4bf147bd5fd4f2db7396c616574510501af16f4d',
+        '5130ac88727e4be82deaf63548d1538304dc6e23',
       'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 23c6edbe..c4b81d4 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -732,16 +732,14 @@
     # External code should depend on "common_java" instead.
     visibility = [ ":*" ]
     sources = [ "common/aw_switches.cc" ]
-    template =
-        "java/src/org/chromium/android_webview/common/AwSwitches.java.tmpl"
+    class_name = "org.chromium.android_webview.common.AwSwitches"
   }
 
   java_cpp_features("common_java_features_srcjar") {
     # External code should depend on "common_java" instead.
     visibility = [ ":*" ]
     sources = [ "common/aw_features.cc" ]
-    template =
-        "java/src/org/chromium/android_webview/common/AwFeatures.java.tmpl"
+    class_name = "org.chromium.android_webview.common.AwFeatures"
   }
 
   android_library("common_java") {
diff --git a/android_webview/browser/aw_field_trials.cc b/android_webview/browser/aw_field_trials.cc
index 4ba982fd..2b19381 100644
--- a/android_webview/browser/aw_field_trials.cc
+++ b/android_webview/browser/aw_field_trials.cc
@@ -111,10 +111,20 @@
   // kVulkan in case it becomes enabled by default.
   aw_feature_overrides.DisableFeature(::features::kVulkan);
 
+  // WebView does not support web-app (service-worker) based payment apps for
+  // Payment Request.
   aw_feature_overrides.DisableFeature(::features::kServiceWorkerPaymentApps);
+
+  // Payment Request on WebView does not send down the deprecated parameters to
+  // Android payment apps.
   aw_feature_overrides.EnableFeature(
       ::payments::android::kAndroidPaymentIntentsOmitDeprecatedParameters);
 
+  // WebView does not support Secure Payment Confirmation, and thus should not
+  // expose the PaymentRequest.securePaymentConfirmationAvailability API.
+  aw_feature_overrides.DisableFeature(
+      blink::features::kSecurePaymentConfirmationAvailabilityAPI);
+
   // WebView does not support overlay fullscreen yet for video overlays.
   aw_feature_overrides.DisableFeature(media::kOverlayFullscreenVideo);
 
diff --git a/android_webview/java/src/org/chromium/android_webview/common/AwFeatures.java.tmpl b/android_webview/java/src/org/chromium/android_webview/common/AwFeatures.java.tmpl
deleted file mode 100644
index cc7d76d..0000000
--- a/android_webview/java/src/org/chromium/android_webview/common/AwFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.android_webview.common;
-
-/**
- * Constants for the names of WebView Features.
- */
-public final class AwFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Do not instantiate this class.
-    private AwFeatures() {{}}
-}}
diff --git a/android_webview/java/src/org/chromium/android_webview/common/AwSwitches.java.tmpl b/android_webview/java/src/org/chromium/android_webview/common/AwSwitches.java.tmpl
deleted file mode 100644
index 33445df..0000000
--- a/android_webview/java/src/org/chromium/android_webview/common/AwSwitches.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.android_webview.common;
-
-/**
- * Contains command line switches that are specific to Android WebView.
- */
-public final class AwSwitches {{
-
-{NATIVE_STRINGS}
-
-    // Do not instantiate this class.
-    private AwSwitches() {{}}
-}}
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwPrefetchInterceptionTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwPrefetchInterceptionTest.java
new file mode 100644
index 0000000..fc0a79f8
--- /dev/null
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwPrefetchInterceptionTest.java
@@ -0,0 +1,261 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.android_webview.test;
+
+import androidx.test.filters.LargeTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.UseParametersRunnerFactory;
+
+import org.chromium.android_webview.AwBrowserContext;
+import org.chromium.android_webview.AwContents;
+import org.chromium.android_webview.AwPrefetchManager;
+import org.chromium.android_webview.common.AwFeatures;
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DoNotBatch;
+import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.Features;
+import org.chromium.content_public.browser.test.util.TestCallbackHelperContainer.OnPageStartedHelper;
+import org.chromium.content_public.common.ContentSwitches;
+import org.chromium.net.test.ServerCertificate;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+/** Tests for shouldInterceptRequest behavior with various prefetch mechanisms. */
+@RunWith(Parameterized.class)
+@UseParametersRunnerFactory(AwJUnit4ClassRunnerWithParameters.Factory.class)
+@DoNotBatch(reason = "Tests that need browser start are incompatible with @Batch")
+public class AwPrefetchInterceptionTest extends AwParameterizedTest {
+
+    @Rule public AwActivityTestRule mActivityTestRule;
+
+    private final TestAwContentsClient mContentsClient = new TestAwContentsClient();
+
+    private AwContents mAwContents;
+    private AwEmbeddedTestServer mTestServer;
+    private AwBrowserContext mBrowserContext;
+
+    private static final String INITIAL_URL = "/android_webview/test/data/hello_world.html";
+    private static final String PREFETCH_URL = "/android_webview/test/data/prefetch.html";
+
+    private String mInitialUrl;
+    private String mPrefetchUrl;
+
+    public AwPrefetchInterceptionTest(AwSettingsMutation param) {
+        this.mActivityTestRule = new AwActivityTestRule(param.getMutation());
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        mActivityTestRule.startBrowserProcess();
+        AwTestContainerView testContainerView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
+        mAwContents = testContainerView.getAwContents();
+
+        AwActivityTestRule.enableJavaScriptOnUiThread(mAwContents);
+
+        mBrowserContext = mActivityTestRule.getAwBrowserContext();
+
+        mTestServer =
+                AwEmbeddedTestServer.createAndStartHTTPSServer(
+                        InstrumentationRegistry.getInstrumentation().getContext(),
+                        ServerCertificate.CERT_TEST_NAMES);
+
+        mInitialUrl = getURL(INITIAL_URL);
+        mPrefetchUrl = getURL(PREFETCH_URL);
+    }
+
+    @After
+    public void tearDown() {
+        if (mTestServer != null) {
+            mTestServer.stopAndDestroyServer();
+        }
+    }
+
+    // Returns a URL. This requires ContentSwitches.HOST_RESOLVER_RULES.
+    private String getURL(final String relativeUrl) {
+        return mTestServer.getURLWithHostName("a.test", relativeUrl);
+    }
+
+    private void loadInitialPage() throws Exception {
+        // Load an initial page that will be triggering the speculation rules prefetch.
+        mActivityTestRule.loadUrlSync(
+                mAwContents, mContentsClient.getOnPageFinishedHelper(), mInitialUrl);
+
+        // Wait for onPageStarted for initial page load.
+        OnPageStartedHelper onPageStartedHelper = mContentsClient.getOnPageStartedHelper();
+        onPageStartedHelper.waitForCallback(
+                0, 1, AwActivityTestRule.SCALED_WAIT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        Assert.assertEquals(onPageStartedHelper.getUrl(), mInitialUrl);
+    }
+
+    // Triggers a speculation rules prefetch.
+    private void triggerSpeculationRulesPrefetchAndWait(String targetUrl) {
+        final String speculationRulesTemplate =
+                """
+                    {
+                    const script = document.createElement('script');
+                    script.type = 'speculationrules';
+                    script.text = '{"prefetch": [{"urls": ["%s"]}]}';
+                    document.head.appendChild(script);
+                    }
+                """;
+        final String speculationRules = String.format(speculationRulesTemplate, targetUrl);
+
+        // Start prefetching from the initial page.
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    mAwContents.evaluateJavaScript(speculationRules, null);
+                });
+
+        // We need to wait in order to give time for the prefetch request
+        // to execute.
+        try {
+            Thread.sleep(500);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    // Triggers a <link rel="prefetch"> prefetch.
+    private void triggerLinkRelPrefetchAndWait(String targetUrl) {
+        // Inject the prefetch link into the loaded page.
+        final String script =
+                "var link = document.createElement('link'); "
+                        + "link.rel = 'prefetch'; "
+                        + "link.href = '"
+                        + targetUrl
+                        + "'; "
+                        + "document.head.appendChild(link);";
+        ThreadUtils.runOnUiThreadBlocking(() -> mAwContents.evaluateJavaScript(script, null));
+
+        // We need to wait in order to give time for the prefetch request
+        // to execute.
+        try {
+            Thread.sleep(500);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private void triggerEmbedderPrefetchAndWait(String targetUrl) throws Exception {
+        AwPrefetchTest.TestAwPrefetchCallback callback =
+                new AwPrefetchTest.TestAwPrefetchCallback();
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    AwPrefetchManager prefetchManager = mBrowserContext.getPrefetchManager();
+                    Executor directExecutor = Runnable::run;
+                    int prefetchKey =
+                            prefetchManager.startPrefetchRequest(
+                                    targetUrl, null, callback, directExecutor);
+                    callback.setPrefetchKey(prefetchKey);
+                });
+        callback.getOnStatusUpdatedHelper().waitForNext();
+    }
+
+    private void assertShouldInterceptRequestCalled(
+            TestAwContentsClient.ShouldInterceptRequestHelper helper,
+            String targetUrl,
+            int previousCallCountForUrl)
+            throws TimeoutException {
+        helper.waitForCallback(previousCallCountForUrl);
+        Assert.assertEquals(
+                "shouldInterceptRequest was not called for " + targetUrl,
+                previousCallCountForUrl + 1,
+                helper.getRequestCountForUrl(targetUrl));
+    }
+
+    private void assertShouldInterceptRequestNotCalled(
+            TestAwContentsClient.ShouldInterceptRequestHelper helper, String targetUrl) {
+        try {
+            Thread.sleep(1000);
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+        }
+        Assert.assertEquals(
+                "shouldInterceptRequest WAS called for " + targetUrl + " but was NOT expected.",
+                0,
+                helper.getRequestCountForUrl(targetUrl));
+    }
+
+    @Test
+    @LargeTest
+    @Feature({"AndroidWebView"})
+    @Features.DisableFeatures(AwFeatures.WEBVIEW_SKIP_INTERCEPTS_FOR_PREFETCH)
+    @CommandLineFlags.Add({ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1"})
+    public void testLinkRelPrefetch_InterceptionEnabled_FeatureDisabled() throws Throwable {
+        loadInitialPage();
+        TestAwContentsClient.ShouldInterceptRequestHelper interceptHelper =
+                mContentsClient.getShouldInterceptRequestHelper();
+        int previousCountForUrl = interceptHelper.getRequestCountForUrl(mPrefetchUrl);
+        triggerLinkRelPrefetchAndWait(mPrefetchUrl);
+        assertShouldInterceptRequestCalled(interceptHelper, mPrefetchUrl, previousCountForUrl);
+    }
+
+    @Test
+    @LargeTest
+    @Feature({"AndroidWebView"})
+    @Features.EnableFeatures(AwFeatures.WEBVIEW_SKIP_INTERCEPTS_FOR_PREFETCH)
+    @CommandLineFlags.Add({ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1"})
+    public void testLinkRelPrefetch_InterceptionEnabled_FeatureEnabled() throws Throwable {
+        loadInitialPage();
+        TestAwContentsClient.ShouldInterceptRequestHelper interceptHelper =
+                mContentsClient.getShouldInterceptRequestHelper();
+        int previousCountForUrl = interceptHelper.getRequestCountForUrl(mPrefetchUrl);
+        triggerLinkRelPrefetchAndWait(mPrefetchUrl);
+        assertShouldInterceptRequestCalled(interceptHelper, mPrefetchUrl, previousCountForUrl);
+    }
+
+    @Test
+    @LargeTest
+    @Feature({"AndroidWebView"})
+    @Features.DisableFeatures(AwFeatures.WEBVIEW_SKIP_INTERCEPTS_FOR_PREFETCH)
+    @CommandLineFlags.Add({ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1"})
+    public void testSpeculationRulesPrefetch_InterceptionEnabled_FeatureDisabled()
+            throws Throwable {
+        loadInitialPage();
+        TestAwContentsClient.ShouldInterceptRequestHelper interceptHelper =
+                mContentsClient.getShouldInterceptRequestHelper();
+        int previousCountForUrl = interceptHelper.getRequestCountForUrl(mPrefetchUrl);
+        triggerSpeculationRulesPrefetchAndWait(mPrefetchUrl);
+        assertShouldInterceptRequestCalled(interceptHelper, mPrefetchUrl, previousCountForUrl);
+    }
+
+    @Test
+    @LargeTest
+    @Feature({"AndroidWebView"})
+    @Features.EnableFeatures(AwFeatures.WEBVIEW_SKIP_INTERCEPTS_FOR_PREFETCH)
+    @CommandLineFlags.Add({ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1"})
+    public void testSpeculationRulesPrefetch_InterceptionEnabled_FeatureEnabled() throws Throwable {
+        loadInitialPage();
+        TestAwContentsClient.ShouldInterceptRequestHelper interceptHelper =
+                mContentsClient.getShouldInterceptRequestHelper();
+        int previousCountForUrl = interceptHelper.getRequestCountForUrl(mPrefetchUrl);
+        triggerSpeculationRulesPrefetchAndWait(mPrefetchUrl);
+        assertShouldInterceptRequestCalled(interceptHelper, mPrefetchUrl, previousCountForUrl);
+    }
+
+    @Test
+    @LargeTest
+    @Feature({"AndroidWebView"})
+    @CommandLineFlags.Add({ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1"})
+    public void testEmbedderPrefetch_InterceptionSkipped() throws Throwable {
+        loadInitialPage();
+        TestAwContentsClient.ShouldInterceptRequestHelper interceptHelper =
+                mContentsClient.getShouldInterceptRequestHelper();
+        triggerEmbedderPrefetchAndWait(mPrefetchUrl);
+        assertShouldInterceptRequestNotCalled(interceptHelper, mPrefetchUrl);
+    }
+}
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn
index 7fb3d0f..0573f63 100644
--- a/android_webview/test/BUILD.gn
+++ b/android_webview/test/BUILD.gn
@@ -457,6 +457,7 @@
     "../javatests/src/org/chromium/android_webview/test/AwPermissionManagerTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwPermissionQueryApiTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwPersistentOriginTrialTest.java",
+    "../javatests/src/org/chromium/android_webview/test/AwPrefetchInterceptionTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwPrefetchTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwPrerenderTest.java",
     "../javatests/src/org/chromium/android_webview/test/AwProxyControllerTest.java",
diff --git a/android_webview/test/data/prefetch.html b/android_webview/test/data/prefetch.html
new file mode 100644
index 0000000..260f820
--- /dev/null
+++ b/android_webview/test/data/prefetch.html
@@ -0,0 +1,8 @@
+<html>
+  <head>
+    <title>Hello, Prefetch!</title>
+  </head>
+  <body>
+    Hello, Prefetch!
+  </body>
+</html>
diff --git a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
index 6311f487..621ab82 100644
--- a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
@@ -6882,7 +6882,6 @@
     getter methodName
     method constructor
 interface PaymentRequest : EventTarget
-    static method securePaymentConfirmationAvailability
     attribute @@toStringTag
     getter id
     getter onpaymentmethodchange
diff --git a/ash/app_list/views/app_list_bubble_apps_page.cc b/ash/app_list/views/app_list_bubble_apps_page.cc
index 422139ba..1170ca1 100644
--- a/ash/app_list/views/app_list_bubble_apps_page.cc
+++ b/ash/app_list/views/app_list_bubble_apps_page.cc
@@ -641,12 +641,11 @@
   recent_apps_->SetModels(search_model, model);
 }
 
-void AppListBubbleAppsPage::OnViewVisibilityChanged(views::View* observed_view,
-                                                    views::View* starting_view,
-                                                    bool visible) {
-  if (starting_view == continue_section_ || starting_view == recent_apps_) {
+void AppListBubbleAppsPage::OnViewVisibilityChanged(
+    views::View* observed_view,
+    views::View* starting_view) {
+  if (starting_view == continue_section_ || starting_view == recent_apps_)
     UpdateSeparatorVisibility();
-  }
 }
 
 void AppListBubbleAppsPage::OnNudgeRemoved() {
diff --git a/ash/app_list/views/app_list_bubble_apps_page.h b/ash/app_list/views/app_list_bubble_apps_page.h
index 6c797e02..b8e078a 100644
--- a/ash/app_list/views/app_list_bubble_apps_page.h
+++ b/ash/app_list/views/app_list_bubble_apps_page.h
@@ -117,8 +117,7 @@
 
   // view::ViewObserver:
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override;
+                               views::View* starting_view) override;
 
   // AppListModelProvider::Observer:
   void OnActiveAppListModelsChanged(AppListModel* model,
diff --git a/ash/app_list/views/assistant/assistant_page_view_unittest.cc b/ash/app_list/views/assistant/assistant_page_view_unittest.cc
index 16cf6735..aafaf771 100644
--- a/ash/app_list/views/assistant/assistant_page_view_unittest.cc
+++ b/ash/app_list/views/assistant/assistant_page_view_unittest.cc
@@ -139,8 +139,7 @@
   ~VisibilityObserver() override { observed_view_->RemoveObserver(this); }
 
   void OnViewVisibilityChanged(views::View* view_or_ancestor,
-                               views::View* starting_view,
-                               bool visible) override {
+                               views::View* starting_view) override {
     UpdateWasDrawn();
   }
 
diff --git a/ash/capture_mode/capture_mode_pixeltest.cc b/ash/capture_mode/capture_mode_pixeltest.cc
index dc4579634..1ef2672 100644
--- a/ash/capture_mode/capture_mode_pixeltest.cc
+++ b/ash/capture_mode/capture_mode_pixeltest.cc
@@ -141,7 +141,7 @@
       GetScreenshotName(base::StrCat({"screen_capture_popup_notification_",
                                       GetDisplayTypeName(GetDisplayType())}),
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/3,
+      /*revision_number=*/4,
       test_api()->GetPopupViewForId(kScreenCaptureNotificationId)));
 }
 
@@ -174,7 +174,7 @@
       GetScreenshotName(base::StrCat({"video_capture_notification_popup_",
                                       GetDisplayTypeName(GetDisplayType())}),
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_popup_view));
+      /*revision_number=*/5, notification_popup_view));
 
   test_api()->ToggleBubble();
   auto* notification_view =
@@ -183,7 +183,7 @@
       GetScreenshotName(base::StrCat({"video_capture_notification_view_",
                                       GetDisplayTypeName(GetDisplayType())}),
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_view));
+      /*revision_number=*/5, notification_view));
 }
 
 }  // namespace ash
diff --git a/ash/capture_mode/capture_mode_test_util.cc b/ash/capture_mode/capture_mode_test_util.cc
index a929618..2697c28a 100644
--- a/ash/capture_mode/capture_mode_test_util.cc
+++ b/ash/capture_mode/capture_mode_test_util.cc
@@ -503,8 +503,7 @@
 
 void ViewVisibilityChangeWaiter::OnViewVisibilityChanged(
     views::View* observed_view,
-    views::View* starting_view,
-    bool visible) {
+    views::View* starting_view) {
   wait_loop_.Quit();
 }
 
diff --git a/ash/capture_mode/capture_mode_test_util.h b/ash/capture_mode/capture_mode_test_util.h
index c69e245..a6cf6ca 100644
--- a/ash/capture_mode/capture_mode_test_util.h
+++ b/ash/capture_mode/capture_mode_test_util.h
@@ -224,8 +224,7 @@
 
   // views::ViewObserver:
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override;
+                               views::View* starting_view) override;
 
  private:
   const raw_ptr<views::View> view_;
diff --git a/ash/clipboard/views/clipboard_history_item_view.cc b/ash/clipboard/views/clipboard_history_item_view.cc
index ca904a2..58c1192 100644
--- a/ash/clipboard/views/clipboard_history_item_view.cc
+++ b/ash/clipboard/views/clipboard_history_item_view.cc
@@ -82,8 +82,7 @@
 
 void ClipboardHistoryItemView::ContentsView::OnViewVisibilityChanged(
     views::View* observed_view,
-    views::View* starting_view,
-    bool visible) {
+    views::View* starting_view) {
   is_delete_button_visible_ = observed_view->GetVisible();
   SetClipPath(GetClipPath());
 }
diff --git a/ash/clipboard/views/clipboard_history_item_view.h b/ash/clipboard/views/clipboard_history_item_view.h
index 009f94f..00fa741f 100644
--- a/ash/clipboard/views/clipboard_history_item_view.h
+++ b/ash/clipboard/views/clipboard_history_item_view.h
@@ -92,8 +92,7 @@
    private:
     // views::ViewObserver:
     void OnViewVisibilityChanged(views::View* observed_view,
-                                 views::View* starting_view,
-                                 bool visible) override;
+                                 views::View* starting_view) override;
 
     // Determines whether the contents need to be clipped to avoid overlapping
     // with the delete button.
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 216caab2..4589aed 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -2799,11 +2799,16 @@
              "FeatureManagementFeatureAwareDeviceDemoMode",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Disable the demo mode app orientation locked in landscape.
+// Enables the demo mode app orientation locked in landscape.
 BASE_FEATURE(kDemoModeAppLandscapeLocked,
              "DemoModeAppLandscapeLocked",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+// Enables the ToS Notification in demo mode signed-in sessions.
+BASE_FEATURE(kDemoSessionToSNotification,
+             "DemoSessionToSNotification",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // The pref kSecondaryGoogleAccountSigninAllowed is set to false in Demo Mode.
 BASE_FEATURE(kDemoModeSecondaryGoogleAccountSigninAllowedFalse,
              "DemoModeSecondaryGoogleAccountSigninAllowedFalse",
@@ -3664,6 +3669,10 @@
   return base::FeatureList::IsEnabled(kDemoModeAppLandscapeLocked);
 }
 
+bool IsDemoSessionToSNotificationEnabled() {
+  return base::FeatureList::IsEnabled(kDemoSessionToSNotification);
+}
+
 bool IsDemoModeSecondaryGoogleAccountSigninAllowedFalse() {
   return base::FeatureList::IsEnabled(
       kDemoModeSecondaryGoogleAccountSigninAllowedFalse);
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 42a7cd46..27e197dd 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -911,6 +911,8 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 BASE_DECLARE_FEATURE(kDemoModeAppLandscapeLocked);
 COMPONENT_EXPORT(ASH_CONSTANTS)
+BASE_DECLARE_FEATURE(kDemoSessionToSNotification);
+COMPONENT_EXPORT(ASH_CONSTANTS)
 BASE_DECLARE_FEATURE(kDemoModeSecondaryGoogleAccountSigninAllowedFalse);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kSideAlignedToasts);
 COMPONENT_EXPORT(ASH_CONSTANTS)
@@ -1128,6 +1130,7 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsCryptauthAttestationSyncingEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDeepLinkingEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoModeAppLandscapeLockedEnabled();
+COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoSessionToSNotificationEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoModeAppResetWindowContainerEnable();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoModeSignInEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoModeWallpaperUpdateEnabled();
diff --git a/ash/constants/notifier_catalogs.h b/ash/constants/notifier_catalogs.h
index fa140a5..73e449eb 100644
--- a/ash/constants/notifier_catalogs.h
+++ b/ash/constants/notifier_catalogs.h
@@ -215,7 +215,8 @@
   kBocaSpotlightStarted = 196,
   kFaceGazeActive = 197,
   kUsbPeripheralDeviceOrEndpointLimit = 198,
-  kMaxValue = kUsbPeripheralDeviceOrEndpointLimit
+  kDemoMode = 199,
+  kMaxValue = kDemoMode
 };
 
 // A living catalog that registers system nudges.
diff --git a/ash/controls/contextual_nudge.cc b/ash/controls/contextual_nudge.cc
index 70f3d393..0411065 100644
--- a/ash/controls/contextual_nudge.cc
+++ b/ash/controls/contextual_nudge.cc
@@ -16,6 +16,7 @@
 #include "ui/base/mojom/dialog_button.mojom.h"
 #include "ui/chromeos/styles/cros_tokens_color_mappings.h"
 #include "ui/compositor/layer.h"
+#include "ui/compositor/layer_type.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/views/border.h"
@@ -54,6 +55,7 @@
   SetCanActivate(false);
   set_shadow(views::BubbleBorder::NO_SHADOW);
   SetButtons(static_cast<int>(ui::mojom::DialogButton::kNone));
+  set_layer_type(ui::LAYER_NOT_DRAWN);
 
   if (parent_window) {
     set_parent_window(parent_window);
@@ -94,10 +96,6 @@
   SetAnchorRect(rect);
 }
 
-ui::LayerType ContextualNudge::GetLayerType() const {
-  return ui::LAYER_NOT_DRAWN;
-}
-
 void ContextualNudge::OnGestureEvent(ui::GestureEvent* event) {
   if (event->type() == ui::EventType::kGestureTap && tap_callback_) {
     event->StopPropagation();
diff --git a/ash/controls/contextual_nudge.h b/ash/controls/contextual_nudge.h
index e81f8d6..eb54dc0 100644
--- a/ash/controls/contextual_nudge.h
+++ b/ash/controls/contextual_nudge.h
@@ -51,7 +51,6 @@
   void UpdateAnchorRect(const gfx::Rect& rect);
 
   // BubbleDialogDelegateView:
-  ui::LayerType GetLayerType() const override;
   void OnGestureEvent(ui::GestureEvent* event) override;
 
  private:
diff --git a/ash/quick_insert/views/quick_insert_submenu_controller.cc b/ash/quick_insert/views/quick_insert_submenu_controller.cc
index a4a37af..cf0f273b 100644
--- a/ash/quick_insert/views/quick_insert_submenu_controller.cc
+++ b/ash/quick_insert/views/quick_insert_submenu_controller.cc
@@ -45,9 +45,8 @@
 
 void QuickInsertSubmenuController::OnViewVisibilityChanged(
     views::View* observed_view,
-    views::View* starting_view,
-    bool visible) {
-  if (!visible) {
+    views::View* starting_view) {
+  if (!observed_view->IsDrawn()) {
     Close();
   }
 }
diff --git a/ash/quick_insert/views/quick_insert_submenu_controller.h b/ash/quick_insert/views/quick_insert_submenu_controller.h
index 610cdacf..887cb61 100644
--- a/ash/quick_insert/views/quick_insert_submenu_controller.h
+++ b/ash/quick_insert/views/quick_insert_submenu_controller.h
@@ -33,8 +33,7 @@
 
   // ViewObserver:
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override;
+                               views::View* starting_view) override;
   void OnViewIsDeleting(views::View* observed_view) override;
 
   // Shows the submenu with `items`, anchoring it to `anchor_view`.
diff --git a/ash/scalable_iph/scalable_iph_pixeltest.cc b/ash/scalable_iph/scalable_iph_pixeltest.cc
index 0dd4e0c8..1f48a061 100644
--- a/ash/scalable_iph/scalable_iph_pixeltest.cc
+++ b/ash/scalable_iph/scalable_iph_pixeltest.cc
@@ -84,6 +84,6 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       GetScreenshotName("scalable_iph_notification_no_body_text",
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/3, message_view));
+      /*revision_number=*/4, message_view));
 }
 }  // namespace ash
diff --git a/ash/style/blurred_background_shield.cc b/ash/style/blurred_background_shield.cc
index b64f48a..095a75e 100644
--- a/ash/style/blurred_background_shield.cc
+++ b/ash/style/blurred_background_shield.cc
@@ -68,8 +68,7 @@
 
 void BlurredBackgroundShield::OnViewVisibilityChanged(
     views::View* observed_view,
-    views::View* starting_view,
-    bool visible) {
+    views::View* starting_view) {
   background_layer_.SetVisible(host_->GetVisible());
 }
 
diff --git a/ash/style/blurred_background_shield.h b/ash/style/blurred_background_shield.h
index 91c19b4..290f790 100644
--- a/ash/style/blurred_background_shield.h
+++ b/ash/style/blurred_background_shield.h
@@ -49,8 +49,7 @@
   // views::ViewObserver:
   void OnViewAddedToWidget(views::View* observed_view) override;
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override;
+                               views::View* starting_view) override;
   void OnViewLayerBoundsSet(views::View* observed_view) override;
   void OnViewThemeChanged(views::View* observed_view) override;
 
diff --git a/ash/system/accessibility/floating_accessibility_view.cc b/ash/system/accessibility/floating_accessibility_view.cc
index a12c8e9..466815a 100644
--- a/ash/system/accessibility/floating_accessibility_view.cc
+++ b/ash/system/accessibility/floating_accessibility_view.cc
@@ -305,11 +305,9 @@
 
 void FloatingAccessibilityView::OnViewVisibilityChanged(
     views::View* observed_view,
-    views::View* starting_view,
-    bool visible) {
-  if (observed_view != starting_view) {
+    views::View* starting_view) {
+  if (observed_view != starting_view)
     return;
-  }
   delegate_->OnLayoutChanged();
 }
 
diff --git a/ash/system/accessibility/floating_accessibility_view.h b/ash/system/accessibility/floating_accessibility_view.h
index 25051f0..cd44c62b 100644
--- a/ash/system/accessibility/floating_accessibility_view.h
+++ b/ash/system/accessibility/floating_accessibility_view.h
@@ -105,8 +105,7 @@
 
   // views::ViewObserver:
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override;
+                               views::View* starting_view) override;
   void OnViewFocused(views::View* view) override;
   void OnViewBlurred(views::View* view) override;
 
diff --git a/ash/system/holding_space/holding_space_item_views_section.cc b/ash/system/holding_space/holding_space_item_views_section.cc
index 8b630da..0587e13 100644
--- a/ash/system/holding_space/holding_space_item_views_section.cc
+++ b/ash/system/holding_space/holding_space_item_views_section.cc
@@ -111,12 +111,10 @@
   }
 
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override {
+                               views::View* starting_view) override {
     // Sync scroll view visibility with contents visibility.
-    if (GetVisible() != observed_view->GetVisible()) {
+    if (GetVisible() != observed_view->GetVisible())
       SetVisible(observed_view->GetVisible());
-    }
   }
 
   void OnViewIsDeleting(View* observed_view) override {
diff --git a/ash/system/holding_space/holding_space_tray_unittest.cc b/ash/system/holding_space/holding_space_tray_unittest.cc
index 0cbb415..c66a33c 100644
--- a/ash/system/holding_space/holding_space_tray_unittest.cc
+++ b/ash/system/holding_space/holding_space_tray_unittest.cc
@@ -248,8 +248,7 @@
  private:
   // views::ViewObserver:
   void OnViewVisibilityChanged(views::View* view,
-                               views::View* starting_view,
-                               bool visible) override {
+                               views::View* starting_view) override {
     wait_loop_->Quit();
   }
 
@@ -2141,7 +2140,7 @@
 
   // Background.
   auto* background = bubble->GetBackground();
-  ASSERT_TRUE(background);
+  ASSERT_FALSE(background);
   EXPECT_EQ(bubble->layer()->type(), ui::LAYER_NOT_DRAWN);
   EXPECT_EQ(bubble->layer()->background_blur(), 0.f);
 
diff --git a/ash/system/mahi/mahi_panel_widget.cc b/ash/system/mahi/mahi_panel_widget.cc
index bce52d6..57e70b7 100644
--- a/ash/system/mahi/mahi_panel_widget.cc
+++ b/ash/system/mahi/mahi_panel_widget.cc
@@ -253,8 +253,7 @@
 }
 
 void MahiPanelWidget::OnViewVisibilityChanged(views::View* observed_view,
-                                              views::View* starting_view,
-                                              bool visible) {
+                                              views::View* starting_view) {
   CHECK_EQ(observed_view, refresh_view_);
 
   if (is_refresh_view_visible_ == observed_view->GetVisible()) {
diff --git a/ash/system/mahi/mahi_panel_widget.h b/ash/system/mahi/mahi_panel_widget.h
index e3178742..9f912425 100644
--- a/ash/system/mahi/mahi_panel_widget.h
+++ b/ash/system/mahi/mahi_panel_widget.h
@@ -48,8 +48,7 @@
 
   // views::ViewObserver:
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override;
+                               views::View* starting_view) override;
   void OnViewIsDeleting(views::View* observed_view) override;
 
   bool is_refresh_view_visible_ = false;
diff --git a/ash/system/notification_center/views/ash_notification_view_pixeltest.cc b/ash/system/notification_center/views/ash_notification_view_pixeltest.cc
index e425769d..22a0ff8 100644
--- a/ash/system/notification_center/views/ash_notification_view_pixeltest.cc
+++ b/ash/system/notification_center/views/ash_notification_view_pixeltest.cc
@@ -122,7 +122,7 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       GetScreenshotName("close_button_focused",
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_view));
+      /*revision_number=*/5, notification_view));
 }
 
 // Regression test for http://b/267195370. Tests that a notification with no
@@ -145,7 +145,7 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       GetScreenshotName("collapsed_no_message",
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_view));
+      /*revision_number=*/5, notification_view));
 }
 
 // Tests that a progress notification does not have its title vertically
@@ -168,7 +168,7 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       GetScreenshotName("progress_collapsed",
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_view));
+      /*revision_number=*/5, notification_view));
 }
 
 // Tests the control buttons UI for the case of a notification with just the
@@ -192,7 +192,7 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       GetScreenshotName("close_control_button",
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_view));
+      /*revision_number=*/5, notification_view));
 }
 
 // Tests the control buttons UI for the case of a notification with both the
@@ -216,7 +216,7 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       GetScreenshotName("settings_and_close_control_buttons",
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_view));
+      /*revision_number=*/5, notification_view));
 }
 
 // Tests the inline reply UI for AshNotificationView.
@@ -242,7 +242,7 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       GetScreenshotName("inline_reply_focused",
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_view));
+      /*revision_number=*/5, notification_view));
 }
 
 // Tests the focus ring for the expand button in AshNotificationView.
@@ -259,7 +259,7 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       GetScreenshotName("expand_button_focus_ring",
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_view));
+      /*revision_number=*/5, notification_view));
 }
 
 TEST_P(AshNotificationViewPixelTest, NotificationViewFocusRing) {
@@ -273,7 +273,7 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       GetScreenshotName("notification_view_focus_ring",
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_view));
+      /*revision_number=*/5, notification_view));
 }
 
 TEST_P(AshNotificationViewPixelTest, NotificationPopupFocusRing) {
@@ -291,7 +291,7 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       GetScreenshotName("notification_popup_focus_ring",
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_view));
+      /*revision_number=*/5, notification_view));
 }
 
 // Tests that a notification's icon is sized and positioned correctly at
@@ -348,7 +348,7 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       GetScreenshotName(base::StringPrintf("expanded_icon_size_%u", size),
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_view));
+      /*revision_number=*/5, notification_view));
 
   notification_view->ToggleExpand();
   ASSERT_FALSE(notification_view->IsExpanded());
@@ -360,7 +360,7 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       GetScreenshotName(base::StringPrintf("collapsed_icon_size_%u", size),
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/3, notification_view));
+      /*revision_number=*/4, notification_view));
 }
 
 class AshNotificationViewTitlePixelTest
@@ -423,7 +423,7 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       ::ash::GetScreenshotName(screenshot_name,
                                IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_view));
+      /*revision_number=*/5, notification_view));
 }
 
 class AshNotificationViewCollapsedLongTextPixelTest
@@ -494,7 +494,7 @@
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       GetScreenshotName("elided_text_spacing",
                         IsNotificationWidthIncreaseEnabled()),
-      /*revision_number=*/4, notification_view));
+      /*revision_number=*/5, notification_view));
 }
 
 }  // namespace ash
diff --git a/ash/system/notification_center/views/ongoing_process_view_pixeltest.cc b/ash/system/notification_center/views/ongoing_process_view_pixeltest.cc
index 5fc7ba3e..da14a9d 100644
--- a/ash/system/notification_center/views/ongoing_process_view_pixeltest.cc
+++ b/ash/system/notification_center/views/ongoing_process_view_pixeltest.cc
@@ -142,7 +142,7 @@
   test_api()->ToggleBubble();
 
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
-      GenerateTestName(), /*revision_number=*/3,
+      GenerateTestName(), /*revision_number=*/4,
       test_api()->GetNotificationCenterView()));
 }
 
diff --git a/ash/system/status_area_widget.cc b/ash/system/status_area_widget.cc
index 6322a6a..e151db3 100644
--- a/ash/system/status_area_widget.cc
+++ b/ash/system/status_area_widget.cc
@@ -686,8 +686,7 @@
 }
 
 void StatusAreaWidget::OnViewVisibilityChanged(views::View* observed_view,
-                                               views::View* starting_view,
-                                               bool visible) {
+                                               views::View* starting_view) {
   CHECK(observed_view == notification_center_tray_);
   UpdateDateTrayRoundedCorners();
 }
diff --git a/ash/system/status_area_widget.h b/ash/system/status_area_widget.h
index fc41eb96..d2fa0a6 100644
--- a/ash/system/status_area_widget.h
+++ b/ash/system/status_area_widget.h
@@ -241,8 +241,7 @@
   // views::ViewObserver:
   void OnViewIsDeleting(views::View* observed_view) override;
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override;
+                               views::View* starting_view) override;
 
   // views::Widget:
   void OnMouseEvent(ui::MouseEvent* event) override;
diff --git a/ash/system/toast/anchored_nudge_manager_impl.cc b/ash/system/toast/anchored_nudge_manager_impl.cc
index 7a8f1b6..832ce17 100644
--- a/ash/system/toast/anchored_nudge_manager_impl.cc
+++ b/ash/system/toast/anchored_nudge_manager_impl.cc
@@ -157,8 +157,7 @@
 
   // ViewObserver:
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override {
+                               views::View* starting_view) override {
     if (!observed_view->GetVisible()) {
       HandleAnchorViewIsDeletingOrHiding(observed_view);
     }
diff --git a/ash/system/tray/tray_bubble_view.cc b/ash/system/tray/tray_bubble_view.cc
index e291a29..e742eeb3 100644
--- a/ash/system/tray/tray_bubble_view.cc
+++ b/ash/system/tray/tray_bubble_view.cc
@@ -49,6 +49,7 @@
 #include "ui/gfx/geometry/rounded_corners_f.h"
 #include "ui/gfx/geometry/skia_conversions.h"
 #include "ui/views/accessibility/view_accessibility.h"
+#include "ui/views/background.h"
 #include "ui/views/bubble/bubble_frame_view.h"
 #include "ui/views/highlight_border.h"
 #include "ui/views/layout/box_layout.h"
@@ -320,9 +321,6 @@
   // an alert dialog. This would make screen readers announce the whole of the
   // system tray which is undesirable.
   SetAccessibleWindowRole(ax::mojom::Role::kDialog);
-  // We force to create contents background since the bubble border background
-  // is not shown in this view.
-  set_force_create_contents_background(true);
   SetButtons(static_cast<int>(ui::mojom::DialogButton::kNone));
 
   DCHECK(delegate_);
@@ -339,7 +337,11 @@
   set_close_on_deactivate(init_params.close_on_deactivate);
   set_margins(init_params.margin.has_value() ? init_params.margin.value()
                                              : gfx::Insets());
-  set_corner_radius(params_.corner_radius);
+  set_use_round_corners(false);
+  SetBackgroundColor(SK_ColorTRANSPARENT);
+  set_layer_type((params_.translucent || params_.transparent)
+                     ? ui::LAYER_NOT_DRAWN
+                     : ui::LAYER_TEXTURED);
 
   // Always create a layer so that the layer for FocusRing stays in this view's
   // layer. Without it, the layer for FocusRing goes above the NativeViewHost
@@ -349,26 +351,29 @@
   SetPaintToLayer(init_params.transparent ? ui::LAYER_NOT_DRAWN
                                           : ui::LAYER_TEXTURED);
 
-  if (init_params.transparent) {
-    set_use_round_corners(false);
-    SetBackgroundColor(SK_ColorTRANSPARENT);
-  } else {
+  if (!init_params.transparent) {
     layer()->SetRoundedCornerRadius(
         gfx::RoundedCornersF{static_cast<float>(params_.corner_radius)});
     layer()->SetIsFastRoundedCorner(true);
-
-    SetBackgroundColor(cros_tokens::kCrosSysSystemBaseElevatedOpaque);
     SetBorder(std::make_unique<views::HighlightBorder>(
         params_.corner_radius,
         views::HighlightBorder::Type::kHighlightBorderOnShadow));
-  }
 
-  if (init_params.translucent && chromeos::features::IsSystemBlurEnabled()) {
-    CHECK(!init_params.transparent);
-    SetBackgroundColor(cros_tokens::kCrosSysSystemBaseElevated);
-    layer()->SetFillsBoundsOpaquely(false);
-    layer()->SetBackgroundBlur(ColorProvider::kBackgroundBlurSigma);
-    layer()->SetBackdropFilterQuality(ColorProvider::kBackgroundBlurQuality);
+    const bool is_translucent =
+        init_params.translucent && chromeos::features::IsSystemBlurEnabled();
+
+    // A translucent TrayBubbleView initializes the widget with NOT_DRAWN_LAYER.
+    // Therefore the BubbleFrameView(NonClientFrameView) that provides the
+    // background will not be painted. Therefore TrayBubbleView should paint its
+    // own background.
+    SetBackground(views::CreateSolidBackground(
+        is_translucent ? cros_tokens::kCrosSysSystemBaseElevated
+                       : cros_tokens::kCrosSysSystemBaseElevatedOpaque));
+    layer()->SetFillsBoundsOpaquely(!is_translucent);
+    if (is_translucent) {
+      layer()->SetBackgroundBlur(ColorProvider::kBackgroundBlurSigma);
+      layer()->SetBackdropFilterQuality(ColorProvider::kBackgroundBlurQuality);
+    }
   }
 
   if (params_.has_shadow) {
@@ -544,13 +549,6 @@
   Shell::Get()->system_tray_notifier()->NotifyTrayBubbleBoundsChanged(this);
 }
 
-ui::LayerType TrayBubbleView::GetLayerType() const {
-  if (params_.translucent || params_.transparent) {
-    return ui::LAYER_NOT_DRAWN;
-  }
-  return ui::LAYER_TEXTURED;
-}
-
 std::unique_ptr<NonClientFrameView> TrayBubbleView::CreateNonClientFrameView(
     Widget* widget) {
   // Create the customized bubble border.
diff --git a/ash/system/tray/tray_bubble_view.h b/ash/system/tray/tray_bubble_view.h
index 0f5d7d1..facebba 100644
--- a/ash/system/tray/tray_bubble_view.h
+++ b/ash/system/tray/tray_bubble_view.h
@@ -236,7 +236,6 @@
   void OnWidgetActivationChanged(views::Widget* widget, bool active) override;
   void OnWidgetBoundsChanged(views::Widget* widget,
                              const gfx::Rect& bounds) override;
-  ui::LayerType GetLayerType() const override;
 
   // views::View:
   void AddedToWidget() override;
diff --git a/ash/test/view_drawn_waiter.cc b/ash/test/view_drawn_waiter.cc
index 6a5d4e38..febf915 100644
--- a/ash/test/view_drawn_waiter.cc
+++ b/ash/test/view_drawn_waiter.cc
@@ -40,11 +40,9 @@
 }
 
 void ViewDrawnWaiter::OnViewVisibilityChanged(views::View* view,
-                                              views::View* starting_view,
-                                              bool visible) {
-  if (IsDrawn(view)) {
+                                              views::View* starting_view) {
+  if (IsDrawn(view))
     wait_loop_->Quit();
-  }
 }
 
 void ViewDrawnWaiter::OnViewBoundsChanged(views::View* view) {
diff --git a/ash/test/view_drawn_waiter.h b/ash/test/view_drawn_waiter.h
index f9952e8..2f32c6b9 100644
--- a/ash/test/view_drawn_waiter.h
+++ b/ash/test/view_drawn_waiter.h
@@ -34,8 +34,7 @@
  private:
   // views::ViewObserver:
   void OnViewVisibilityChanged(views::View* view,
-                               views::View* starting_view,
-                               bool visible) override;
+                               views::View* starting_view) override;
   void OnViewBoundsChanged(views::View* view) override;
   void OnViewIsDeleting(views::View* view) override;
 
diff --git a/ash/touch/touch_selection_pixeltest.cc b/ash/touch/touch_selection_pixeltest.cc
index 8775ab5..2ab95b5 100644
--- a/ash/touch/touch_selection_pixeltest.cc
+++ b/ash/touch/touch_selection_pixeltest.cc
@@ -7,11 +7,13 @@
 #include "ash/test/ash_test_base.h"
 #include "ash/test/pixel/ash_pixel_differ.h"
 #include "ash/test/pixel/ash_pixel_test_init_params.h"
+#include "third_party/skia/include/core/SkColor.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/touch_selection/touch_selection_magnifier_aura.h"
 #include "ui/views/accessibility/view_accessibility.h"
+#include "ui/views/background.h"
 #include "ui/views/controls/textfield/textfield.h"
 #include "ui/views/controls/textfield/textfield_test_api.h"
 #include "ui/views/view.h"
@@ -47,6 +49,8 @@
     std::unique_ptr<views::Widget> widget = CreateFramelessTestWidget();
     widget->SetBounds(gfx::Rect(5, 5, 500, 500));
     widget->SetContentsView(std::make_unique<views::View>());
+    widget->GetContentsView()->SetBackground(
+        views::CreateSolidBackground(SK_ColorGREEN));
     widget->Show();
     return widget;
   }
@@ -77,7 +81,7 @@
 
   EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
       "touch_selection",
-      /*revision_number=*/3, widget.get()));
+      /*revision_number=*/4, widget.get()));
 }
 
 }  // namespace
diff --git a/ash/wm/desks/templates/saved_desk_animations.cc b/ash/wm/desks/templates/saved_desk_animations.cc
index 7b95fdd..3910282 100644
--- a/ash/wm/desks/templates/saved_desk_animations.cc
+++ b/ash/wm/desks/templates/saved_desk_animations.cc
@@ -4,6 +4,7 @@
 
 #include "ash/wm/desks/templates/saved_desk_animations.h"
 
+#include "base/functional/callback_helpers.h"
 #include "ui/aura/window_occlusion_tracker.h"
 #include "ui/compositor/layer.h"
 #include "ui/gfx/animation/tween.h"
diff --git a/ash/wm/layer_tree_synchronizer.cc b/ash/wm/layer_tree_synchronizer.cc
index b44c2e72..7c2581a 100644
--- a/ash/wm/layer_tree_synchronizer.cc
+++ b/ash/wm/layer_tree_synchronizer.cc
@@ -27,8 +27,6 @@
 
 using Corner = gfx::RRectF::Corner;
 
-constexpr float kEpsilon = std::numeric_limits<float>::epsilon();
-
 // The expected number of elements in the `original_layers_info_` map.
 // Currently, we expect a maximum of 8 layers to be modified when
 // synchronizing the rounded corners of a window with its transient children.
@@ -148,23 +146,16 @@
       return kNoIntersectingPoint;
     }
 
-    // Single intersection point. Circles are tangent to each other.
-    if (std::abs(d - r1 + r2) < kEpsilon) {  // d == 0
-      float x = (c1.x() + c2.x()) / 2;
-      float y = (c1.y() + c2.y()) / 2;
-      return {{gfx::PointF(x, y)}, /*infinite_points=*/false};
-    }
-
-    // Circles intersect at two points.
-    CHECK_GT(d, std::abs(r1 - r2));
-    CHECK_LT(d, r1 + r2);
-
     float a = (Square(r1) - Square(r2) + Square(d)) / (2 * Square(d));
     float h = std::sqrt(Square(r1) - Square(a)) / d;
 
     float p5_x = c1.x() + a * distance_vec.x();
     float p5_y = c1.y() + a * distance_vec.y();
 
+    if (h == 0) {  // Single intersection point
+      return {{gfx::PointF(p5_x, p5_y)}, /*infinite_points=*/false};
+    }
+
     float p3_x = p5_x - h * distance_vec.y();
     float p3_y = p5_y + h * distance_vec.x();
 
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 17963f8..f73ed42f 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -2080,6 +2080,8 @@
       "mac/mac_util.mm",
       "mac/os_crash_dumps.cc",
       "mac/os_crash_dumps.h",
+      "mac/pasteboard_changed_observation.h",
+      "mac/pasteboard_changed_observation.mm",
       "mac/process_requirement.cc",
       "mac/process_requirement.h",
       "mac/scoped_aedesc.h",
@@ -4038,6 +4040,7 @@
       "enterprise_util_mac_unittest.mm",
       "mac/launch_application_unittest.mm",
       "mac/mac_util_unittest.mm",
+      "mac/pasteboard_changed_observation_unittest.mm",
       "mac/process_requirement_unittest.cc",
       "mac/scoped_sending_event_unittest.mm",
       "message_loop/message_pump_apple_unittest.mm",
@@ -4441,7 +4444,7 @@
       "features.cc",
       "task/task_features.cc",
     ]
-    template = "android/java/src/org/chromium/base/BaseFeatures.java.tmpl"
+    class_name = "org.chromium.base.BaseFeatures"
   }
 
   android_library("base_switches_java") {
diff --git a/base/android/java/src/org/chromium/base/BaseFeatures.java.tmpl b/base/android/java/src/org/chromium/base/BaseFeatures.java.tmpl
deleted file mode 100644
index 4f53b4a..0000000
--- a/base/android/java/src/org/chromium/base/BaseFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base;
-
-/**
-* Constants for the names of //base Features.
-*/
-public final class BaseFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Prevents instantiation.
-    private BaseFeatures() {{}}
-}}
diff --git a/base/mac/pasteboard_changed_observation.h b/base/mac/pasteboard_changed_observation.h
new file mode 100644
index 0000000..bea89ba
--- /dev/null
+++ b/base/mac/pasteboard_changed_observation.h
@@ -0,0 +1,22 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_MAC_PASTEBOARD_CHANGED_OBSERVATION_H_
+#define BASE_MAC_PASTEBOARD_CHANGED_OBSERVATION_H_
+
+#include "base/base_export.h"
+#include "base/callback_list.h"
+#include "base/functional/callback_forward.h"
+
+namespace base {
+
+// Registers a callback that will be called whenever the
+// NSPasteboard.generalPasteboard has been changed by any process on the system
+// (including this one).
+BASE_EXPORT CallbackListSubscription
+RegisterPasteboardChangedCallback(RepeatingClosure callback);
+
+}  // namespace base
+
+#endif  // BASE_MAC_PASTEBOARD_CHANGED_OBSERVATION_H_
diff --git a/base/mac/pasteboard_changed_observation.mm b/base/mac/pasteboard_changed_observation.mm
new file mode 100644
index 0000000..04c0d35
--- /dev/null
+++ b/base/mac/pasteboard_changed_observation.mm
@@ -0,0 +1,114 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "base/mac/pasteboard_changed_observation.h"
+
+#include <AppKit/AppKit.h>
+#include <dispatch/dispatch.h>
+#include <objc/runtime.h>
+
+#include <string_view>
+
+#include "base/callback_list.h"
+#include "base/functional/callback.h"
+#include "base/no_destructor.h"
+#include "base/task/bind_post_task.h"
+#include "base/task/sequenced_task_runner.h"
+
+// There is no notification API on macOS for changes to the pasteboard (unlike
+// on iOS where there is UIPasteboardChangedNotification). However...
+//
+// Each app has a cache of pasteboard contents, and the pasteboard daemon keeps
+// track of those caches and which of them are stale. When a pasteboard copy
+// happens in one app, the daemon determines which apps have stale pasteboard
+// caches, and sends them an XPC message ("com.apple.pboard.invalidate-cache")
+// to clear their caches. (Breakpoint on __CFPasteboardHandleMessageFromDaemon
+// to see this in action.)
+//
+// This invalidation eventually trickles down to the cache class,
+// _CFPasteboardCache, whose -setChangeCount: method is called. If the
+// pasteboard is set within the app then the cache's change count is set to a
+// valid value, but if an invalidation message comes from the daemon, the change
+// count is set to -1, and the daemon will not send any further invalidation
+// messages for copies outside the app, as the cache is now not dirty.
+//
+// Therefore, intercept -setChangeCount: messages sent to _CFPasteboardCache.
+// After notifying all interested parties, access the NSPasteboard changeCount
+// property. This will mark the cache as being dirty again from the daemon's
+// perspective, and then the next pasteboard change from outside of the app will
+// result in another cache invalidation message. As long as the changeCount
+// continues to be accessed in response to the pasteboard daemon's request to
+// clean the cache, the cache will continue to be dirty and the app will
+// continue to be called back for pasteboard changes outside the app.
+//
+// Playing this invalidation game is a bit silly, but until an API is provided
+// to do this (requested in FB18125171), as the wise Rick Astley says, "we know
+// the game, and we're gonna play it."
+
+namespace base {
+
+namespace {
+
+RepeatingClosureList& GetCallbackList() {
+  static NoDestructor<RepeatingClosureList> callbacks;
+  return *callbacks;
+}
+
+bool SwizzleInternalClass() {
+  Class pasteboard_cache_class = objc_getClass("_CFPasteboardCache");
+  if (!pasteboard_cache_class) {
+    return false;
+  }
+
+  SEL selector = @selector(setChangeCount:);
+  Method method = class_getInstanceMethod(pasteboard_cache_class, selector);
+  if (!method) {
+    return false;
+  }
+
+  std::string_view type_encoding(method_getTypeEncoding(method));
+  if (type_encoding != "v20@0:8i16") {
+    return false;
+  }
+
+  using ImpFunctionType = void (*)(id, SEL, int);
+  static ImpFunctionType g_old_imp;
+
+  IMP new_imp =
+      imp_implementationWithBlock(^(id object_self, int change_count) {
+        GetCallbackList().Notify();
+
+        // Dirty the app's pasteboard cache to ensure an invalidation callback
+        // for the next pasteboard change that occurs in other apps. Hop to the
+        // main thread, as the cache is processed on an internal CFPasteboard
+        // dispatch queue.
+        dispatch_async(dispatch_get_main_queue(), ^{
+          std::ignore = NSPasteboard.generalPasteboard.changeCount;
+        });
+
+        g_old_imp(object_self, selector, change_count);
+      });
+
+  g_old_imp = reinterpret_cast<ImpFunctionType>(
+      method_setImplementation(method, new_imp));
+
+  return !!g_old_imp;
+}
+
+}  // namespace
+
+CallbackListSubscription RegisterPasteboardChangedCallback(
+    RepeatingClosure callback) {
+  static bool swizzle_internal_class [[maybe_unused]] = SwizzleInternalClass();
+  // Intentionally DCHECK so that in the field it doesn't rely on that specific
+  // internal class (as listening for pasteboard changes isn't critical), but
+  // that it's noisy and noticeable on the beta bots so that if these internals
+  // ever change it will be noticed.
+  DCHECK(swizzle_internal_class);
+
+  return GetCallbackList().Add(
+      base::BindPostTask(SequencedTaskRunner::GetCurrentDefault(), callback));
+}
+
+}  // namespace base
diff --git a/base/mac/pasteboard_changed_observation_unittest.mm b/base/mac/pasteboard_changed_observation_unittest.mm
new file mode 100644
index 0000000..56e0fd6
--- /dev/null
+++ b/base/mac/pasteboard_changed_observation_unittest.mm
@@ -0,0 +1,57 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "base/mac/pasteboard_changed_observation.h"
+
+#import <AppKit/AppKit.h>
+
+#include "base/location.h"
+#include "base/run_loop.h"
+#include "base/test/bind.h"
+#include "base/test/scoped_run_loop_timeout.h"
+#include "base/test/task_environment.h"
+#include "testing/platform_test.h"
+
+namespace base {
+namespace {
+
+using PasteboardChangedObservationTest = PlatformTest;
+
+TEST_F(PasteboardChangedObservationTest, TestTriggers) {
+  base::test::SingleThreadTaskEnvironment task_environment;
+  base::test::ScopedRunLoopTimeout timeout_{FROM_HERE, base::Seconds(2)};
+  RunLoop run_loop;
+
+  bool callback_called = false;
+  CallbackListSubscription subscription = RegisterPasteboardChangedCallback(
+      BindLambdaForTesting([&callback_called, &run_loop] {
+        callback_called = true;
+        run_loop.Quit();
+      }));
+
+  [NSPasteboard.generalPasteboard clearContents];
+  run_loop.Run();
+  EXPECT_TRUE(callback_called);
+}
+
+TEST_F(PasteboardChangedObservationTest, TestDoesntTrigger) {
+  base::test::SingleThreadTaskEnvironment task_environment;
+  base::test::ScopedRunLoopTimeout timeout_{FROM_HERE, base::Seconds(5)};
+  RunLoop run_loop;
+
+  int callbacks = 0;
+  CallbackListSubscription subscription = RegisterPasteboardChangedCallback(
+      BindLambdaForTesting([&callbacks] { ++callbacks; }));
+
+  SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&run_loop] { run_loop.Quit(); }),
+      base::Seconds(3));
+
+  run_loop.Run();
+  // Three is arbitrary, but expecting zero is asking for flakiness.
+  EXPECT_LE(callbacks, 3);
+}
+
+}  // namespace
+}  // namespace base
diff --git a/base/metrics/metrics_hashes.cc b/base/metrics/metrics_hashes.cc
index e0fef601..d4bd2b98f 100644
--- a/base/metrics/metrics_hashes.cc
+++ b/base/metrics/metrics_hashes.cc
@@ -6,29 +6,16 @@
 
 #include <string.h>
 
+#include <array>
 #include <string_view>
 
 #include "base/check_op.h"
 #include "base/containers/span.h"
-#include "base/hash/md5.h"
-#include "base/hash/sha1.h"
 #include "base/numerics/byte_conversions.h"
+#include "third_party/boringssl/src/include/openssl/md5.h"
+#include "third_party/boringssl/src/include/openssl/sha.h"
 
 namespace base {
-namespace {
-
-// Converts the 8-byte prefix of an MD5 hash into a uint64_t value.
-inline uint64_t DigestToUInt64(const MD5Digest& digest) {
-  return U64FromBigEndian(span(digest.a).first<8u>());
-}
-
-// Converts the 4-byte prefix of an MD5 hash into a uint32_t value.
-inline uint32_t DigestToUInt32(const MD5Digest& digest) {
-  return U32FromBigEndian(span(digest.a).first<4u>());
-}
-
-}  // namespace
-
 uint64_t HashMetricName(std::string_view name) {
   // Corresponding Python code for quick look up:
   //
@@ -36,15 +23,17 @@
   //   import hashlib
   //   struct.unpack('>Q', hashlib.md5(name.encode('utf-8')).digest()[:8])[0]
   //
-  MD5Digest digest;
-  MD5Sum(as_byte_span(name), &digest);
-  return DigestToUInt64(digest);
+  std::array<uint8_t, MD5_DIGEST_LENGTH> hash;
+  ::MD5(reinterpret_cast<const uint8_t*>(name.data()), name.size(),
+        hash.data());
+  return U64FromBigEndian(base::span(hash).first<8>());
 }
 
 uint32_t HashMetricNameAs32Bits(std::string_view name) {
-  MD5Digest digest;
-  MD5Sum(as_byte_span(name), &digest);
-  return DigestToUInt32(digest);
+  std::array<uint8_t, MD5_DIGEST_LENGTH> hash;
+  ::MD5(reinterpret_cast<const uint8_t*>(name.data()), name.size(),
+        hash.data());
+  return U32FromBigEndian(base::span(hash).first<4>());
 }
 
 uint32_t ParseMetricHashTo32Bits(uint64_t hash) {
@@ -54,8 +43,10 @@
 uint32_t HashFieldTrialName(std::string_view name) {
   // SHA-1 is designed to produce a uniformly random spread in its output space,
   // even for nearly-identical inputs.
-  SHA1Digest sha1_hash = SHA1Hash(as_byte_span(name));
-  return U32FromLittleEndian(span(sha1_hash).first<4u>());
+  std::array<uint8_t, SHA_DIGEST_LENGTH> hash;
+  ::SHA1(reinterpret_cast<const uint8_t*>(name.data()), name.size(),
+         hash.data());
+  return U32FromLittleEndian(base::span(hash).first<4>());
 }
 
 }  // namespace base
diff --git a/base/system/sys_info.h b/base/system/sys_info.h
index f7b9aaa4..3470b51 100644
--- a/base/system/sys_info.h
+++ b/base/system/sys_info.h
@@ -297,6 +297,11 @@
 
   // Returns the Android hardware EGL system property.
   static std::string GetAndroidHardwareEGL();
+
+  // Returns the Android hardware class system property. Unlike individual
+  // component Hardware ID, this is at a device level to capture a class of
+  // devices with similar hardware components.
+  static std::string GetAndroidHardwareClass();
 #endif  // BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_IOS)
diff --git a/base/system/sys_info_android.cc b/base/system/sys_info_android.cc
index d017ef36..3fa7529 100644
--- a/base/system/sys_info_android.cc
+++ b/base/system/sys_info_android.cc
@@ -126,6 +126,12 @@
   return std::string(os_hardware_egl_str);
 }
 
+std::string SysInfo::GetAndroidHardwareClass() {
+  char os_hardware_id_str[PROP_VALUE_MAX];
+  __system_property_get("ro.boot.product.hardware.id", os_hardware_id_str);
+  return std::string(os_hardware_id_str);
+}
+
 // static
 SysInfo::HardwareInfo SysInfo::GetHardwareInfoSync() {
   HardwareInfo info;
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/README.md b/base/test/android/javatests/src/org/chromium/base/test/transit/README.md
index 45ddbd5..cc193b7 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/README.md
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/README.md
@@ -358,8 +358,7 @@
     }
 
     public NewTabPageStation openNewTabFromButton() {
-        NewTabPageStation newTab = new NewTabPageStation();
-        return travelToSync(this, newTab, newTabButtonElement.getClickTrigger())
+        return newTabButtonElement.clickTo().arriveAt(new NewTabPageStation()))
     }
 }
 ```
@@ -480,22 +479,27 @@
 
 #### Transition APIs
 
-Transitions between `Stations` are done by calling `travelToSync()`.
+Transitions are triggered by methods that end in `To()`. Some common ones are
+`clickTo()`, `runTo()`, `pressBackTo()`. This doesn't execute the transition,
+but creates a `TripBuilder`. When `arriveAt()`, `enterFacility()`,
+`waitForConditions()` or other methods are called in the `TripBuilder`, the
+transition is executed.
 
-Transitions into and out of `Facilities` are done by calling
-`enterFacilitySync()`, `exitFacilitySync()` or `swapFacilitySync()`. If the app
-moves to another `Station`, any active `Facilities` have their exit conditions
-added to the transition conditions.
+Transitions between `Stations` are done by calling `arriveAt()`.
 
-Transitions into and out of `CarryOns` are done by calling `CarryOn#pickUp()`
-and `CarryOn#drop()`. `Condition#runAndWaitFor()` is a convenience shortcut for
-`CarryOn#pickUp()`.
+Transitions into and out of `Facilities` are done by calling `enterFacility()`,
+`enterFacilities()` `exitFacility()` or `exitFacilities()`. If the app moves to
+another `Station`, any active `Facilities` have their exit conditions added to
+the transition conditions.
 
-These methods takes as parameter a [`Trigger`], which is the code that should be
-run to actually make the app move to the next state. Often this will be a UI
-interaction like `() -> BUTTON_ELEMENT.perform(click())`.
+Transitions into and out of `CarryOns` are done by calling `pickUpCarryOn()` and
+`dropCarryOn()`.
 
-[`Trigger`]: https://source.chromium.org/search?q=symbol:org.chromium.base.test.transit.Transition.Trigger%5Cb&ss=chromium
+Conditions not tied to Conditional States can be checked with
+`waitForConditions()`.
+
+Multiple expectations can be chained by the methods ending with `And()`, e.g.
+`clickTo().waitForConditionsAnd(c1, c2).exitFacilityAnd(e).enterFacility(f)`.
 
 #### Enter, Exit and Transition Conditions {#transition-conditions}
 
@@ -504,7 +508,7 @@
 * The **enter Conditions** of a `ConditionalState` being entered.
 * The **exit Conditions** of a `ConditionalState` being exited unless the same
   Element is in a state being entered too.
-* Any extra **transition Conditions** specific to that transition.
+* Any extra **transition Conditions** added to the `TripBuilder`.
   * Most transitions don't need to add extra special Conditions.
 
 
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/Station.java b/base/test/android/javatests/src/org/chromium/base/test/transit/Station.java
index 308a6e0e..d5fbbd7 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/Station.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/Station.java
@@ -132,19 +132,6 @@
     }
 
     /**
-     * @deprecated Use {@link TripBuilder#arriveAt(Station, Facility[])} instead.
-     */
-    @Deprecated
-    public final <T extends Station<?>> T travelToSync(
-            T destination, TransitionOptions options, @Nullable Trigger trigger) {
-        destination.requireToBeInSameTask(this);
-        StationToStationTrip trip =
-                new StationToStationTrip(List.of(this), List.of(destination), options, trigger);
-        trip.transitionSync();
-        return destination;
-    }
-
-    /**
      * @deprecated Use {@link TripBuilder#enterFacility(Facility)} instead.
      */
     @Deprecated
@@ -300,19 +287,6 @@
         swap.transitionSync();
     }
 
-    /**
-     * Add a Facility which will be entered together with this Station. Both will become ACTIVE in
-     * the same Trip.
-     *
-     * @deprecated Use {@link TripBuilder#arriveAt(Station, Facility[])} instead.
-     */
-    @Deprecated
-    public <F extends Facility<?>> F addInitialFacility(F facility) {
-        assertInPhase(Phase.NEW);
-        registerFacility(facility);
-        return facility;
-    }
-
     /** Get the activity element associate with this station, if there's any. */
     public @Nullable ActivityElement<HostActivity> getActivityElement() {
         return mActivityElement;
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/Triggers.java b/base/test/android/javatests/src/org/chromium/base/test/transit/Triggers.java
index e7e6ec3..e86923c9 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/Triggers.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/Triggers.java
@@ -33,9 +33,7 @@
      * @return a {@link TripBuilder} to perform the Transition.
      */
     public static TripBuilder runOnUiThreadTo(Runnable runnable) {
-        return new TripBuilder()
-                .withRunnableTrigger(runnable)
-                .withOptions(Transition.runTriggerOnUiThreadOption());
+        return new TripBuilder().withRunnableTrigger(runnable).withRunOnUiThread();
     }
 
     /**
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/TripBuilder.java b/base/test/android/javatests/src/org/chromium/base/test/transit/TripBuilder.java
index 6833cc7..9ab0f6c 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/TripBuilder.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/TripBuilder.java
@@ -8,6 +8,7 @@
 
 import com.google.errorprone.annotations.CheckReturnValue;
 
+import org.chromium.base.test.transit.ConditionalState.Phase;
 import org.chromium.base.test.transit.Transition.TransitionOptions;
 import org.chromium.base.test.transit.Transition.Trigger;
 import org.chromium.build.annotations.Nullable;
@@ -35,6 +36,7 @@
     private @Nullable Facility<?> mContextFacility;
     private @Nullable CarryOn mContextCarryOn;
     private boolean mInNewTask;
+    private boolean mIsComplete;
 
     public TripBuilder() {}
 
@@ -89,11 +91,49 @@
      * override existing ones.
      */
     @CheckReturnValue
-    public TripBuilder withOptions(TransitionOptions options) {
+    private TripBuilder withOptions(TransitionOptions options) {
         mOptions = TransitionOptions.merge(/* primary= */ options, /* secondary= */ mOptions);
         return this;
     }
 
+    /** Retry the transition trigger once, if the transition does not finish within the timeout. */
+    @CheckReturnValue
+    public TripBuilder withRetry() {
+        return withOptions(Transition.retryOption());
+    }
+
+    /**
+     * Do not retry the transition.
+     *
+     * <p>Default behavior, this is intended to unset {@link #withRetry()}.
+     */
+    @CheckReturnValue
+    public TripBuilder withNoRetry() {
+        return withOptions(Transition.newOptions().withNoRetry().build());
+    }
+
+    /** Set a different |timeoutMs| than the default to adjust how long to poll Conditions. */
+    @CheckReturnValue
+    public TripBuilder withTimeout(long timeoutMs) {
+        return withOptions(Transition.timeoutOption(timeoutMs));
+    }
+
+    /**
+     * Inform all Conditions might already be all fulfilled before the running the Trigger.
+     *
+     * <p>No-op triggers have the same behavior.
+     */
+    @CheckReturnValue
+    public TripBuilder withPossiblyAlreadyFulfilled() {
+        return withOptions(Transition.possiblyAlreadyFulfilledOption());
+    }
+
+    /** Run the trigger on the UI thread instead of on the instrumentation thread. */
+    @CheckReturnValue
+    public TripBuilder withRunOnUiThread() {
+        return withOptions(Transition.runTriggerOnUiThreadOption());
+    }
+
     /**
      * Expect the destination Station to be in a new task, and do not assume the currently active
      * Station will be exited..
@@ -106,13 +146,14 @@
 
     /** Add a Transition |condition| that will be checked as part of the Transition. */
     @CheckReturnValue
-    public TripBuilder waitForConditionsAnd(Condition... conditions) {
+    public TripBuilder waitForAnd(Condition... conditions) {
         mConditions.addAll(Arrays.asList(conditions));
         return this;
     }
 
     @CheckReturnValue
     public TripBuilder pickUpCarryOnAnd(CarryOn carryOn) {
+        carryOn.assertInPhase(Phase.NEW);
         mCarryOnsToPickUp.add(carryOn);
         return this;
     }
@@ -121,12 +162,12 @@
     public TripBuilder dropCarryOnAnd() {
         assert mContextCarryOn != null
                 : "Context CarryOn not set, pass the not to drop as a parameter";
-        mCarryOnsToDrop.add(mContextCarryOn);
-        return this;
+        return dropCarryOnAnd(mContextCarryOn);
     }
 
     @CheckReturnValue
     public TripBuilder dropCarryOnAnd(CarryOn carryOn) {
+        carryOn.assertInPhase(Phase.ACTIVE);
         mCarryOnsToDrop.add(carryOn);
         return this;
     }
@@ -134,6 +175,7 @@
     /** Add a |facility| to enter as part of the Transition. */
     @CheckReturnValue
     public TripBuilder enterFacilityAnd(Facility<?> facility) {
+        facility.assertInPhase(Phase.NEW);
         mFacilitiesToEnter.add(facility);
         return this;
     }
@@ -152,13 +194,13 @@
     public TripBuilder exitFacilityAnd() {
         assert mContextFacility != null
                 : "Context Facility not set, pass the Facility to exit as a parameter";
-        mFacilitiesToExit.add(mContextFacility);
-        return this;
+        return exitFacilityAnd(mContextFacility);
     }
 
     /** Add |facility| to exit as part of the Transition. */
     @CheckReturnValue
     public TripBuilder exitFacilityAnd(Facility<?> facility) {
+        facility.assertInPhase(Phase.ACTIVE);
         mFacilitiesToExit.add(facility);
         return this;
     }
@@ -177,13 +219,14 @@
     public TripBuilder arriveAtAnd(Station<?> destination) {
         assert mDestinationStation == null
                 : "Destination already set to " + mDestinationStation.getName();
+        destination.assertInPhase(Phase.NEW);
         mDestinationStation = destination;
         return this;
     }
 
     /** Execute the transition synchronously, waiting for the given Conditions. */
-    public void waitForConditions(Condition... conditions) {
-        waitForConditionsAnd(conditions).complete();
+    public void waitFor(Condition... conditions) {
+        waitForAnd(conditions).complete();
     }
 
     public <CarryOnT extends CarryOn> CarryOnT pickUpCarryOn(CarryOnT carryOn) {
@@ -237,8 +280,8 @@
 
     /** Build and perform the Transition synchronously. */
     public void complete() {
+        assert !mIsComplete : "Transition already completed";
         assert mTrigger != null : "Trigger not set";
-
         assert !mInNewTask || mDestinationStation != null
                 : "A new Station needs to be entered in the new task";
 
@@ -259,21 +302,19 @@
             }
         }
 
-        // If entering a station and not in a new task, assume to be exiting an active Station too.
-        if (mDestinationStation != null && !mInNewTask) {
-            mOriginStation = mContextStation;
-        }
-
         if (mDestinationStation != null) {
-            for (Facility<?> facility : mFacilitiesToEnter) {
-                mDestinationStation.addInitialFacility(facility);
-            }
-
             if (mInNewTask) {
                 mDestinationStation.requireToBeInNewTask();
             } else {
+                // If entering a station and not in a new task, assume to be exiting an active
+                // Station too.
+                mOriginStation = mContextStation;
+                mOriginStation.assertInPhase(Phase.ACTIVE);
                 mDestinationStation.requireToBeInSameTask(mOriginStation);
             }
+            for (Facility<?> facility : mFacilitiesToEnter) {
+                mDestinationStation.registerFacility(facility);
+            }
         } else {
             // TODO(crbug.com/406325581): Support entering Facilities from multiple Stations in
             // multi-window.
@@ -282,6 +323,10 @@
             }
         }
 
+        if (mOriginStation != null) {
+            mFacilitiesToExit.addAll(mOriginStation.getFacilitiesWithPhase(Phase.ACTIVE));
+        }
+
         if (!mConditions.isEmpty()) {
             mOptions =
                     TransitionOptions.merge(
@@ -300,5 +345,7 @@
                         mOptions,
                         mTrigger);
         trip.transitionSync();
+
+        mIsComplete = true;
     }
 }
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/getting_started.md b/base/test/android/javatests/src/org/chromium/base/test/transit/getting_started.md
index 89b5687..017e8c6c 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/getting_started.md
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/getting_started.md
@@ -26,7 +26,6 @@
 [imports]
 
 @RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 @Batch(Batch.PER_CLASS)  // Batching is recommended for faster tests.
 public class MyPTTest {
     // Reuse the Activity between test cases when possible so the batched test
@@ -225,7 +224,8 @@
 
 ### Option 1: Reset State "Manually"
 
-In batched tests, the order of tests is arbitrary unless `@FixMethodOrder` is used. Additionally, either:
+In batched tests, the order of tests is arbitrary unless `@FixMethodOrder` is
+used. Additionally, either:
 
 1. Each test must leave the app in a state where the other tests can run or;
 2. Each test must reset the app to a state where it can run.
@@ -240,7 +240,9 @@
 -       TransitAsserts.assertFinalDestination(ntp);
 
 +       // Reset tab model for batching
-+       page = ntp.openTabSwitcherActionMenu().selectCloseTab(PageStation.class);
++       page = ntp
++               .openTabSwitcherActionMenu()
++               .selectCloseTabAndDisplayAnotherTab(WebPageStation.newBuilder());
 +       TransitAsserts.assertFinalDestination(page);
     }
 }
@@ -250,8 +252,8 @@
 
 Manually resetting in each test doesn't scale very well in many cases. There are
 some shortcuts for undoing state set during a test, and for tabs specifically,
-we are going to use `AutoResetCtaTransitTestRule`, which resets
-Chrome to a single blank page at the start of each test:
+we are going to use `AutoResetCtaTransitTestRule`, which resets Chrome to a
+single blank page at the start of each test:
 
 ```java
 public class MyPTTest {
@@ -339,13 +341,13 @@
 ```java
 public class PageStation extends Station {
 +   public TabSwitcherButtonFacility focusOnTabSwitcherButton() {
-+       return enterFacilitySync(new TabSwitcherButtonFacility(), /* trigger= */ null);
++       return noopTo().enterFacility(new TabSwitcherButtonFacility());
 +   }
 }
 ```
 
-The trigger is null since we expect no input to be necessary for the Conditions
-to be fulfilled; they should already be fulfilled.
+We use a no-op trigger since we expect no input to be necessary for the
+Conditions to be fulfilled; they should already be fulfilled.
 
 After calling the transition method `focusOnTabSwitcherButton()`, as soon as
 this View is fully displayed, the transition is completed and the active
@@ -410,7 +412,7 @@
 ```java
 public class PageStation extends Station {
 +   public TabSwitcherButtonFacility focusOnTabSwitcherButton(String expectedText) {
-+       return enterFacilitySync(new TabSwitcherButtonFacility(expectedText), /* trigger= */ null);
++       return noopTo().enterFacility(new TabSwitcherButtonFacility(expectedText));
 +   }
 }
 ```
@@ -446,13 +448,13 @@
 ```java
 public class TabSwitcherButtonFacility extends Facility<PageStation> {
 +   public HubTabSwitcherStation clickToOpenHub() {
-+       return mHostStation.travelToSync(
-+               new HubTabSwitcherStation(), buttonElement.getClickTrigger());
++       return buttonElement.clickTo().arriveAt(new HubTabSwitcherStation());
 +   }
 +
 +   public TabSwitcherActionMenuFacility longClickToOpenActionMenu() {
-+       return mHostStation.enterFacilitySync(
-+               new TabSwitcherActionMenuFacility(), buttonElement.getLongPressTrigger());
++       return buttonElement
++               .longPressTo()
++               .enterFacility(new TabSwitcherActionMenuFacility());
 +   }
 }
 ```
diff --git a/base/test/test_file_util.cc b/base/test/test_file_util.cc
index fe94b89..dd049f1 100644
--- a/base/test/test_file_util.cc
+++ b/base/test/test_file_util.cc
@@ -6,8 +6,10 @@
 
 #include <vector>
 
+#include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
+#include "base/logging.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/thread_restrictions.h"
@@ -53,6 +55,13 @@
     ScopedAllowBlockingForTesting allow_blocking;
     for (const FilePath& file_path : file_paths_to_delete_) {
       if (!DieFileDie(file_path, /*recurse=*/true)) {
+        base::FileEnumerator enumerator(
+            file_path, true,
+            base::FileEnumerator::FILES | FileEnumerator::DIRECTORIES);
+        for (base::FilePath failed_to_delete = enumerator.Next();
+             !failed_to_delete.empty(); failed_to_delete = enumerator.Next()) {
+          LOG(WARNING) << "failed to delete " << failed_to_delete;
+        }
         ADD_FAILURE() << "Failed to delete temporary directory for testing: "
                       << file_path;
       }
@@ -68,6 +77,21 @@
 // static
 PathDeleterOnTestEnd* PathDeleterOnTestEnd::instance_ = nullptr;
 
+FilePath RegisterPathDeleter(const FilePath& path) {
+  if (!PathDeleterOnTestEnd::GetInstance()) {
+    // Append() transfers ownership of the listener. This means
+    // PathDeleterOnTestEnd::GetInstance() will return non-null until all tests
+    // are run and the test suite destroyed.
+    testing::UnitTest::GetInstance()->listeners().Append(
+        new PathDeleterOnTestEnd());
+    DCHECK(PathDeleterOnTestEnd::GetInstance());
+  }
+
+  PathDeleterOnTestEnd::GetInstance()->DeletePathRecursivelyUponTestEnd(path);
+
+  return path;
+}
+
 }  // namespace
 
 bool EvictFileFromSystemCacheWithRetry(const FilePath& path) {
@@ -95,19 +119,17 @@
     ADD_FAILURE() << "Failed to create unique temporary directory for testing.";
     return FilePath();
   }
+  return RegisterPathDeleter(path);
+}
 
-  if (!PathDeleterOnTestEnd::GetInstance()) {
-    // Append() transfers ownership of the listener. This means
-    // PathDeleterOnTestEnd::GetInstance() will return non-null until all tests
-    // are run and the test suite destroyed.
-    testing::UnitTest::GetInstance()->listeners().Append(
-        new PathDeleterOnTestEnd());
-    DCHECK(PathDeleterOnTestEnd::GetInstance());
+FilePath CreateUniqueTempDirectoryScopedToTestInDir(const base::FilePath& dir) {
+  ScopedAllowBlockingForTesting allow_blocking;
+  FilePath path;
+  if (!CreateTemporaryDirInDir(dir, kDirPrefix, &path)) {
+    ADD_FAILURE() << "Failed to create unique temporary directory for testing.";
+    return FilePath();
   }
-
-  PathDeleterOnTestEnd::GetInstance()->DeletePathRecursivelyUponTestEnd(path);
-
-  return path;
+  return RegisterPathDeleter(path);
 }
 
 }  // namespace base
diff --git a/base/test/test_file_util.h b/base/test/test_file_util.h
index 5610146..5427929 100644
--- a/base/test/test_file_util.h
+++ b/base/test/test_file_util.h
@@ -44,6 +44,11 @@
 // upon creation or deletion will cause a test failure.
 FilePath CreateUniqueTempDirectoryScopedToTest();
 
+// Creates a new unique temporary directory in `dir` and returns the generated
+// path. The directory will be automatically deleted when the test completes.
+// Failure upon creation or deletion will cause a test failure.
+FilePath CreateUniqueTempDirectoryScopedToTestInDir(const base::FilePath& dir);
+
 // Synchronize all the dirty pages from the page cache to disk (on POSIX
 // systems). The Windows analogy for this operation is to 'Flush file buffers'.
 // Note: This is currently implemented as a no-op on Windows.
diff --git a/build/android/gyp/java_cpp_features.py b/build/android/gyp/java_cpp_features.py
index 93b61d3..3c1e585 100755
--- a/build/android/gyp/java_cpp_features.py
+++ b/build/android/gyp/java_cpp_features.py
@@ -35,28 +35,24 @@
     return java_cpp_utils.JavaString(name, value, comments)
 
 
-def _GenerateOutput(template, source_paths, template_path, features):
+def _GenerateOutput(template, source_paths, features):
   description_template = """
     // This following string constants were inserted by
     //     {SCRIPT_NAME}
     // From
     //     {SOURCE_PATHS}
-    // Into
-    //     {TEMPLATE_PATH}
 
 """
   values = {
       'SCRIPT_NAME': java_cpp_utils.GetScriptName(),
       'SOURCE_PATHS': ',\n    //     '.join(source_paths),
-      'TEMPLATE_PATH': template_path,
   }
   description = description_template.format(**values)
   native_features = '\n\n'.join(x.Format() for x in features)
 
-  values = {
-      'NATIVE_FEATURES': description + native_features,
-  }
-  return template.format(**values)
+  # TODO(agrieve): Remove {{ and }} from input templates.
+  template = template.replace('{{', '{').replace('}}', '}')
+  return template.replace('{NATIVE_FEATURES}', description + native_features)
 
 
 def _ParseFeatureFile(path):
@@ -66,44 +62,44 @@
   return feature_file_parser.Parse()
 
 
-def _Generate(source_paths, template_path):
-  with open(template_path, encoding='utf-8') as f:
-    lines = f.readlines()
-
-  template = ''.join(lines)
-  package, class_name = java_cpp_utils.ParseTemplateFile(lines)
+def _Generate(source_paths, template):
+  package, class_name = java_cpp_utils.ParseTemplateFile(template)
   output_path = java_cpp_utils.GetJavaFilePath(package, class_name)
 
   features = []
   for source_path in source_paths:
     features.extend(_ParseFeatureFile(source_path))
 
-  output = _GenerateOutput(template, source_paths, template_path, features)
+  output = _GenerateOutput(template, source_paths, features)
   return output, output_path
 
 
 def _Main(argv):
   parser = argparse.ArgumentParser()
-
   parser.add_argument('--srcjar',
                       required=True,
                       help='The path at which to generate the .srcjar file')
-
   parser.add_argument('--template',
-                      required=True,
                       help='The template file with which to generate the Java '
                       'class. Must have "{NATIVE_FEATURES}" somewhere in '
                       'the template.')
-
+  parser.add_argument('--class-name', help='FQN of Java class to generate')
   parser.add_argument('inputs',
                       nargs='+',
                       help='Input file(s)',
                       metavar='INPUTFILE')
   args = parser.parse_args(argv)
 
+  if args.template:
+    with open(args.template, encoding='utf-8') as f:
+      template = f.read()
+  else:
+    template = java_cpp_utils.CreateDefaultTemplate(args.class_name,
+                                                    '{NATIVE_FEATURES}')
+
   with action_helpers.atomic_output(args.srcjar) as f:
     with zipfile.ZipFile(f, 'w', zipfile.ZIP_STORED) as srcjar:
-      data, path = _Generate(args.inputs, args.template)
+      data, path = _Generate(args.inputs, template)
       zip_helpers.add_to_zip_hermetic(srcjar, path, data=data)
 
 
diff --git a/build/android/gyp/java_cpp_strings.py b/build/android/gyp/java_cpp_strings.py
index 74b256c..4a905ce3 100755
--- a/build/android/gyp/java_cpp_strings.py
+++ b/build/android/gyp/java_cpp_strings.py
@@ -31,28 +31,24 @@
     return java_cpp_utils.JavaString(name, value, comments)
 
 
-def _GenerateOutput(template, source_paths, template_path, strings):
+def _GenerateOutput(template, source_paths, strings):
   description_template = """
     // This following string constants were inserted by
     //     {SCRIPT_NAME}
     // From
     //     {SOURCE_PATHS}
-    // Into
-    //     {TEMPLATE_PATH}
 
 """
   values = {
       'SCRIPT_NAME': java_cpp_utils.GetScriptName(),
       'SOURCE_PATHS': ',\n    //     '.join(source_paths),
-      'TEMPLATE_PATH': template_path,
   }
   description = description_template.format(**values)
   native_strings = '\n\n'.join(x.Format() for x in strings)
 
-  values = {
-      'NATIVE_STRINGS': description + native_strings,
-  }
-  return template.format(**values)
+  # TODO(agrieve): Remove {{ and }} from input templates.
+  template = template.replace('{{', '{').replace('}}', '}')
+  return template.replace('{NATIVE_STRINGS}', description + native_strings)
 
 
 def _ParseStringFile(path):
@@ -62,41 +58,41 @@
   return string_file_parser.Parse()
 
 
-def _Generate(source_paths, template_path):
-  with open(template_path, encoding='utf-8') as f:
-    lines = f.readlines()
-
-  template = ''.join(lines)
-  package, class_name = java_cpp_utils.ParseTemplateFile(lines)
+def _Generate(source_paths, template):
+  package, class_name = java_cpp_utils.ParseTemplateFile(template)
   output_path = java_cpp_utils.GetJavaFilePath(package, class_name)
   strings = []
   for source_path in source_paths:
     strings.extend(_ParseStringFile(source_path))
 
-  output = _GenerateOutput(template, source_paths, template_path, strings)
+  output = _GenerateOutput(template, source_paths, strings)
   return output, output_path
 
 
 def _Main(argv):
   parser = argparse.ArgumentParser()
-
   parser.add_argument('--srcjar',
                       required=True,
                       help='The path at which to generate the .srcjar file')
-
   parser.add_argument('--template',
-                      required=True,
                       help='The template file with which to generate the Java '
                       'class. Must have "{NATIVE_STRINGS}" somewhere in '
                       'the template.')
-
+  parser.add_argument('--class-name', help='FQN of Java class to generate')
   parser.add_argument(
       'inputs', nargs='+', help='Input file(s)', metavar='INPUTFILE')
   args = parser.parse_args(argv)
 
+  if args.template:
+    with open(args.template, encoding='utf-8') as f:
+      template = f.read()
+  else:
+    template = java_cpp_utils.CreateDefaultTemplate(args.class_name,
+                                                    '{NATIVE_STRINGS}')
+
   with action_helpers.atomic_output(args.srcjar) as f:
     with zipfile.ZipFile(f, 'w', zipfile.ZIP_STORED) as srcjar:
-      data, path = _Generate(args.inputs, args.template)
+      data, path = _Generate(args.inputs, template)
       zip_helpers.add_to_zip_hermetic(srcjar, path, data=data)
 
 
diff --git a/build/android/gyp/java_cpp_strings_tests.py b/build/android/gyp/java_cpp_strings_tests.py
index 793b2c31..24e1a0b2 100755
--- a/build/android/gyp/java_cpp_strings_tests.py
+++ b/build/android/gyp/java_cpp_strings_tests.py
@@ -141,7 +141,7 @@
 {NATIVE_STRINGS}
 
 }}
-""".split('\n')
+"""
     package, class_name = java_cpp_utils.ParseTemplateFile(test_data)
     self.assertEqual('my.java.package', package)
     self.assertEqual('MyClass', class_name)
diff --git a/build/android/gyp/lint.py b/build/android/gyp/lint.py
index 48323613..8868e53 100755
--- a/build/android/gyp/lint.py
+++ b/build/android/gyp/lint.py
@@ -42,12 +42,14 @@
     "NetworkSecurityConfig",  # Breaks on library certificates b/269783280.
     "ObsoleteLintCustomCheck",  # We have no control over custom lint checks.
     "OldTargetApi",  # We sometimes need targetSdkVersion to not be latest.
+    "PrivateResource",  # Triggers on our own R.java files.
     "StringFormatCount",  # Has false-positives.
     "SwitchIntDef",  # Many C++ enums are not used at all in java.
     "Typos",  # Strings are committed in English first and later translated.
     "VisibleForTests",  # Does not recognize "ForTesting" methods.
     "UniqueConstants",  # Chromium enums allow aliases.
     "UnusedAttribute",  # Chromium apks have various minSdkVersion values.
+    "UnusedTranslation",  # Triggers from .aar files with extra translations.
 ]
 
 _RES_ZIP_DIR = 'RESZIPS'
@@ -68,8 +70,7 @@
                          classpath=None,
                          srcjar_sources=None,
                          resource_sources=None,
-                         custom_lint_jars=None,
-                         custom_annotation_zips=None,
+                         aars=None,
                          android_sdk_version=None,
                          baseline_path=None):
   project = ElementTree.Element('project')
@@ -117,14 +118,10 @@
     for resource_file in resource_sources:
       resource = ElementTree.SubElement(main_module, 'resource')
       resource.set('file', resource_file)
-  if custom_lint_jars:
-    for lint_jar in custom_lint_jars:
-      lint = ElementTree.SubElement(main_module, 'lint-checks')
-      lint.set('file', lint_jar)
-  if custom_annotation_zips:
-    for annotation_zip in custom_annotation_zips:
-      annotation = ElementTree.SubElement(main_module, 'annotations')
-      annotation.set('file', annotation_zip)
+  if aars:
+    for aar in aars:
+      lint = ElementTree.SubElement(main_module, 'aar')
+      lint.set('file', aar)
   return project
 
 
@@ -298,24 +295,6 @@
     resource_sources.extend(
         build_utils.ExtractAll(resource_zip, path=resource_dir))
 
-  logging.info('Extracting aars')
-  aar_root_dir = os.path.join(lint_gen_dir, _AAR_DIR)
-  shutil.rmtree(aar_root_dir, True)
-  custom_lint_jars = []
-  custom_annotation_zips = []
-  if aars:
-    for aar in aars:
-      # Use relative source for aar files since they are not generated.
-      aar_dir = os.path.join(aar_root_dir,
-                             os.path.splitext(_SrcRelative(aar))[0])
-      os.makedirs(aar_dir)
-      aar_files = build_utils.ExtractAll(aar, path=aar_dir)
-      for f in aar_files:
-        if f.endswith('lint.jar'):
-          custom_lint_jars.append(f)
-        elif f.endswith('annotations.zip'):
-          custom_annotation_zips.append(f)
-
   logging.info('Extracting srcjars')
   srcjar_root_dir = os.path.join(lint_gen_dir, _SRCJAR_DIR)
   shutil.rmtree(srcjar_root_dir, True)
@@ -332,10 +311,11 @@
       srcjar_sources.extend(build_utils.ExtractAll(srcjar, path=srcjar_dir))
 
   logging.info('Generating project file')
-  project_file_root = _GenerateProjectFile(
-      lint_android_manifest_path, android_sdk_root, cache_dir, partials_dir,
-      sources, classpath, srcjar_sources, resource_sources, custom_lint_jars,
-      custom_annotation_zips, android_sdk_version, baseline)
+  project_file_root = _GenerateProjectFile(lint_android_manifest_path,
+                                           android_sdk_root, cache_dir,
+                                           partials_dir, sources, classpath,
+                                           srcjar_sources, resource_sources,
+                                           aars, android_sdk_version, baseline)
 
   project_xml_path = os.path.join(lint_gen_dir, 'project.xml')
   _WriteXmlFile(project_file_root, project_xml_path)
@@ -391,7 +371,6 @@
     end = time.time() - start
     logging.info('Lint command took %ss', end)
     if not is_debug:
-      shutil.rmtree(aar_root_dir, ignore_errors=True)
       shutil.rmtree(resource_root_dir, ignore_errors=True)
       shutil.rmtree(srcjar_root_dir, ignore_errors=True)
       if os.path.exists(project_xml_path):
diff --git a/build/android/gyp/util/java_cpp_utils.py b/build/android/gyp/util/java_cpp_utils.py
index ec92e95..3f0334e 100644
--- a/build/android/gyp/util/java_cpp_utils.py
+++ b/build/android/gyp/util/java_cpp_utils.py
@@ -7,8 +7,26 @@
 import sys
 
 
+def CreateDefaultTemplate(java_class, placeholder):
+  assert '.' in java_class, 'Wanted fully-qualified name. Found ' + java_class
+  package, _, class_name = java_class.rpartition('.')
+
+  script_name = GetScriptName()
+  return f"""\
+// Generated by {script_name}
+
+package {package};
+
+public final class {class_name} {{
+    private {class_name}() {{}}
+
+{placeholder}
+}}
+"""
+
+
 def GetScriptName():
-  return os.path.basename(os.path.abspath(sys.argv[0]))
+  return os.path.basename(sys.argv[0])
 
 
 def GetJavaFilePath(java_package, class_name):
@@ -49,22 +67,13 @@
         self.comments, self.name, self.value)
 
 
-def ParseTemplateFile(lines):
-  package_re = re.compile(r'^package (.*);')
-  class_re = re.compile(r'.*class (.*) {')
-  package = ''
-  class_name = ''
-  for line in lines:
-    package_line = package_re.match(line)
-    if package_line:
-      package = package_line.groups()[0]
-    class_line = class_re.match(line)
-    if class_line:
-      class_name = class_line.groups()[0]
-      break
-  if not package:
-    raise Exception('Could not find java package.')
-  return package, class_name
+def ParseTemplateFile(data):
+  if m := re.search(r'^package (.*);[\s\S]+\bclass (\w+) {',
+                    data,
+                    flags=re.MULTILINE):
+    package, class_name = m.groups()
+    return package, class_name
+  raise Exception('Could not find java package.')
 
 
 # TODO(crbug.com/40616187): Work will be needed if we want to annotate specific
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 9a8b9a3d..6b0c5f3 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -240,7 +240,8 @@
   #     sources = [
   #       "src/foo_switches.cc",
   #     ]
-  #     template = "src/templates/FooSwitches.java.tmpl
+  #     class_name = "org.chromium.chrome.FooStrings"
+  #     # Or a custom template via: template = "FooSwitches.java.tmpl"
   #   }
   #
   # foo_switches.cc:
@@ -278,20 +279,26 @@
       # The sources aren't compiled so don't check their dependencies.
       check_includes = false
       script = "//build/android/gyp/java_cpp_strings.py"
-
-      _srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
-      _rebased_srcjar_path = rebase_path(_srcjar_path, root_build_dir)
-      _rebased_sources = rebase_path(invoker.sources, root_build_dir)
-      _rebased_template = rebase_path(invoker.template, root_build_dir)
+      outputs = [ "${target_gen_dir}/${target_name}.srcjar" ]
 
       args = [
-        "--srcjar=$_rebased_srcjar_path",
-        "--template=$_rebased_template",
+        "--srcjar",
+        rebase_path(outputs[0], root_build_dir),
       ]
-      args += _rebased_sources
-      sources += [ invoker.template ]
-
-      outputs = [ _srcjar_path ]
+      if (defined(invoker.template)) {
+        assert(!defined(invoker.class_name))
+        sources += [ invoker.template ]
+        args += [
+          "--template",
+          rebase_path(invoker.template, root_build_dir),
+        ]
+      } else {
+        args += [
+          "--class-name",
+          invoker.class_name,
+        ]
+      }
+      args += rebase_path(invoker.sources, root_build_dir)
     }
   }
 
@@ -312,7 +319,8 @@
   #     sources = [
   #       "src/foo_features.cc",
   #     ]
-  #     template = "src/templates/FooFeatures.java.tmpl
+  #     class_name = "org.chromium.chrome.FooFeatures"
+  #     # Or a custom template via: template = "FooSwitches.java.tmpl"
   #   }
   #
   # foo_features.cc:
@@ -351,20 +359,26 @@
       # The sources aren't compiled so don't check their dependencies.
       check_includes = false
       script = "//build/android/gyp/java_cpp_features.py"
-
-      _srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
-      _rebased_srcjar_path = rebase_path(_srcjar_path, root_build_dir)
-      _rebased_sources = rebase_path(invoker.sources, root_build_dir)
-      _rebased_template = rebase_path(invoker.template, root_build_dir)
+      outputs = [ "${target_gen_dir}/${target_name}.srcjar" ]
 
       args = [
-        "--srcjar=$_rebased_srcjar_path",
-        "--template=$_rebased_template",
+        "--srcjar",
+        rebase_path(outputs[0], root_build_dir),
       ]
-      args += _rebased_sources
-      sources += [ invoker.template ]
-
-      outputs = [ _srcjar_path ]
+      if (defined(invoker.template)) {
+        assert(!defined(invoker.class_name))
+        sources += [ invoker.template ]
+        args += [
+          "--template",
+          rebase_path(invoker.template, root_build_dir),
+        ]
+      } else {
+        args += [
+          "--class-name",
+          invoker.class_name,
+        ]
+      }
+      args += rebase_path(invoker.sources, root_build_dir)
     }
   }
 
diff --git a/cc/base/BUILD.gn b/cc/base/BUILD.gn
index 295b8d3..eab4479 100644
--- a/cc/base/BUILD.gn
+++ b/cc/base/BUILD.gn
@@ -69,14 +69,14 @@
     # External code should depend on ":cc_base_java" instead.
     visibility = [ ":*" ]
     sources = [ "switches.cc" ]
-    template = "android/java/src/org/chromium/cc/base/CcSwitches.java.tmpl"
+    class_name = "org.chromium.cc.base.CcSwitches"
   }
 
   java_cpp_features("java_features_srcjar") {
     # External code should depend on ":cc_base_java" instead.
     visibility = [ ":*" ]
     sources = [ "features.cc" ]
-    template = "android/java/src/org/chromium/cc/base/CcFeatures.java.tmpl"
+    class_name = "org.chromium.cc.base.CcFeatures"
   }
 
   android_library("cc_base_java") {
diff --git a/cc/base/android/java/src/org/chromium/cc/base/CcFeatures.java.tmpl b/cc/base/android/java/src/org/chromium/cc/base/CcFeatures.java.tmpl
deleted file mode 100644
index 893b35c..0000000
--- a/cc/base/android/java/src/org/chromium/cc/base/CcFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.cc.base;
-
-/**
- * Contains all of the command line switches that are specific to the cc/ layer.
- */
-public final class CcFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Prevent instantiation.
-    private CcFeatures() {{}}
-}}
diff --git a/cc/base/android/java/src/org/chromium/cc/base/CcSwitches.java.tmpl b/cc/base/android/java/src/org/chromium/cc/base/CcSwitches.java.tmpl
deleted file mode 100644
index 67d41bcf..0000000
--- a/cc/base/android/java/src/org/chromium/cc/base/CcSwitches.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.cc.base;
-
-/**
- * Contains all of the command line switches that are specific to the cc/ layer.
- */
-public final class CcSwitches {{
-
-{NATIVE_STRINGS}
-
-    // Prevent instantiation.
-    private CcSwitches() {{}}
-}}
diff --git a/cc/input/android/java/src/org/chromium/cc/input/BrowserControlsOffsetTags.java b/cc/input/android/java/src/org/chromium/cc/input/BrowserControlsOffsetTags.java
index 2e68bc0..88ed0e74 100644
--- a/cc/input/android/java/src/org/chromium/cc/input/BrowserControlsOffsetTags.java
+++ b/cc/input/android/java/src/org/chromium/cc/input/BrowserControlsOffsetTags.java
@@ -11,6 +11,8 @@
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 
+import java.util.Objects;
+
 /** Java counterpart to the native cc::BrowserControlsOffsetTags. */
 @DoNotMock("This is a simple value object.")
 @NullMarked
@@ -60,4 +62,12 @@
     public @Nullable OffsetTag getTopControlsOffsetTag() {
         return mTopControlsOffsetTag;
     }
+
+    @Override
+    public boolean equals(@Nullable Object other) {
+        return other instanceof BrowserControlsOffsetTags that
+                && Objects.equals(mTopControlsOffsetTag, that.getTopControlsOffsetTag())
+                && Objects.equals(mContentOffsetTag, that.getContentOffsetTag())
+                && Objects.equals(mBottomControlsOffsetTag, that.getBottomControlsOffsetTag());
+    }
 }
diff --git a/cc/input/scroll_snap_data.h b/cc/input/scroll_snap_data.h
index 2ccabe05..908ffb2 100644
--- a/cc/input/scroll_snap_data.h
+++ b/cc/input/scroll_snap_data.h
@@ -6,7 +6,6 @@
 #define CC_INPUT_SCROLL_SNAP_DATA_H_
 
 #include <optional>
-#include <set>
 #include <utility>
 #include <vector>
 
@@ -14,7 +13,6 @@
 #include "cc/cc_export.h"
 #include "cc/paint/element_id.h"
 #include "ui/gfx/geometry/rect_f.h"
-#include "ui/gfx/geometry/vector2d_f.h"
 #include "ui/gfx/range/range_f.h"
 
 namespace cc {
diff --git a/cc/layers/picture_layer_impl.h b/cc/layers/picture_layer_impl.h
index 99df822..8d423cf 100644
--- a/cc/layers/picture_layer_impl.h
+++ b/cc/layers/picture_layer_impl.h
@@ -202,6 +202,9 @@
   using TileUpdateSet = std::map<float, std::set<TileIndex>>;
   TileUpdateSet TakeUpdatedTiles();
 
+  bool IsDirectlyCompositedImage() const;
+  bool nearest_neighbor() const { return nearest_neighbor_; }
+
  protected:
   friend class RasterizeAndRecordBenchmarkImpl;
 
@@ -242,7 +245,6 @@
       const PaintWorkletRecordMap* pending_paint_worklet_records,
       const DiscardableImageMap* pending_discardable_image_map);
 
-  bool IsDirectlyCompositedImage() const;
   void UpdateDirectlyCompositedImageFromRasterSource();
 
   void SanityCheckTilingState() const;
diff --git a/cc/layers/tile_display_layer_impl.cc b/cc/layers/tile_display_layer_impl.cc
index f9bb106..02f4ff7a 100644
--- a/cc/layers/tile_display_layer_impl.cc
+++ b/cc/layers/tile_display_layer_impl.cc
@@ -210,6 +210,32 @@
       render_pass->CreateAndAppendSharedQuadState();
   PopulateScaledSharedQuadState(shared_quad_state, max_contents_scale,
                                 contents_opaque());
+
+  if (is_directly_composited_image_) {
+    // Directly composited images should be clipped to the layer's content rect.
+    // When a PictureLayerTiling is created for a directly composited image, the
+    // layer bounds are multiplied by the raster scale in order to compute the
+    // tile size. If the aspect ratio of the layer doesn't match that of the
+    // image, it's possible that one of the dimensions of the resulting size
+    // (layer bounds * raster scale) is a fractional number, as raster scale
+    // does not scale x and y independently.
+    // When this happens, the ToEnclosingRect() operation in
+    // |PictureLayerTiling::EnclosingContentsRectFromLayer()| will
+    // create a tiling that, when scaled by |max_contents_scale| above, is
+    // larger than the layer bounds by a fraction of a pixel.
+    gfx::Rect bounds_in_target_space = MathUtil::MapEnclosingClippedRect(
+        draw_properties().target_space_transform, gfx::Rect(bounds()));
+    if (is_clipped()) {
+      bounds_in_target_space.Intersect(draw_properties().clip_rect);
+    }
+
+    if (shared_quad_state->clip_rect) {
+      bounds_in_target_space.Intersect(*shared_quad_state->clip_rect);
+    }
+
+    shared_quad_state->clip_rect = bounds_in_target_space;
+  }
+
   const Occlusion scaled_occlusion =
       draw_properties()
           .occlusion_in_content_space.GetOcclusionWithGivenDrawTransform(
@@ -273,8 +299,7 @@
         auto* quad = render_pass->CreateAndAppendDrawQuad<viz::TileDrawQuad>();
         quad->SetNew(shared_quad_state, offset_geometry_rect,
                      offset_visible_geometry_rect, needs_blending,
-                     resource->resource_id, texture_rect,
-                     /*nearest_neighbor=*/false,
+                     resource->resource_id, texture_rect, nearest_neighbor_,
                      !layer_tree_impl()->settings().enable_edge_anti_aliasing);
         has_draw_quad = true;
       } else if (auto color = iter->solid_color()) {
diff --git a/cc/layers/tile_display_layer_impl.h b/cc/layers/tile_display_layer_impl.h
index a112ced..b06723c3 100644
--- a/cc/layers/tile_display_layer_impl.h
+++ b/cc/layers/tile_display_layer_impl.h
@@ -145,6 +145,16 @@
   void SetIsBackdropFilterMask(bool is_backdrop_filter_mask) {
     is_backdrop_filter_mask_ = is_backdrop_filter_mask;
   }
+  void SetIsDirectlyCompositedImage(bool is_directly_composited_image) {
+    is_directly_composited_image_ = is_directly_composited_image;
+  }
+  void SetNearestNeighbor(bool nearest_neighbor) {
+    nearest_neighbor_ = nearest_neighbor;
+  }
+  bool is_directly_composited_image() const {
+    return is_directly_composited_image_;
+  }
+  bool nearest_neighbor() const { return nearest_neighbor_; }
 
   // LayerImpl overrides:
   mojom::LayerType GetLayerType() const override;
@@ -176,6 +186,8 @@
  private:
   std::optional<SkColor4f> solid_color_;
   bool is_backdrop_filter_mask_ = false;
+  bool is_directly_composited_image_ = false;
+  bool nearest_neighbor_ = false;
 
   // Denotes an area that is damaged and needs redraw. This is in the layer's
   // space.
diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
index 31cd4da..5db904ff 100644
--- a/cc/metrics/compositor_frame_reporter.cc
+++ b/cc/metrics/compositor_frame_reporter.cc
@@ -890,7 +890,6 @@
 
   global_trackers_.frame_sorter->AddFrameInfoToBuffer(frame_info);
   if (global_trackers_.frame_sorter->first_contentful_paint_received()) {
-    // Delegates call to DFC->OnEndFrame.
     global_trackers_.frame_sorter->AddFrameResult(args_, frame_info);
   }
 }
diff --git a/cc/metrics/frame_sequence_tracker_unittest.cc b/cc/metrics/frame_sequence_tracker_unittest.cc
index 9f942166..1fc82b9 100644
--- a/cc/metrics/frame_sequence_tracker_unittest.cc
+++ b/cc/metrics/frame_sequence_tracker_unittest.cc
@@ -331,7 +331,7 @@
   FrameSorterMock sorter_;
   FrameSequenceTrackerCollection collection_;
   // Since CFRC destructor cleans up the FrameSorter's
-  // registered observers (in this case, DFC and FSTC)
+  // registered observers (in this case FSTC)
   // it needs to be declared last so that it will be
   // cleaned up first.
   std::unique_ptr<CompositorFrameReportingController>
diff --git a/cc/mojo_embedder/viz_layer_context.cc b/cc/mojo_embedder/viz_layer_context.cc
index a6fa58e..249a4b05 100644
--- a/cc/mojo_embedder/viz_layer_context.cc
+++ b/cc/mojo_embedder/viz_layer_context.cc
@@ -914,6 +914,9 @@
       }
       tile_display_extra->is_backdrop_filter_mask =
           picture_layer.is_backdrop_filter_mask();
+      tile_display_extra->is_directly_composited_image =
+          picture_layer.IsDirectlyCompositedImage();
+      tile_display_extra->nearest_neighbor = picture_layer.nearest_neighbor();
       wire.layer_extra = viz::mojom::LayerExtra::NewTileDisplayLayerExtra(
           std::move(tile_display_extra));
       SerializePictureLayerTileUpdates(picture_layer, resource_provider,
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
index d7fdd05..7c12e9c0 100644
--- a/cc/scheduler/scheduler_unittest.cc
+++ b/cc/scheduler/scheduler_unittest.cc
@@ -620,7 +620,7 @@
   FrameSequenceTrackerCollection tracker_collection_;
   FrameSorter frame_sorter;
   // Since CFRC destructor cleans up the FrameSorter's
-  // registered observers (in this case, DFC and FSTC)
+  // registered observers (in this case FSTC)
   // it needs to be declared last so that it will be
   // cleaned up first.
   std::unique_ptr<CompositorFrameReportingController> reporting_controller;
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 0aeaaa9e..c354608 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -486,11 +486,13 @@
       "//chrome/browser/single_tab/android:java",
       "//chrome/browser/ssl/android:java",
       "//chrome/browser/supervised_user:supervised_user_service_platform_delegate_java",
+      "//chrome/browser/supervised_user:supervised_user_service_bridge_java",
       "//chrome/browser/supervised_user:website_parent_approval_java",
       "//chrome/browser/sync/android:java",
       "//chrome/browser/sync/android:ui_java",
       "//chrome/browser/tab:java",
       "//chrome/browser/tab_group_suggestion:java",
+      "//chrome/browser/tab_group_suggestion:toolbar_java",
       "//chrome/browser/tab_group_sync:factory_java",
       "//chrome/browser/tab_group_sync:features_java",
       "//chrome/browser/tab_group_sync:java",
diff --git a/chrome/android/expectations/lint-suppressions.xml b/chrome/android/expectations/lint-suppressions.xml
index 5bfea8bf..daa8235 100644
--- a/chrome/android/expectations/lint-suppressions.xml
+++ b/chrome/android/expectations/lint-suppressions.xml
@@ -19,6 +19,14 @@
       <!-- TODO(crbug.com/40559214): Update to androidx ExifInterface. -->
       <ignore regexp="components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/BitmapUtils.java"/>
   </issue>
+  <!-- Linter is incorrectly treating existing APIs that are being deprecated
+    using a flag as if they were newly introduced, and also treating some APIs
+    that were released in SDK35/36 as still requiring a flag.
+    Until this is fixed we just disable the FlaggedApi lint for upstream code
+    which isn't likely to reference any genuinely flagged APIs anyway since
+    flagged APIs are not present in the public SDK jar.
+    See: b/404752927, b/425396018 -->
+  <issue id="FlaggedApi" severity="ignore"/>
   <issue id="IconDensities">
     <!-- Originals are gone, so ignore these specific ones: crbug.com/457918 -->
     <ignore regexp="btn_bg_holo_active_normal.png, btn_bg_holo_active_pressed.png, btn_bg_holo_pressed.png"/>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContextMenuCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContextMenuCoordinator.java
index e47e8288..e408939 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContextMenuCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContextMenuCoordinator.java
@@ -20,6 +20,7 @@
 import org.chromium.chrome.browser.bookmarks.BookmarkModel;
 import org.chromium.chrome.browser.bookmarks.TabBookmarker;
 import org.chromium.chrome.browser.collaboration.CollaborationServiceFactory;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.share.ShareDelegate;
 import org.chromium.chrome.browser.share.ShareUtils;
@@ -253,6 +254,13 @@
                 BrowserUiListMenuUtils.buildMenuListItem(
                         R.string.select_tab, R.id.select_tabs, R.drawable.ic_edit_24dp));
 
+        // TODO(crbug.com/425953251): Add tests once callback is established.
+        if (shouldBuildPinTabMenuItem()) {
+            itemList.add(
+                    BrowserUiListMenuUtils.buildMenuListItem(
+                            R.string.pin_tab, R.id.pin_tab, R.drawable.ic_keep_24dp));
+        }
+
         itemList.add(
                 BrowserUiListMenuUtils.buildMenuListItem(
                         R.string.close_tab, R.id.close_tab, R.drawable.material_ic_close_24dp));
@@ -282,4 +290,8 @@
     private static void recordUserActionWithPrefix(String action) {
         RecordUserAction.record(MENU_USER_ACTION_PREFIX + action);
     }
+
+    private static boolean shouldBuildPinTabMenuItem() {
+        return ChromeFeatureList.sAndroidPinnedTabs.isEnabled();
+    }
 }
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
index ed8e90dc2..36c7aed 100644
--- a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
+++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
@@ -1029,6 +1029,9 @@
           =1 {Move tab to new window}
           other {Move tab to another window}}
       </message>
+      <message name="IDS_PIN_TAB" desc="Content description for an action which pins a singular tab.">
+        Pin tab
+      </message>
 
       <!-- Tab Group List Bottom Sheet -->
       <message name="IDS_TAB_GROUP_LIST_BOTTOM_SHEET_TITLE" desc="Title text for a bottom sheet which is used to add a tab to a tab group.">
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_PIN_TAB.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_PIN_TAB.png.sha1
new file mode 100644
index 0000000..10ba69e
--- /dev/null
+++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_PIN_TAB.png.sha1
@@ -0,0 +1 @@
+2ae840cbff2eb48458e0c08fa24a8910b6825e04
\ No newline at end of file
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index 05951a6f..cb98aad6 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -228,6 +228,7 @@
     <dimen name="custom_tabs_toolbar_button_spacer_16">16dp</dimen>
     <dimen name="custom_tabs_toolbar_button_spacer_8">8dp</dimen>
     <dimen name="custom_tabs_adaptive_button_fg_padding_start">18dp</dimen>
+    <dimen name="custom_tabs_adaptive_button_bg_height">36dp</dimen>
     <dimen name="custom_tabs_adaptive_button_bg_padding_start">12dp</dimen>
     <dimen name="custom_tabs_adaptive_button_bg_padding_end">0dp</dimen>
     <dimen name="custom_tabs_adaptive_button_bg_padding_vert">10dp</dimen>
diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/values/ids.xml
index 5b98898..186aa0d 100644
--- a/chrome/android/java/res/values/ids.xml
+++ b/chrome/android/java/res/values/ids.xml
@@ -173,6 +173,8 @@
     <item type="id" name="close_all_tabs_menu_id" />
     <item type="id" name="close_all_incognito_tabs_menu_id" />
     <item type="id" name="menu_select_tabs" />
+    <item type="id" name="menu_item_content_filter_divider_line_id" />
+    <item type="id" name="menu_item_content_filter_help_center_id" />
 
     <!-- Custom Tabs -->
     <item type="id" name="view_id_tag_key" />
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index 966670a..fd2e8c3bb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -295,6 +295,7 @@
 import org.chromium.components.omnibox.OmniboxFeatures;
 import org.chromium.components.profile_metrics.BrowserProfileType;
 import org.chromium.components.signin.metrics.SigninAccessPoint;
+import org.chromium.components.supervised_user.SupervisedUserConstants;
 import org.chromium.components.tab_group_sync.SavedTabGroup;
 import org.chromium.components.tab_group_sync.TabGroupSyncService;
 import org.chromium.components.user_prefs.UserPrefs;
@@ -3519,6 +3520,11 @@
             NtpCustomizationMetricsUtils.recordOpenBottomSheetEntry(
                     NtpCustomizationCoordinator.EntryPointType.MAIN_MENU);
             RecordUserAction.record("MobileMenuNtpCustomization");
+        } else if (id == R.id.menu_item_content_filter_help_center_id) {
+            currentTab.loadUrl(
+                    new LoadUrlParams(
+                            SupervisedUserConstants.DEVICE_FILTERS_HELP_CENTER_URL,
+                            PageTransition.AUTO_TOPLEVEL));
         } else {
             return super.onMenuOrKeyboardAction(id, fromMenu, triggeringMotion);
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java
index f474e0eb..33af776 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java
@@ -472,33 +472,6 @@
     }
 
     /**
-     * Called when a tab get selected. Typically when a tab get closed and the new current tab get
-     * selected.
-     * @param time      The current time of the app in ms.
-     * @param tabId     The id of the selected tab.
-     * @param prevId    The id of the previously selected tab.
-     * @param incognito Whether or not the affected model was incognito.
-     */
-    public void onTabSelected(long time, int tabId, int prevId, boolean incognito) {}
-
-    /**
-     * Called when a tab is being closed. When called, the closing tab will not
-     * be part of the model.
-     * @param time      The current time of the app in ms.
-     * @param tabId     The id of the tab being closed.
-     * @param nextTabId The id if the tab that is being switched to.
-     * @param incognito Whether or not the affected model was incognito.
-     */
-    public void onTabClosed(long time, int tabId, int nextTabId, boolean incognito) {}
-
-    /**
-     * Called when all the tabs in the current stack will be closed.
-     * When called, the tabs will still be part of the model.
-     * @param incognito True if this is the incognito tab model.
-     */
-    public void onTabsAllClosing(boolean incognito) {}
-
-    /**
      * Called before a tab is created from the top left button.
      *
      * @param sourceTabId The id of the source tab.
@@ -529,28 +502,6 @@
             float originY) {}
 
     /**
-     * Called when a tab is restored (created FROM_RESTORE).
-     * @param time  The current time of the app in ms.
-     * @param tabId The id of the restored tab.
-     */
-    public void onTabRestored(long time, int tabId) {}
-
-    /**
-     * Called when the current tabModel switched (e.g. standard -> incognito).
-     *
-     * @param incognito True if the new model is incognito.
-     */
-    public void onTabModelSwitched(boolean incognito) {}
-
-    /**
-     * Called when a tab is finally closed if the action was previously undoable.
-     * @param time      The current time of the app in ms.
-     * @param id        The id of the Tab.
-     * @param incognito True if the tab is incognito
-     */
-    public void onTabClosureCommitted(long time, int id, boolean incognito) {}
-
-    /**
      * Steps the animation forward and updates all the animated values.
      * @param time      The current time of the app in ms.
      * @param jumpToEnd Whether to finish the animation.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
index 433bf2e..e5254dce 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
@@ -305,11 +305,11 @@
     }
 
     @Override
-    public void onTabsAllClosing(boolean incognito) {
+    public void tabsAllClosing(boolean incognito) {
         if (getActiveLayout() == mStaticLayout && !incognito && !XrUtils.isXrDevice()) {
             showLayout(LayoutType.TAB_SWITCHER, /* animate= */ false);
         }
-        super.onTabsAllClosing(incognito);
+        super.tabsAllClosing(incognito);
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java
index dd0c66f..060aaa2d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java
@@ -149,7 +149,6 @@
             // overview mode when the animation is finished.
             if (getActiveLayoutType() == LayoutType.SIMPLE_ANIMATION) {
                 setNextLayout(getLayoutForType(LayoutType.TAB_SWITCHER), true);
-                getActiveLayout().onTabClosed(time(), id, nextId, incognito);
             } else {
                 super.tabClosed(id, nextId, incognito, tabRemoved);
             }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java
index dcb3375..ae5ddb3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerImpl.java
@@ -202,8 +202,6 @@
         public void didSelectTab(Tab tab, @TabSelectionType int type, int lastId) {
             if (type == TabSelectionType.FROM_OMNIBOX) {
                 switchToTab(tab, lastId);
-            } else if (tab.getId() != lastId) {
-                tabSelected(tab.getId(), lastId, tab.isIncognito());
             }
         }
 
@@ -231,9 +229,7 @@
                 @TabCreationState int creationState,
                 boolean markedForSelection) {
             int tabId = tab.getId();
-            if (launchType == TabLaunchType.FROM_RESTORE) {
-                getActiveLayout().onTabRestored(time(), tabId);
-            } else {
+            if (launchType == TabLaunchType.FROM_RESTORE) return;
                 boolean incognito = tab.isIncognito();
                 boolean willBeSelected =
                         (launchType != TabLaunchType.FROM_LONGPRESS_BACKGROUND
@@ -261,12 +257,11 @@
                         willBeSelected,
                         lastTapX,
                         lastTapY);
-            }
         }
 
         @Override
         public void willCloseAllTabs(boolean isIncognito) {
-            onTabsAllClosing(isIncognito);
+            tabsAllClosing(isIncognito);
         }
 
         @Override
@@ -902,14 +897,6 @@
         return new LayoutManagerChrome.LayoutManagerTabModelObserver();
     }
 
-    @VisibleForTesting
-    public void tabSelected(int tabId, int prevId, boolean incognito) {
-        // Update the model here so we properly set the right selected TabModel.
-        if (getActiveLayout() != null) {
-            getActiveLayout().onTabSelected(time(), tabId, prevId, incognito);
-        }
-    }
-
     /**
      * Should be called when a tab creating event is triggered (called before the tab is done being
      * created).
@@ -954,15 +941,14 @@
 
     /**
      * Should be called when a tab closed event is triggered.
-     * @param id         The id of the closed tab.
-     * @param nextId     The id of the next tab that will be visible, if any.
-     * @param incognito  Whether or not the closed tab is incognito.
+     *
+     * @param id The id of the closed tab.
+     * @param nextId The id of the next tab that will be visible, if any.
+     * @param incognito Whether or not the closed tab is incognito.
      * @param tabRemoved Whether the tab was removed from the model (e.g. for reparenting), rather
-     *                   than closed and destroyed.
+     *     than closed and destroyed.
      */
-    protected void tabClosed(int id, int nextId, boolean incognito, boolean tabRemoved) {
-        if (getActiveLayout() != null) getActiveLayout().onTabClosed(time(), id, nextId, incognito);
-    }
+    protected void tabClosed(int id, int nextId, boolean incognito, boolean tabRemoved) {}
 
     private void tabClosed(int tabId, boolean incognito, boolean tabRemoved) {
         Tab currentTab =
@@ -973,28 +959,25 @@
 
     /**
      * Called when a tab closure has been committed and all tab cleanup should happen.
-     * @param id        The id of the closed tab.
+     *
+     * @param id The id of the closed tab.
      * @param incognito Whether or not the closed tab is incognito.
      */
-    protected void tabClosureCommitted(int id, boolean incognito) {
-        if (getActiveLayout() != null) {
-            getActiveLayout().onTabClosureCommitted(time(), id, incognito);
-        }
-    }
+    protected void tabClosureCommitted(int id, boolean incognito) {}
 
     /**
      * Called when the selected tab model has switched.
+     *
      * @param incognito Whether or not the new current tab model is incognito.
      */
-    protected void tabModelSwitched(boolean incognito) {
-        if (getActiveLayout() != null) getActiveLayout().onTabModelSwitched(incognito);
-    }
+    protected void tabModelSwitched(boolean incognito) {}
 
-    public void onTabsAllClosing(boolean incognito) {
-        if (getActiveLayout() == null) return;
-
-        getActiveLayout().onTabsAllClosing(incognito);
-    }
+    /**
+     * Called when all tabs in a tab model start closing.
+     *
+     * @param incognito Whether or not the tabs are incognito.
+     */
+    protected void tabsAllClosing(boolean incognito) {}
 
     protected Supplier<TopUiThemeColorProvider> getTopUiThemeColorProvider() {
         return mTopUiThemeColorProvider;
@@ -1428,9 +1411,7 @@
      * @param tab The tab that will be switched to.
      * @param lastTabId The id of the tab that was switched from.
      */
-    protected void switchToTab(Tab tab, int lastTabId) {
-        tabSelected(tab.getId(), lastTabId, tab.isIncognito());
-    }
+    protected void switchToTab(Tab tab, int lastTabId) {}
 
     // LayoutStateProvider implementation.
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/ButtonVisibilityRule.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/ButtonVisibilityRule.java
index a0d0eb09..0a8c979 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/ButtonVisibilityRule.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/ButtonVisibilityRule.java
@@ -52,6 +52,10 @@
     // device rotation or the window width adjustment in multi-window mode.
     private int mToolbarWidth;
 
+    // Adjust minimum Title/URL bar width to have the optional button hidden/visible.
+    // Used for Q/A testing, enabled only through feature flag.
+    private boolean mHidingOptionalButton;
+
     static class Button {
         private final View mView;
         // Type of the button. Valid for CUSTOM_1 or CUSTOM_2 only; the rest of the buttons always
@@ -110,6 +114,7 @@
      * @param width The updated width of the toolbar.
      */
     public void setToolbarWidth(int width) {
+        if (mHidingOptionalButton) return;
         int oldWidth = mToolbarWidth;
         mToolbarWidth = width;
         if (width == 0 || oldWidth == width) return;
@@ -307,4 +312,14 @@
         }
         return true;
     }
+
+    public void setHidingOptionalButton() {
+        Button button = mButtons.get(ButtonId.MTB);
+        if (button == null || (!button.mVisible && button.mSuppressed)) return;
+
+        // Set the toolbar width smaller than url bar and all the button widths combined.
+        int buttonsWidth = mToolbarWidth - getUrlBarWidth();
+        setToolbarWidth(mMinUrlWidthPx + (buttonsWidth - button.mView.getLayoutParams().width / 2));
+        mHidingOptionalButton = true;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
index f2213cb..4d79daec4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
@@ -22,6 +22,7 @@
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.GradientDrawable;
+import android.graphics.drawable.LayerDrawable;
 import android.os.Handler;
 import android.os.Looper;
 import android.text.SpannableString;
@@ -1568,6 +1569,14 @@
                 firstButton.setPaddingRelative(
                         paddingStart, /* top= */ 0, /* end= */ 0, /* bottom= */ 0);
             }
+            if (ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean(
+                    ChromeFeatureList.CCT_ADAPTIVE_BUTTON_TEST_SWITCH, "always-animate", false)) {
+                mOptionalButtonCoordinator.setAlwaysShowActionChip(true);
+            }
+            if (ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean(
+                    ChromeFeatureList.CCT_ADAPTIVE_BUTTON_TEST_SWITCH, "hide-button", false)) {
+                mButtonVisibilityRule.setHidingOptionalButton();
+            }
             return true;
         }
 
@@ -1598,6 +1607,23 @@
                 mTrackerSupplier.set(TrackerFactory.getTrackerForProfile(tab.getProfile()));
             }
             mOptionalButtonCoordinator.updateButton(buttonData, isIncognitoBranded());
+            setOptionalButtonBackgroundInset();
+        }
+
+        // Modify the inset of the optional background drawable to match that of the icon secondary
+        // background.
+        private void setOptionalButtonBackgroundInset() {
+            View optionalButton = findViewById(R.id.optional_toolbar_button);
+            LayerDrawable backgroundDrawable = (LayerDrawable) optionalButton.getBackground();
+            int height = getDimensionPixelSize(R.dimen.custom_tabs_adaptive_button_bg_height);
+            int left = getDimensionPixelSize(R.dimen.custom_tabs_adaptive_button_bg_padding_start);
+            int right = getDimensionPixelSize(R.dimen.custom_tabs_adaptive_button_bg_padding_end);
+            backgroundDrawable.setLayerHeight(/* index= */ 0, height);
+            backgroundDrawable.setLayerInset(/* index= */ 0, left, /* t= */ 0, right, /* b= */ 0);
+        }
+
+        private int getDimensionPixelSize(@DimenRes int dimenId) {
+            return getResources().getDimensionPixelSize(dimenId);
         }
 
         // Display a (blue) dot on the overflow menu icon for the optional button that cannot be
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUserInitiatedTaskManager.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUserInitiatedTaskManager.java
index b77f2e8..3ced64d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUserInitiatedTaskManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUserInitiatedTaskManager.java
@@ -35,14 +35,16 @@
     @IntDef({
         NotificationAttachEvent.ATTACHED_ON_JOB_START,
         NotificationAttachEvent.ATTACHED_AFTER_JOB_START,
-        NotificationAttachEvent.NEVER_ATTACHED_BEFORE_JOB_COMPLETE
+        NotificationAttachEvent.NEVER_ATTACHED_BEFORE_JOB_COMPLETE,
+        NotificationAttachEvent.RESUMPTION_JOB_STARTED,
     })
     public @interface NotificationAttachEvent {
         int ATTACHED_ON_JOB_START = 0;
         int ATTACHED_AFTER_JOB_START = 1;
         int NEVER_ATTACHED_BEFORE_JOB_COMPLETE = 2;
+        int RESUMPTION_JOB_STARTED = 3;
 
-        int COUNT = 3;
+        int COUNT = 4;
     }
 
     /**
@@ -164,7 +166,7 @@
         mPinnedNotificationId = notificationId;
     }
 
-    private static void recordNotificationAttachEevent(@NotificationAttachEvent int event) {
+    public static void recordNotificationAttachEevent(@NotificationAttachEvent int event) {
         RecordHistogram.recordEnumeratedHistogram(
                 "Download.Android.NotificationAttachEvent", event, NotificationAttachEvent.COUNT);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/service/DownloadBackgroundTask.java b/chrome/android/java/src/org/chromium/chrome/browser/download/service/DownloadBackgroundTask.java
index e7caeaf..d3c5bdf9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/service/DownloadBackgroundTask.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/service/DownloadBackgroundTask.java
@@ -14,6 +14,7 @@
 import org.chromium.base.Callback;
 import org.chromium.chrome.browser.download.DownloadManagerService;
 import org.chromium.chrome.browser.download.DownloadNotificationService;
+import org.chromium.chrome.browser.download.DownloadUserInitiatedTaskManager;
 import org.chromium.chrome.browser.download.DownloadUtils;
 import org.chromium.chrome.browser.download.items.OfflineContentAggregatorNotificationBridgeUiFactory;
 import org.chromium.chrome.browser.profiles.ProfileKey;
@@ -65,6 +66,9 @@
             ensureNotificationBridgeInitialized();
             DownloadNotificationService.getInstance()
                     .setBackgroundTaskNotificationCallback(taskParameters.getTaskId(), callback);
+            DownloadUserInitiatedTaskManager.recordNotificationAttachEevent(
+                    DownloadUserInitiatedTaskManager.NotificationAttachEvent
+                            .RESUMPTION_JOB_STARTED);
         }
         DownloadBackgroundTaskJni.get()
                 .startBackgroundTask(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
index d79cc59..0d8ca31 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
@@ -6,6 +6,8 @@
 
 import static androidx.annotation.VisibleForTesting.PRIVATE;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.animation.Animator;
 import android.animation.ValueAnimator;
 import android.app.Activity;
@@ -18,7 +20,6 @@
 
 import androidx.annotation.CallSuper;
 import androidx.annotation.ColorInt;
-import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.Fragment;
@@ -30,6 +31,10 @@
 import org.chromium.base.BuildInfo;
 import org.chromium.base.Promise;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.MonotonicNonNull;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
@@ -73,6 +78,7 @@
  *
  * The activity might be run more than once, e.g. 1) for ToS and sign-in, and 2) for intro.
  */
+@NullMarked
 public class FirstRunActivity extends FirstRunActivityBase implements FirstRunPageDelegate {
 
     /**
@@ -176,7 +182,7 @@
 
     private final BitSet mFreProgressStepsRecorded = new BitSet(MobileFreProgress.MAX);
 
-    @Nullable private static FirstRunActivityObserver sObserver;
+    private static @Nullable FirstRunActivityObserver sObserver;
 
     private static boolean sIsAnimationDisabled;
 
@@ -187,11 +193,11 @@
     private boolean mPostNativeAndPolicyPagesCreated;
 
     /** Use {@link Promise#isFulfilled()} to verify whether the native has been initialized. */
-    private final Promise<Void> mNativeInitializationPromise = new Promise<>();
+    private final Promise<@Nullable Void> mNativeInitializationPromise = new Promise<>();
 
     private FirstRunFlowSequencer mFirstRunFlowSequencer;
 
-    private Bundle mFreProperties;
+    private @MonotonicNonNull Bundle mFreProperties;
 
     /**
      * Whether the first run activity was launched as a result of the user launching Chrome from the
@@ -213,7 +219,7 @@
     private FirstRunPageTransformer mPageTransformer;
     private ViewPager2 mPager;
 
-    private ValueAnimator mAnimator;
+    private @Nullable ValueAnimator mAnimator;
 
     /** The pager adapter, which provides the pages to the view pager widget. */
     private FirstRunPagerAdapter mPagerAdapter;
@@ -252,6 +258,7 @@
         // FullscreenSigninMediator#handleContinueWithNative} rather than relying on SigninChecker.
         SigninCheckerProvider.get(getProfileProviderSupplier().get().getOriginalProfile());
 
+        assumeNonNull(mFreProperties);
         mFirstRunFlowSequencer.updateFirstRunProperties(mFreProperties);
 
         BooleanSupplier showSearchEnginePromo =
@@ -331,7 +338,7 @@
     }
 
     @Override
-    protected Bundle transformSavedInstanceStateForOnCreate(Bundle savedInstanceState) {
+    protected @Nullable Bundle transformSavedInstanceStateForOnCreate(Bundle savedInstanceState) {
         // We pass null to Activity.onCreate() so that it doesn't automatically restore
         // the FragmentManager state - as that may cause fragments to be loaded that have
         // dependencies on native before native has been loaded (and then crash). Instead,
@@ -362,6 +369,7 @@
     }
 
     @Override
+    @Initializer
     public void triggerLayoutInflation() {
         super.triggerLayoutInflation();
 
@@ -476,7 +484,7 @@
         // Debounce page changes while animation is in flight.
         if (mAnimator != null) return false;
 
-        mFirstRunFlowSequencer.updateFirstRunProperties(mFreProperties);
+        mFirstRunFlowSequencer.updateFirstRunProperties(assumeNonNull(mFreProperties));
 
         int position = mPager.getCurrentItem() + 1;
         while (position < mPagerAdapter.getItemCount() && !mPages.get(position).shouldShow()) {
@@ -510,7 +518,7 @@
     }
 
     @Override
-    public void onRestoreInstanceState(Bundle state) {
+    public void onRestoreInstanceState(@Nullable Bundle state) {
         // Don't automatically restore state here. This is a counterpart to the override
         // of transformSavedInstanceStateForOnCreate() as the two need to be consistent.
         // The default implementation of this would restore the state of the views, which
@@ -549,7 +557,7 @@
             return BackPressResult.SUCCESS;
         }
 
-        mFirstRunFlowSequencer.updateFirstRunProperties(mFreProperties);
+        mFirstRunFlowSequencer.updateFirstRunProperties(assumeNonNull(mFreProperties));
 
         int position = mPager.getCurrentItem() - 1;
         while (position > 0 && !mPages.get(position).shouldShow()) {
@@ -582,11 +590,6 @@
 
     // FirstRunPageDelegate:
     @Override
-    public Bundle getProperties() {
-        return mFreProperties;
-    }
-
-    @Override
     public boolean advanceToNextPage() {
         return advanceToNextPageInternal(true);
     }
@@ -826,11 +829,11 @@
     }
 
     @Override
-    public Promise<Void> getNativeInitializationPromise() {
+    public Promise<@Nullable Void> getNativeInitializationPromise() {
         return mNativeInitializationPromise;
     }
 
-    public FirstRunFragment getCurrentFragmentForTesting() {
+    public @Nullable FirstRunFragment getCurrentFragmentForTesting() {
         return mPagerAdapter.getFirstRunFragment(mPager.getCurrentItem());
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivityBase.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivityBase.java
index 0822c2c..741bf23 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivityBase.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivityBase.java
@@ -13,6 +13,7 @@
 
 import org.chromium.base.IntentUtils;
 import org.chromium.base.Log;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.customtabs.CustomTabsConnection;
 import org.chromium.chrome.browser.metrics.SimpleStartupForegroundSessionDetector;
 import org.chromium.chrome.browser.metrics.UmaUtils;
@@ -21,6 +22,7 @@
 import org.chromium.components.browser_ui.widget.gesture.BackPressHandler;
 
 /** Base class for First Run Experience. */
+@NullMarked
 public abstract class FirstRunActivityBase extends FullscreenSigninAndHistorySyncActivityBase
         implements BackPressHandler {
     private static final String TAG = "FirstRunActivity";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
index 86406e9..0d3e0874 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.firstrun;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
@@ -20,6 +22,8 @@
 import org.chromium.base.TimeUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.supplier.OneshotSupplier;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.LaunchIntentDispatcher;
 import org.chromium.chrome.browser.customtabs.AuthTabIntentDataProvider;
@@ -38,6 +42,7 @@
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.identitymanager.ConsentLevel;
+import org.chromium.components.signin.identitymanager.IdentityManager;
 
 /**
  * A helper to determine what should be the sequence of First Run Experience screens, and whether it
@@ -46,6 +51,7 @@
  * <p>Usage: new FirstRunFlowSequencer(activity, launcherProvidedProperties) { override
  * onFlowIsKnown }.start();
  */
+@NullMarked
 public abstract class FirstRunFlowSequencer {
     private static final String TAG = "firstrun";
 
@@ -73,9 +79,10 @@
                 return false;
             }
             // Show the page only to signed-in users.
-            return IdentityServicesProvider.get()
-                    .getIdentityManager(profile)
-                    .hasPrimaryAccount(ConsentLevel.SIGNIN);
+            IdentityManager identityManager =
+                    IdentityServicesProvider.get().getIdentityManager(profile);
+            assumeNonNull(identityManager);
+            return identityManager.hasPrimaryAccount(ConsentLevel.SIGNIN);
         }
 
         /** @return true if the Search Engine promo page should be shown. */
@@ -102,11 +109,11 @@
     private final FirstRunFlowSequencerDelegate mDelegate;
 
     /** If not null, creates {@code mDelegate} for this object during tests. */
-    private static DelegateFactoryForTesting sDelegateFactoryForTesting;
+    private static @Nullable DelegateFactoryForTesting sDelegateFactoryForTesting;
 
     private boolean mIsFlowKnown;
     private boolean mAccountsAvailable;
-    private Boolean mIsChild;
+    private @Nullable Boolean mIsChild;
 
     /**
      * Callback that is called once the flow is determined. If the properties is null, the First Run
@@ -155,7 +162,7 @@
     }
 
     private boolean shouldShowHistorySyncOptIn() {
-        return mDelegate.shouldShowHistorySyncOptIn(mIsChild);
+        return mDelegate.shouldShowHistorySyncOptIn(assumeNonNull(mIsChild));
     }
 
     private void setChildAccountStatus(boolean isChild) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunPageDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunPageDelegate.java
index de4680aa..5359381 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunPageDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunPageDelegate.java
@@ -4,8 +4,6 @@
 
 package org.chromium.chrome.browser.firstrun;
 
-import android.os.Bundle;
-
 import org.chromium.base.Promise;
 import org.chromium.base.supplier.OneshotSupplier;
 import org.chromium.build.annotations.NullMarked;
@@ -17,12 +15,10 @@
 /** Defines the host interface for First Run Experience pages. */
 @NullMarked
 public interface FirstRunPageDelegate {
-    /** Returns FRE properties bundle. */
-    Bundle getProperties();
-
     /**
-     * Advances the First Run Experience to the next page.
-     * Successfully finishes FRE if the current page is the last page.
+     * Advances the First Run Experience to the next page. Successfully finishes FRE if the current
+     * page is the last page.
+     *
      * @return Whether advancing to the next page succeeded.
      */
     boolean advanceToNextPage();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java
index 5085017..9922d78 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java
@@ -7,6 +7,7 @@
 import android.app.Activity;
 
 import org.chromium.base.shared_preferences.SharedPreferencesManager;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.ChromeSharedPreferences;
 import org.chromium.chrome.browser.settings.SettingsNavigationFactory;
@@ -14,10 +15,12 @@
 import org.chromium.components.browser_ui.settings.SettingsNavigation;
 
 /** A helper to delay opening sync settings for an FRE advanced sync setup. */
+@NullMarked
 public final class FirstRunSignInProcessor {
     /**
      * If scheduleOpeningSettings() was previously called, this will open sync settings so the user
      * can complete their advanced sync setup.
+     *
      * @param activity The context for the FRE parameters processor.
      */
     public static void openSyncSettingsIfScheduled(Activity activity) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FreIntentCreator.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FreIntentCreator.java
index 6f8a3a22..46af77f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FreIntentCreator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FreIntentCreator.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.firstrun;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.Activity;
 import android.app.PendingIntent;
 import android.content.Context;
@@ -12,10 +14,10 @@
 import android.os.SystemClock;
 import android.text.TextUtils;
 
-import androidx.annotation.Nullable;
-
 import org.chromium.base.ApplicationStatus;
 import org.chromium.base.IntentUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.LaunchIntentDispatcher;
 import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider;
@@ -27,6 +29,7 @@
  * This class makes a decision what FRE type to launch and creates a corresponding intent. Should be
  * instantiated using {@link AppHooks#createFreIntentCreator}.
  */
+@NullMarked
 public class FreIntentCreator {
     /**
      * Creates an intent to launch the First Run Experience.
@@ -42,8 +45,7 @@
             Intent fromIntent,
             boolean preferLightweightFre,
             boolean usePendingIntent) {
-        @Nullable
-        BrowserServicesIntentDataProvider webApkIntentDataProvider =
+        @Nullable BrowserServicesIntentDataProvider webApkIntentDataProvider =
                 WebappLauncherActivity.maybeSlowlyGenerateWebApkIntentDataProviderFromIntent(
                         fromIntent);
 
@@ -51,7 +53,7 @@
         Intent intentToLaunchAfterFreComplete = fromIntent;
         if (webApkIntentDataProvider != null
                 && webApkIntentDataProvider.getWebApkExtras() != null) {
-            WebappExtras webappExtras = webApkIntentDataProvider.getWebappExtras();
+            WebappExtras webappExtras = assumeNonNull(webApkIntentDataProvider.getWebappExtras());
             associatedAppName = webappExtras.shortName;
 
             WebApkExtras webApkExtras = webApkIntentDataProvider.getWebApkExtras();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/LightweightFirstRunActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/LightweightFirstRunActivity.java
index d088166..9d91686aa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/LightweightFirstRunActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/LightweightFirstRunActivity.java
@@ -13,7 +13,6 @@
 import android.widget.Button;
 import android.widget.TextView;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 import androidx.annotation.VisibleForTesting;
 
@@ -21,6 +20,9 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.TimeUtils;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.chrome.browser.enterprise.util.EnterpriseInfo;
@@ -32,6 +34,7 @@
 import org.chromium.ui.widget.LoadingView;
 
 /** Lightweight FirstRunActivity. It shows ToS dialog only. */
+@NullMarked
 public class LightweightFirstRunActivity extends FirstRunActivityBase
         implements LoadingView.Observer {
     // TODO(crbug.com/40156897) Clean this boolean when releasing this feature, and remove
@@ -40,7 +43,6 @@
 
     private @Nullable SkipTosDialogPolicyListener mSkipTosDialogPolicyListener;
 
-    private FirstRunFlowSequencer mFirstRunFlowSequencer;
     private TextView mTosAndPrivacyTextView;
     private Button mOkButton;
     private LoadingView mLoadingView;
@@ -51,8 +53,8 @@
     private boolean mNativeInitialized;
     private boolean mTriggerAcceptAfterNativeInit;
 
-    private Handler mHandler;
-    private Runnable mExitFreRunnable;
+    private @Nullable Handler mHandler;
+    private @Nullable Runnable mExitFreRunnable;
 
     public static final String EXTRA_ASSOCIATED_APP_NAME =
             "org.chromium.chrome.browser.firstrun.AssociatedAppName";
@@ -76,7 +78,7 @@
 
         setFinishOnTouchOutside(true);
 
-        mFirstRunFlowSequencer =
+        FirstRunFlowSequencer firstRunFlowSequencer =
                 new FirstRunFlowSequencer(
                         getProfileProviderSupplier(), getChildAccountStatusSupplier()) {
                     @Override
@@ -84,11 +86,12 @@
                         initializeViews(isChild);
                     }
                 };
-        mFirstRunFlowSequencer.start();
+        firstRunFlowSequencer.start();
         onInitialLayoutInflationComplete();
     }
 
     /** Called once it is known whether the device has a child account. */
+    @Initializer
     private void initializeViews(boolean hasChildAccount) {
         setContentView(
                 LayoutInflater.from(LightweightFirstRunActivity.this)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
index 46823de..70f630aca 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
@@ -451,10 +451,10 @@
     }
 
     /**
-     * Allows subclasses to override the instance state passed to super.onCreate().
-     * The original instance state will still be available via getSavedInstanceState().
+     * Allows subclasses to override the instance state passed to super.onCreate(). The original
+     * instance state will still be available via getSavedInstanceState().
      */
-    protected Bundle transformSavedInstanceStateForOnCreate(Bundle savedInstanceState) {
+    protected @Nullable Bundle transformSavedInstanceStateForOnCreate(Bundle savedInstanceState) {
         return savedInstanceState;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java
index c64d4292..303fb44 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java
@@ -216,7 +216,10 @@
                     // Close the source instance window, if needed.
                     closeChromeWindowIfEmpty(mInstanceId);
                 },
-                getInstanceInfo());
+                getInstanceInfo(),
+                UiUtils.isInstanceSwitcherV2Enabled()
+                        ? R.string.menu_move_tab_to_other_window
+                        : R.string.menu_move_to_other_window);
     }
 
     @Override
@@ -236,7 +239,10 @@
                     // Close the source instance window, if needed.
                     closeChromeWindowIfEmpty(mInstanceId);
                 },
-                getInstanceInfo());
+                getInstanceInfo(),
+                UiUtils.isInstanceSwitcherV2Enabled()
+                        ? R.string.menu_move_group_to_other_window
+                        : R.string.menu_move_to_other_window);
     }
 
     @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
index d02de50..f130cdbe 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
@@ -49,6 +49,7 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.readaloud.ReadAloudController;
 import org.chromium.chrome.browser.share.ShareUtils;
+import org.chromium.chrome.browser.supervised_user.SupervisedUserServiceBridge;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tinker_tank.TinkerTankDelegate;
@@ -368,6 +369,10 @@
             maybeAddDividerLine(modelList, R.id.managed_by_divider_line_id);
             modelList.add(buildManagedByItem(currentTab));
         }
+        if (shouldShowContentFilterHelpCenterMenuItem(currentTab)) {
+            maybeAddDividerLine(modelList, R.id.menu_item_content_filter_divider_line_id);
+            modelList.add(buildContentFilterHelpCenterMenuItem(currentTab));
+        }
     }
 
     private Runnable buildUpdateStateChangedObserver() {
@@ -390,6 +395,7 @@
         if (modelList.get(modelList.size() - 1).type == AppMenuHandler.AppMenuItemType.DIVIDER) {
             return;
         }
+
         modelList.add(
                 new MVCListAdapter.ListItem(
                         AppMenuHandler.AppMenuItemType.DIVIDER, buildModelForDivider(id)));
@@ -514,7 +520,7 @@
                 buildModelForStandardMenuItem(
                         R.id.pin_tab_menu_id,
                         R.string.menu_pin_tab,
-                        shouldShowIconBeforeItem() ? R.drawable.ic_offline_pin_24dp : 0));
+                        shouldShowIconBeforeItem() ? R.drawable.ic_keep_24dp : 0));
     }
 
     private MVCListAdapter.ListItem buildNewWindowItem() {
@@ -991,6 +997,13 @@
         return currentTab != null && ManagedBrowserUtils.isBrowserManaged(currentTab.getProfile());
     }
 
+    protected boolean shouldShowContentFilterHelpCenterMenuItem(@Nullable Tab currentTab) {
+        return currentTab != null
+                && ChromeFeatureList.isEnabled(
+                        ChromeFeatureList.PROPAGATE_DEVICE_CONTENT_FILTERS_TO_SUPERVISED_USER)
+                && SupervisedUserServiceBridge.isSupervisedLocally(currentTab.getProfile());
+    }
+
     private MVCListAdapter.ListItem buildManagedByItem(Tab currentTab) {
         assert shouldShowManagedByMenuItem(currentTab);
         return new MVCListAdapter.ListItem(
@@ -1001,6 +1014,16 @@
                         shouldShowIconBeforeItem() ? R.drawable.ic_business : 0));
     }
 
+    private MVCListAdapter.ListItem buildContentFilterHelpCenterMenuItem(Tab currentTab) {
+        assert shouldShowContentFilterHelpCenterMenuItem(currentTab);
+        return new MVCListAdapter.ListItem(
+                AppMenuHandler.AppMenuItemType.STANDARD,
+                buildModelForStandardMenuItem(
+                        R.id.menu_item_content_filter_help_center_id,
+                        R.string.menu_item_content_filter_help_center_link,
+                        shouldShowIconBeforeItem() ? R.drawable.ic_account_child_20dp : 0));
+    }
+
     @Override
     public boolean shouldShowIconBeforeItem() {
         return true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
index 691aadc..64a7a4e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
@@ -91,7 +91,7 @@
 
     /** Creates intent to relaunch WebAPK. */
     public static Intent createRelaunchWebApkIntent(
-            Intent sourceIntent, @NonNull String webApkPackageName, @NonNull String url) {
+            Intent sourceIntent, @Nullable String webApkPackageName, @NonNull String url) {
         Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
         intent.setPackage(webApkPackageName);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuPTTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuPTTest.java
index e5aaa2d..95e8da3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuPTTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuPTTest.java
@@ -15,20 +15,17 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.test.transit.Transition;
 import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Features.DisableFeatures;
-import org.chromium.chrome.browser.ChromeTabbedActivity;
-import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
-import org.chromium.chrome.browser.layouts.LayoutType;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.transit.AutoResetCtaTransitTestRule;
 import org.chromium.chrome.test.transit.ChromeTransitTestRules;
+import org.chromium.chrome.test.transit.ChromeTriggers;
 import org.chromium.chrome.test.transit.hub.RegularTabSwitcherStation;
 import org.chromium.chrome.test.transit.ntp.IncognitoNewTabPageAppMenuFacility;
 import org.chromium.chrome.test.transit.ntp.IncognitoNewTabPageStation;
@@ -195,25 +192,19 @@
     @LargeTest
     public void testHideMenuOnToggleOverview() {
         WebPageStation page = mCtaTestRule.startOnBlankPage();
-        ChromeTabbedActivity activity = mCtaTestRule.getActivity();
-        LayoutManagerChrome layoutManager = activity.getLayoutManager();
 
         page.openRegularTabAppMenu();
 
         // Go to Tab Switcher programmatically because the App Menu covers the button.
         RegularTabSwitcherStation tabSwitcher =
-                page.travelToSync(
-                        RegularTabSwitcherStation.from(activity.getTabModelSelector()),
-                        Transition.runTriggerOnUiThreadOption(),
-                        () -> layoutManager.showLayout(LayoutType.TAB_SWITCHER, false));
+                RegularTabSwitcherStation.from(page.getTabModelSelector());
+        ChromeTriggers.showTabSwitcherLayoutTo(page).arriveAt(tabSwitcher);
 
         tabSwitcher.openAppMenu();
 
         // Go to a Web Page programmatically because tapping outside the app menu causes it to
         // capture the event and close.
-        tabSwitcher.travelToSync(
-                WebPageStation.newBuilder().initFrom(page).build(),
-                Transition.runTriggerOnUiThreadOption(),
-                () -> layoutManager.showLayout(LayoutType.BROWSING, false));
+        ChromeTriggers.showBrowsingLayoutTo(tabSwitcher)
+                .arriveAt(WebPageStation.newBuilder().initFrom(page).build());
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeTest.java
index ab64c9c..dbccaa7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeTest.java
@@ -353,30 +353,28 @@
         DistilledPagePrefs prefs = getDistilledPagePrefs();
         prefs.addObserver(mTestObserver);
 
-        noopTo().waitForConditions(new TabBackgroundColorCondition(tab, "\"rgb(255, 255, 255)\""));
+        noopTo().waitFor(new TabBackgroundColorCondition(tab, "\"rgb(255, 255, 255)\""));
 
         ReaderModePreferencesDialog dialog = ReaderModePreferencesDialog.open(activity);
 
         // Test setting background color
         dialog.darkButtonElement
                 .clickTo()
-                .waitForConditions(new TabBackgroundColorCondition(tab, "\"rgb(32, 33, 36)\""));
+                .waitFor(new TabBackgroundColorCondition(tab, "\"rgb(32, 33, 36)\""));
         dialog.sepiaButtonElement
                 .clickTo()
-                .waitForConditions(new TabBackgroundColorCondition(tab, "\"rgb(254, 247, 224)\""));
+                .waitFor(new TabBackgroundColorCondition(tab, "\"rgb(254, 247, 224)\""));
         dialog.lightButtonElement
                 .clickTo()
-                .waitForConditions(new TabBackgroundColorCondition(tab, "\"rgb(255, 255, 255)\""));
+                .waitFor(new TabBackgroundColorCondition(tab, "\"rgb(255, 255, 255)\""));
         verify(mTestObserver, times(3)).onChangeTheme(anyInt());
 
         // Test setting font size
-        noopTo().waitForConditions(new TabFontSizeCondition(tab, "\"14px\""));
+        noopTo().waitFor(new TabFontSizeCondition(tab, "\"14px\""));
         // Max is 200% font size.
-        dialog.setFontSizeSliderToMaxTo()
-                .waitForConditions(new TabFontSizeCondition(tab, "\"28px\""));
+        dialog.setFontSizeSliderToMaxTo().waitFor(new TabFontSizeCondition(tab, "\"28px\""));
         // Min is 50% font size.
-        dialog.setFontSizeSliderToMinTo()
-                .waitForConditions(new TabFontSizeCondition(tab, "\"7px\""));
+        dialog.setFontSizeSliderToMinTo().waitFor(new TabFontSizeCondition(tab, "\"7px\""));
         verify(mTestObserver, times(2)).onChangeFontScaling(anyFloat());
 
         // TODO(crbug.com/40125950): change font family as well.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java
index 245e6b59..0ee424b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ModalDialogViewRenderTest.java
@@ -14,6 +14,7 @@
 import android.text.TextUtils;
 import android.view.ContextThemeWrapper;
 import android.view.LayoutInflater;
+import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
 import android.widget.FrameLayout;
@@ -37,6 +38,7 @@
 import org.chromium.base.test.params.ParameterSet;
 import org.chromium.base.test.params.ParameterizedRunner;
 import org.chromium.base.test.util.Batch;
+import org.chromium.base.test.util.CriteriaHelper;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
 import org.chromium.chrome.test.R;
@@ -101,6 +103,15 @@
         sActivity = sActivityTestRule.launchActivity(null);
     }
 
+    // This helper function waits until the view is rendered trying to prevent flakiness.
+    private void waitForViewToBeRendered(View view) {
+        CriteriaHelper.pollUiThread(
+                () -> {
+                    return view.isShown() && view.getWidth() > 0 && view.getHeight() > 0;
+                },
+                "View not rendered: " + view.getClass().getSimpleName());
+    }
+
     @After
     public void tearDown() throws Exception {
         NightModeTestUtils.tearDownNightModeForBlankUiTestActivity();
@@ -182,6 +193,7 @@
                                 ModalDialogProperties.NEGATIVE_BUTTON_TEXT,
                                 mResources,
                                 R.string.cancel));
+        waitForViewToBeRendered(mModalDialogView);
         mRenderTestRule.render(mModalDialogView, "title_and_message");
     }
 
diff --git a/chrome/android/junit/BUILD.gn b/chrome/android/junit/BUILD.gn
index a26ae60..8da315e 100644
--- a/chrome/android/junit/BUILD.gn
+++ b/chrome/android/junit/BUILD.gn
@@ -1052,7 +1052,10 @@
       "src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerUnitTest.java",
     ]
 
-    deps = [ ":chrome_junit_tests_helper" ]
+    deps = [
+      ":chrome_junit_tests_helper",
+      "//components/supervised_user/android:content_filters_observer_bridge_java",
+    ]
   }
 
   robolectric_library(
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerUnitTest.java
index 2098f66..a5d3641 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerUnitTest.java
@@ -18,6 +18,7 @@
 import static org.mockito.Mockito.atLeast;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
@@ -36,6 +37,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
+import org.mockito.InOrder;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.junit.MockitoJUnit;
@@ -49,6 +51,7 @@
 import org.chromium.base.UserDataHost;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.Features.EnableFeatures;
+import org.chromium.cc.input.BrowserControlsOffsetTags;
 import org.chromium.cc.input.BrowserControlsState;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ActivityTabProvider;
@@ -67,6 +70,10 @@
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.toolbar.ControlContainer;
 import org.chromium.components.embedder_support.view.ContentView;
+import org.chromium.content_public.browser.WebContents;
+import org.chromium.ui.BrowserControlsOffsetTagConstraints;
+import org.chromium.ui.BrowserControlsOffsetTagDefinitions;
+import org.chromium.ui.OffsetTagConstraints;
 import org.chromium.ui.util.TokenHolder;
 
 import java.util.Collections;
@@ -80,6 +87,7 @@
     // Since these tests don't depend on the heights being pixels, we can use these as dpi directly.
     private static final int TOOLBAR_HEIGHT = 56;
     private static final int EXTRA_TOP_CONTROL_HEIGHT = 20;
+    private static final int TOOLBAR_HAIRLINE_HEIGHT = 5;
 
     @Mock private Activity mActivity;
     @Mock private ControlContainer mControlContainer;
@@ -93,6 +101,7 @@
     @Mock private TabModel mTabModel;
     @Mock private TabBrowserControlsOffsetHelper mTabBrowserControlsOffsetHelper;
     @Mock private MultiWindowModeStateDispatcher mMultiWindowModeStateDispatcher;
+    @Mock private WebContents mWebContents;
 
     private @Captor ArgumentCaptor<Callback<Tab>> mCallbackTabCaptor;
     private @Captor ArgumentCaptor<TabModelObserver> mTabModelObserverCaptor;
@@ -102,6 +111,8 @@
     private BrowserControlsManager mBrowserControlsManager;
     private BrowserStateBrowserControlsVisibilityDelegate mControlsDelegate;
 
+    private InOrder mWebContentsInOrder;
+
     @Before
     public void setUp() {
         ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.CREATED);
@@ -143,6 +154,7 @@
         mControlsDelegate = mBrowserControlsManager.getBrowserVisibilityDelegate();
         mBrowserControlsManager.addObserver(mBrowserControlsStateProviderObserver);
         when(mBrowserControlsManager.getTab()).thenReturn(mTab);
+        mWebContentsInOrder = inOrder(mWebContents);
     }
 
     private void remakeWithoutSpy() {
@@ -312,6 +324,128 @@
     }
 
     @Test
+    public void testRendererDrivenHeightIncreaseAnimation() {
+        remakeWithoutSpy();
+        notifyAddTab(mTab);
+        notifyCurrentTab(mTab);
+
+        when(mTab.getWebContents()).thenReturn(mWebContents);
+        when(mControlContainer.getToolbarHairlineHeight()).thenReturn(TOOLBAR_HAIRLINE_HEIGHT);
+
+        final int newHeight = TOOLBAR_HEIGHT + EXTRA_TOP_CONTROL_HEIGHT;
+        final int newMinHeight = EXTRA_TOP_CONTROL_HEIGHT;
+        OffsetTagConstraints expectedTopConstraints = null;
+        OffsetTagConstraints expectedContentConstraints = null;
+        OffsetTagConstraints expectedBottomConstraints = null;
+
+        // Start height increase animation for top controls
+        mBrowserControlsManager.setAnimateBrowserControlsHeightChanges(true);
+        mBrowserControlsManager.setTopControlsHeight(newHeight, newMinHeight);
+        expectedTopConstraints =
+                new OffsetTagConstraints(0, 0, -(newHeight + TOOLBAR_HAIRLINE_HEIGHT), 0);
+        expectedContentConstraints = new OffsetTagConstraints(0, 0, -newHeight, 0);
+        verifyUpdateOffsetTagDefinitions(
+                expectedTopConstraints, expectedContentConstraints, expectedBottomConstraints);
+
+        // Simulate offset update from renderer for end of animation.
+        mBrowserControlsManager
+                .getTabControlsObserverForTesting()
+                .onBrowserControlsOffsetChanged(mTab, 0, 0, 0, newMinHeight, 0);
+        float scrollableHeight = newHeight - newMinHeight;
+        expectedTopConstraints =
+                new OffsetTagConstraints(0, 0, -(scrollableHeight + TOOLBAR_HAIRLINE_HEIGHT), 0);
+        expectedContentConstraints = new OffsetTagConstraints(0, 0, -scrollableHeight, 0);
+        verifyUpdateOffsetTagDefinitions(
+                expectedTopConstraints, expectedContentConstraints, expectedBottomConstraints);
+
+        // Start height increase animation for bottom controls
+        mBrowserControlsManager.setBottomControlsAdditionalHeight(TOOLBAR_HAIRLINE_HEIGHT);
+        mBrowserControlsManager.setBottomControlsHeight(newHeight, newMinHeight);
+        expectedBottomConstraints =
+                new OffsetTagConstraints(0, 0, 0, newHeight + TOOLBAR_HAIRLINE_HEIGHT);
+        verifyUpdateOffsetTagDefinitions(
+                expectedTopConstraints, expectedContentConstraints, expectedBottomConstraints);
+
+        // Simulate offset update from renderer for end of animation.
+        mBrowserControlsManager
+                .getTabControlsObserverForTesting()
+                .onBrowserControlsOffsetChanged(mTab, 0, 0, 0, 0, newMinHeight);
+        expectedBottomConstraints =
+                new OffsetTagConstraints(0, 0, 0, scrollableHeight + TOOLBAR_HAIRLINE_HEIGHT);
+        verifyUpdateOffsetTagDefinitions(
+                expectedTopConstraints, expectedContentConstraints, expectedBottomConstraints);
+    }
+
+    @Test
+    public void testRendererDrivenHeightDecreaseAnimation() {
+        remakeWithoutSpy();
+        notifyAddTab(mTab);
+        notifyCurrentTab(mTab);
+
+        when(mTab.getWebContents()).thenReturn(mWebContents);
+        when(mControlContainer.getToolbarHairlineHeight()).thenReturn(TOOLBAR_HAIRLINE_HEIGHT);
+
+        final int fullHeight = TOOLBAR_HEIGHT + EXTRA_TOP_CONTROL_HEIGHT;
+        final int minHeight = EXTRA_TOP_CONTROL_HEIGHT;
+        OffsetTagConstraints expectedTopConstraints = null;
+        OffsetTagConstraints expectedContentConstraints = null;
+        OffsetTagConstraints expectedBottomConstraints = null;
+
+        mBrowserControlsManager.setAnimateBrowserControlsHeightChanges(true);
+        mBrowserControlsManager.setBottomControlsAdditionalHeight(TOOLBAR_HAIRLINE_HEIGHT);
+        mBrowserControlsManager.setTopControlsHeight(fullHeight, minHeight);
+        mBrowserControlsManager.setBottomControlsHeight(fullHeight, minHeight);
+        // Simulate offset update from renderer for end of animation.
+        mBrowserControlsManager
+                .getTabControlsObserverForTesting()
+                .onBrowserControlsOffsetChanged(mTab, 0, 0, 0, minHeight, minHeight);
+        float scrollableHeight = fullHeight - minHeight;
+        expectedTopConstraints =
+                new OffsetTagConstraints(0, 0, -(scrollableHeight + TOOLBAR_HAIRLINE_HEIGHT), 0);
+        expectedContentConstraints = new OffsetTagConstraints(0, 0, -scrollableHeight, 0);
+        expectedBottomConstraints =
+                new OffsetTagConstraints(0, 0, 0, scrollableHeight + TOOLBAR_HAIRLINE_HEIGHT);
+        verifyUpdateOffsetTagDefinitions(
+                expectedTopConstraints, expectedContentConstraints, expectedBottomConstraints);
+
+        int newHeight = fullHeight - minHeight;
+
+        // Start height decrease animation for top controls
+        mBrowserControlsManager.setTopControlsHeight(newHeight, 0);
+        expectedTopConstraints =
+                new OffsetTagConstraints(0, 0, -(newHeight + TOOLBAR_HAIRLINE_HEIGHT), minHeight);
+        expectedContentConstraints = new OffsetTagConstraints(0, 0, -newHeight, minHeight);
+        verifyUpdateOffsetTagDefinitions(
+                expectedTopConstraints, expectedContentConstraints, expectedBottomConstraints);
+
+        // Simulate offset update from renderer for end of animation.
+        mBrowserControlsManager
+                .getTabControlsObserverForTesting()
+                .onBrowserControlsOffsetChanged(mTab, 0, 0, 0, 0, minHeight);
+        expectedTopConstraints =
+                new OffsetTagConstraints(0, 0, -(newHeight + TOOLBAR_HAIRLINE_HEIGHT), 0);
+        expectedContentConstraints = new OffsetTagConstraints(0, 0, -newHeight, 0);
+        verifyUpdateOffsetTagDefinitions(
+                expectedTopConstraints, expectedContentConstraints, expectedBottomConstraints);
+
+        // Start height decrease animation for bottom controls
+        mBrowserControlsManager.setBottomControlsHeight(newHeight, 0);
+        expectedBottomConstraints =
+                new OffsetTagConstraints(0, 0, -minHeight, newHeight + TOOLBAR_HAIRLINE_HEIGHT);
+        verifyUpdateOffsetTagDefinitions(
+                expectedTopConstraints, expectedContentConstraints, expectedBottomConstraints);
+
+        // Simulate offset update from renderer for end of animation.
+        mBrowserControlsManager
+                .getTabControlsObserverForTesting()
+                .onBrowserControlsOffsetChanged(mTab, 0, 0, 0, 0, 0);
+        expectedBottomConstraints =
+                new OffsetTagConstraints(0, 0, 0, newHeight + TOOLBAR_HAIRLINE_HEIGHT);
+        verifyUpdateOffsetTagDefinitions(
+                expectedTopConstraints, expectedContentConstraints, expectedBottomConstraints);
+    }
+
+    @Test
     public void testChangeTopHeightWithoutAnimation_Browser() {
         // Simulate that we can't animate native browser controls.
         when(mBrowserControlsManager.getTab()).thenReturn(null);
@@ -630,7 +764,7 @@
 
     @Test
     @EnableFeatures(ChromeFeatureList.BCIV_BOTTOM_CONTROLS)
-    public void testSkipOffsetChangedIfAnimatingWithBciv() {
+    public void testSkipOffsetChangedIfAnimatingPositionChange() {
         remakeWithoutSpy();
         notifyAddTab(mTab);
         notifyCurrentTab(mTab);
@@ -659,4 +793,14 @@
                         anyBoolean(),
                         anyBoolean());
     }
+
+    private void verifyUpdateOffsetTagDefinitions(
+            OffsetTagConstraints top, OffsetTagConstraints content, OffsetTagConstraints bottom) {
+        BrowserControlsOffsetTagConstraints expectedConstraints =
+                new BrowserControlsOffsetTagConstraints(top, content, bottom);
+        BrowserControlsOffsetTagDefinitions expectedDefinitions =
+                new BrowserControlsOffsetTagDefinitions(
+                        new BrowserControlsOffsetTags(null, null, null), expectedConstraints);
+        mWebContentsInOrder.verify(mWebContents).updateOffsetTagDefinitions(expectedDefinitions);
+    }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java
index 73b226a..9c01836 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java
@@ -151,6 +151,7 @@
     ChromeFeatureList.NEW_TAB_PAGE_CUSTOMIZATION,
     DomDistillerFeatures.READER_MODE_IMPROVEMENTS
 })
+@EnableFeatures({ChromeFeatureList.PROPAGATE_DEVICE_CONTENT_FILTERS_TO_SUPERVISED_USER})
 public class TabbedAppMenuPropertiesDelegateUnitTest {
     // Constants defining flags that determines multi-window menu items visibility.
     private static final boolean TAB_M = true; // multiple tabs
@@ -955,10 +956,9 @@
 
     @Test
     @Config(qualifiers = "sw320dp")
-    public void testPageMenuItems_Phone_RegularPage_enterprise_user() {
+    public void testPageMenuItems_Phone_RegularPage_managed_users() {
         setUpMocksForPageMenu();
         when(mTab.getUrl()).thenReturn(JUnitTestGURLs.SEARCH_URL);
-        when(mManagedBrowserUtilsJniMock.isBrowserManaged(any())).thenReturn(true);
         doReturn(true)
                 .when(mTabbedAppMenuPropertiesDelegate)
                 .shouldShowManagedByMenuItem(any(Tab.class));
@@ -1000,6 +1000,56 @@
     }
 
     @Test
+    @Config(qualifiers = "sw320dp")
+    public void testPageMenuItems_Phone_RegularPage_locally_supervised_users() {
+        setUpMocksForPageMenu();
+        when(mTab.getUrl()).thenReturn(JUnitTestGURLs.SEARCH_URL);
+        doReturn(true)
+                .when(mTabbedAppMenuPropertiesDelegate)
+                .shouldShowContentFilterHelpCenterMenuItem(any(Tab.class));
+        doReturn(false)
+                .when(mTabbedAppMenuPropertiesDelegate)
+                .shouldShowManagedByMenuItem(any(Tab.class));
+
+        MVCListAdapter.ModelList modelList = mTabbedAppMenuPropertiesDelegate.getMenuItems();
+
+        // TODO(crbug.com/427240031): Stop asserting on menu items that are not subject of this
+        // test.
+        ArrayList<Integer> expectedItems =
+                new ArrayList<>(
+                        Arrays.asList(
+                                R.id.icon_row_menu_id,
+                                R.id.new_tab_menu_id,
+                                R.id.new_incognito_tab_menu_id,
+                                R.id.divider_line_id,
+                                R.id.open_history_menu_id,
+                                R.id.quick_delete_menu_id,
+                                R.id.quick_delete_divider_line_id,
+                                R.id.downloads_menu_id,
+                                R.id.all_bookmarks_menu_id,
+                                R.id.recent_tabs_menu_id,
+                                R.id.divider_line_id,
+                                R.id.share_menu_id,
+                                R.id.find_in_page_id,
+                                R.id.universal_install,
+                                R.id.auto_dark_web_contents_id,
+                                R.id.divider_line_id,
+                                R.id.preferences_id,
+                                R.id.help_id,
+                                R.id.menu_item_content_filter_divider_line_id,
+                                R.id.menu_item_content_filter_help_center_id));
+
+        if (!BuildConfig.IS_DESKTOP_ANDROID) {
+            expectedItems.add(R.id.request_desktop_site_id);
+        }
+        if (ExtensionsBuildflags.ENABLE_DESKTOP_ANDROID_EXTENSIONS) {
+            expectedItems.add(R.id.extensions_menu_id);
+        }
+
+        assertMenuItemsAreEqual(modelList, expectedItems.toArray(new Integer[0]));
+    }
+
+    @Test
     public void testPageMenuItems_multiWindowMenu_featureEnabled() {
         setUpMocksForPageMenu();
         when(mTab.getUrl()).thenReturn(JUnitTestGURLs.SEARCH_URL);
@@ -1126,6 +1176,20 @@
     }
 
     @Test
+    public void contentFilterHelpCenterItem_ChromeManagementPage() {
+        setUpMocksForPageMenu();
+        setMenuOptions(new MenuOptions().withShowAddToHomeScreen());
+        doReturn(true)
+                .when(mTabbedAppMenuPropertiesDelegate)
+                .shouldShowContentFilterHelpCenterMenuItem(any(Tab.class));
+
+        Assert.assertEquals(MenuGroup.PAGE_MENU, mTabbedAppMenuPropertiesDelegate.getMenuGroup());
+        MVCListAdapter.ModelList modelList = mTabbedAppMenuPropertiesDelegate.getMenuItems();
+
+        assertTrue(isMenuVisible(modelList, R.id.menu_item_content_filter_help_center_id));
+    }
+
+    @Test
     public void testNewIncognitoTabOption_WithReauthInProgress() {
         setUpMocksForPageMenu();
         setMenuOptions(
@@ -1811,6 +1875,9 @@
         doReturn(false)
                 .when(mTabbedAppMenuPropertiesDelegate)
                 .shouldShowManagedByMenuItem(any(Tab.class));
+        doReturn(false)
+                .when(mTabbedAppMenuPropertiesDelegate)
+                .shouldShowContentFilterHelpCenterMenuItem(any(Tab.class));
         doReturn(true)
                 .when(mTabbedAppMenuPropertiesDelegate)
                 .shouldShowAutoDarkItem(any(Tab.class), eq(false));
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 13433f2..a9cc49c2 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -1161,6 +1161,17 @@
     Please retry. If you see this error again please contact your support representative.
   </message>
 
+  <!-- Strings for Demo Sessions -->
+  <message name="IDS_DEMO_SESSION_TOS_NOTIFICATION_TITLE" desc="Title of the ToS notification in demo session.">
+    You are using a demo device
+  </message>
+  <message name="IDS_DEMO_SESSION_TOS_NOTIFICATION_MESSAGE" desc="Message of the ToS notification in demo session.">
+    Demo mode is intended for users 18+ and is governed by Google's Terms of Service and Privacy Policy. Data entered on this device may be viewed by others between periodic wipes.
+  </message>
+  <message name="IDS_DEMO_SESSION_TOS_NOTIFICATION_BUTTON_TEXT" desc="The text of the button on the ToS notification in demo session.">
+    Learn more
+  </message>
+
   <!-- Strings for OS trial screen-->
   <message name="IDS_OS_TRIAL_TITLE" desc="Title of the install or try screen, the first screen of the ChromeOS Flex Installation flow">
     Start using <ph name="DEVICE_OS">$1<ex>ChromeOS Flex</ex></ph>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_DEMO_SESSION_TOS_NOTIFICATION_BUTTON_TEXT.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_DEMO_SESSION_TOS_NOTIFICATION_BUTTON_TEXT.png.sha1
new file mode 100644
index 0000000..8f9e5e0
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_DEMO_SESSION_TOS_NOTIFICATION_BUTTON_TEXT.png.sha1
@@ -0,0 +1 @@
+16a07de8e3bb43f12740d90e16cee5b98c11cc30
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_DEMO_SESSION_TOS_NOTIFICATION_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_DEMO_SESSION_TOS_NOTIFICATION_MESSAGE.png.sha1
new file mode 100644
index 0000000..8f9e5e0
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_DEMO_SESSION_TOS_NOTIFICATION_MESSAGE.png.sha1
@@ -0,0 +1 @@
+16a07de8e3bb43f12740d90e16cee5b98c11cc30
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_DEMO_SESSION_TOS_NOTIFICATION_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_DEMO_SESSION_TOS_NOTIFICATION_TITLE.png.sha1
new file mode 100644
index 0000000..8f9e5e0
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_DEMO_SESSION_TOS_NOTIFICATION_TITLE.png.sha1
@@ -0,0 +1 @@
+16a07de8e3bb43f12740d90e16cee5b98c11cc30
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp
index 041099e06..50f237b 100644
--- a/chrome/app/os_settings_strings.grdp
+++ b/chrome/app/os_settings_strings.grdp
@@ -271,6 +271,9 @@
   <message name="IDS_OS_SETTINGS_FIRMWARE_UP_TO_DATE_DESCRIPTION" desc="Sublabel shown when no firmware updates are available.">
     Firmware is up to date
   </message>
+  <message name="IDS_OS_SETTINGS_FIRMWARE_DISABLED_DESCRIPTION" desc="Sublabel shown when firmware updates are disabled.">
+    Firmware updates are disabled by your administrator.
+  </message>
   <message name="IDS_OS_SETTINGS_FIRMWARE_UPDATE_AVAILABLE_DESCRIPTION" desc="Sublabel shown when firmware updates are available.">
     Update available
   </message>
diff --git a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_FIRMWARE_DISABLED_DESCRIPTION.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_FIRMWARE_DISABLED_DESCRIPTION.png.sha1
new file mode 100644
index 0000000..5381230
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_FIRMWARE_DISABLED_DESCRIPTION.png.sha1
@@ -0,0 +1 @@
+a0a3c173a22b590dd7bae9abfd6eea915212552a
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index c8ac6dfe..9f0203e 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -209,11 +209,9 @@
     "assist_ranker/assist_ranker_service_factory.cc",
     "assist_ranker/assist_ranker_service_factory.h",
     "autocomplete/autocomplete_classifier_factory.cc",
-    "autocomplete/autocomplete_classifier_factory.h",
     "autocomplete/chrome_autocomplete_provider_client.cc",
     "autocomplete/chrome_autocomplete_provider_client.h",
     "autocomplete/chrome_autocomplete_scheme_classifier.cc",
-    "autocomplete/chrome_autocomplete_scheme_classifier.h",
     "autocomplete/document_suggestions_service_factory.cc",
     "autocomplete/document_suggestions_service_factory.h",
     "autocomplete/enterprise_search_aggregator_suggestions_service_factory.cc",
@@ -1932,6 +1930,7 @@
     "//chrome/browser/affiliations",
     "//chrome/browser/ai",
     "//chrome/browser/ai:impl",
+    "//chrome/browser/autocomplete",
     "//chrome/browser/autofill",
     "//chrome/browser/background:background",
     "//chrome/browser/background:impl",
@@ -3284,6 +3283,7 @@
       "ssl/known_interception_disclosure_infobar.h",
       "supervised_user/android/favicon_fetcher.cc",
       "supervised_user/android/favicon_fetcher.h",
+      "supervised_user/android/supervised_user_service_bridge.cc",
       "supervised_user/android/supervised_user_service_platform_delegate.cc",
       "supervised_user/android/supervised_user_service_platform_delegate.h",
       "supervised_user/android/supervised_user_web_content_handler_impl.cc",
@@ -3440,6 +3440,7 @@
       "//chrome/browser/serial/android:jni_headers",
       "//chrome/browser/signin/services/android:jni_headers",
       "//chrome/browser/ssl/android:jni_headers",
+      "//chrome/browser/supervised_user:supervised_user_service_bridge_jni_headers",
       "//chrome/browser/supervised_user:supervised_user_service_platform_delegate_jni_headers",
       "//chrome/browser/supervised_user:website_parent_approval_jni_headers",
       "//chrome/browser/sync/android:jni_headers",
@@ -4585,6 +4586,10 @@
     # Any circular includes must depend on the target
     # "browser_public_dependencies".
     allow_circular_includes_from += [
+      # TODO(crbug.com/426554250): This needs //chrome/browser/lookalikes which is
+      # not yet modularized.
+      "//chrome/browser/actor:impl",
+
       # TODO(crbug.com/40251079): Remove circular dependencies.
       "//chrome/browser/apps/app_service",
 
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index a37bf703..2263c9c 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -609,8 +609,8 @@
     {"remove_find_in_page_menu_item", "true"},
     {"remove_desktop_site_menu_item", "true"}};
 const FeatureEntry::FeatureParam kCCTAdaptiveButtonMLTraining[] = {
-    {"open_in_browser", "true"},
-    {"ml_training", "true"}};
+    {"ml_training", "true"},
+    {"open_in_browser", "true"}};
 const FeatureEntry::FeatureVariation kCCTAdaptiveButtonVariations[] = {
     {"+OpenInBrowser", kCCTAdaptiveButtonEnable,
      std::size(kCCTAdaptiveButtonEnable), nullptr},
@@ -628,6 +628,24 @@
      std::size(kCCTAdaptiveButtonMLTraining), nullptr},
 };
 
+const FeatureEntry::FeatureParam kCCTAdaptiveButtonTestSwitchHide[] = {
+    {"hide-button", "true"},
+    {"always-animate", "false"}};
+const FeatureEntry::FeatureParam kCCTAdaptiveButtonTestSwitchChip[] = {
+    {"hide-button", "false"},
+    {"always-animate", "true"}};
+const FeatureEntry::FeatureParam kCCTAdaptiveButtonTestSwitchBoth[] = {
+    {"hide-button", "true"},
+    {"always-animate", "true"}};
+const FeatureEntry::FeatureVariation kCCTAdaptiveButtonTestSwitchVariations[] =
+    {
+        {"+Hide button", kCCTAdaptiveButtonTestSwitchHide,
+         std::size(kCCTAdaptiveButtonTestSwitchHide), nullptr},
+        {"+Always animate chip", kCCTAdaptiveButtonTestSwitchChip,
+         std::size(kCCTAdaptiveButtonTestSwitchChip), nullptr},
+        {"+Both", kCCTAdaptiveButtonTestSwitchBoth,
+         std::size(kCCTAdaptiveButtonTestSwitchBoth), nullptr},
+};
 const FeatureEntry::FeatureParam
     kAdaptiveButtonInTopToolbarPageSummaryDisableFallback[] = {
         {"intent_fallback", "false"},
@@ -6093,6 +6111,11 @@
      flag_descriptions::kTabCollectionAndroidDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(chrome::android::kTabCollectionAndroid)},
 
+    {"toolbar-phone-animation-refactor",
+     flag_descriptions::kToolbarPhoneAnimationRefactorName,
+     flag_descriptions::kToolbarPhoneAnimationRefactorDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(chrome::android::kToolbarPhoneAnimationRefactor)},
+
 #endif  // BUILDFLAG(IS_ANDROID)
     {"disallow-doc-written-script-loads",
      flag_descriptions::kDisallowDocWrittenScriptsUiName,
@@ -8046,6 +8069,13 @@
      FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kCCTAdaptiveButton,
                                     kCCTAdaptiveButtonVariations,
                                     "CCTAdaptiveButton")},
+    {"cct-adaptive-button-test-switch",
+     flag_descriptions::kCCTAdaptiveButtonTestSwitchName,
+     flag_descriptions::kCCTAdaptiveButtonTestSwitchDescription, kOsAndroid,
+     FEATURE_WITH_PARAMS_VALUE_TYPE(
+         chrome::android::kCCTAdaptiveButtonTestSwitch,
+         kCCTAdaptiveButtonTestSwitchVariations,
+         "CCTAdaptiveButtonTestSwitch")},
     {"cct-auth-tab", flag_descriptions::kCCTAuthTabName,
      flag_descriptions::kCCTAuthTabDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(chrome::android::kCCTAuthTab)},
@@ -12461,15 +12491,15 @@
 #endif  // BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
-    BUILDFLAG(IS_CHROMEOS)
+    BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
     {"autofill-enable-amount-extraction-testing",
      flag_descriptions::kAutofillEnableAmountExtractionTestingName,
      flag_descriptions::kAutofillEnableAmountExtractionTestingDescription,
-     kOsDesktop,
+     kOsDesktop | kOsAndroid,
      FEATURE_VALUE_TYPE(
          autofill::features::kAutofillEnableAmountExtractionTesting)},
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
-        // BUILDFLAG(IS_CHROMEOS)
+        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
 
     {"enable-web-app-update-token-parsing",
      flag_descriptions::kEnableWebAppUpdateTokenParsingName,
diff --git a/chrome/browser/accessibility/media_app/ax_media_app_untrusted_service_browsertest.cc b/chrome/browser/accessibility/media_app/ax_media_app_untrusted_service_browsertest.cc
index 6961936f..b1063d7e 100644
--- a/chrome/browser/accessibility/media_app/ax_media_app_untrusted_service_browsertest.cc
+++ b/chrome/browser/accessibility/media_app/ax_media_app_untrusted_service_browsertest.cc
@@ -35,7 +35,6 @@
 #include "mojo/public/cpp/test_support/test_utils.h"
 #include "services/screen_ai/public/mojom/screen_ai_service.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "ui/accessibility/accessibility_features.h"
 #include "ui/accessibility/ax_action_data.h"
 #include "ui/accessibility/ax_enums.mojom-shared.h"
 #include "ui/accessibility/ax_enums.mojom.h"
@@ -72,6 +71,30 @@
 // 26 pages are needed, more characters can be added.
 constexpr std::string_view kTestPageIds = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 
+constexpr std::string_view kLoadingMessage =
+    "AXTree has_parent_tree title=PDF document\n"
+    "id=1 pdfRoot FOCUSABLE url=fakepdfurl.pdf clips_children child_ids=10000 "
+    "(0, 0)-(0, 0) "
+    "text_align=left restriction=readonly scroll_x_min=0 scroll_y_min=0 "
+    "scrollable=true is_line_breaking_object=true\n"
+    "  id=10000 banner <div> child_ids=10001 offset_container_id=1 (-1, "
+    "-1)-(1, 1) text_align=left is_page_breaking_object=true "
+    "is_line_breaking_object=true has_aria_attribute=true\n"
+    "    id=10001 status <div> child_ids=10002 offset_container_id=10000 (0, "
+    "0)-(1, 1) text_align=left container_relevant=additions text "
+    "container_live=polite relevant=additions text live=polite "
+    "container_atomic=true container_busy=false atomic=true "
+    "is_line_breaking_object=true has_aria_attribute=true\n"
+    "      id=10002 staticText name=This PDF is inaccessible. Extracting text, "
+    "powered by Google AI child_ids=10003 offset_container_id=10001 (0, 0)-(1, "
+    "1) text_align=left container_relevant=additions text "
+    "container_live=polite relevant=additions text live=polite "
+    "container_atomic=true container_busy=false atomic=true "
+    "is_line_breaking_object=true\n"
+    "        id=10003 inlineTextBox name=This PDF is inaccessible. Extracting "
+    "text, powered by Google AI offset_container_id=10002 (0, 0)-(1, 1) "
+    "text_align=left\n";
+
 class AXMediaAppUntrustedServiceTest : public InProcessBrowserTest {
  public:
   AXMediaAppUntrustedServiceTest() = default;
@@ -102,39 +125,6 @@
     service_->SetMediaAppForTesting(&fake_media_app_);
     service_->CreateFakeOpticalCharacterRecognizerForTesting(
         /*return_empty=*/false, /*is_successful=*/true);
-    kLoadingMessage =
-        "AXTree has_parent_tree title=PDF document\n"
-        "id=1 pdfRoot FOCUSABLE url=fakepdfurl.pdf clips_children "
-        "child_ids=10000 "
-        "(0, 0)-(0, 0) "
-        "text_align=left restriction=readonly scroll_x_min=0 scroll_y_min=0 "
-        "scrollable=true is_line_breaking_object=true\n"
-        "  id=10000 banner <div> child_ids=10001 offset_container_id=1 (-1, "
-        "-1)-(1, 1) text_align=left ";
-    kLoadingMessage +=
-        features::IsAccessibilityUseAXBitsetEnabled()
-            ? "is_line_breaking_object=true is_page_breaking_object=true "
-            : "is_page_breaking_object=true is_line_breaking_object=true ";
-    kLoadingMessage +=
-        "has_aria_attribute=true\n"
-        "    id=10001 status <div> child_ids=10002 offset_container_id=10000 "
-        "(0, "
-        "0)-(1, 1) text_align=left container_relevant=additions text "
-        "container_live=polite relevant=additions text live=polite "
-        "container_atomic=true container_busy=false atomic=true "
-        "is_line_breaking_object=true has_aria_attribute=true\n"
-        "      id=10002 staticText name=This PDF is inaccessible. Extracting "
-        "text, "
-        "powered by Google AI child_ids=10003 offset_container_id=10001 (0, "
-        "0)-(1, "
-        "1) text_align=left container_relevant=additions text "
-        "container_live=polite relevant=additions text live=polite "
-        "container_atomic=true container_busy=false atomic=true "
-        "is_line_breaking_object=true\n"
-        "        id=10003 inlineTextBox name=This PDF is inaccessible. "
-        "Extracting "
-        "text, powered by Google AI offset_container_id=10002 (0, 0)-(1, 1) "
-        "text_align=left\n";
   }
 
   void TearDownOnMainThread() override {
@@ -143,7 +133,6 @@
   }
 
  protected:
-  std::string kLoadingMessage;
   // Create fake page metadata with pages of the same size positioned(
   // kTestPageWidth + kTestPageGap) unit spaced apart.
   std::vector<PageMetadataPtr> CreateFakePageMetadata(
@@ -243,17 +232,17 @@
 
 IN_PROC_BROWSER_TEST_F(AXMediaAppUntrustedServiceTest,
                        OcrServiceInitializedFailed) {
-  std::string inaccessible_pdf_tree =
+  service_->CreateFakeOpticalCharacterRecognizerForTesting(
+      /*return_empty=*/false, /*is_successful=*/false);
+  EnableScreenReaderForTesting();
+  EXPECT_FALSE(service_->IsOcrServiceEnabled());
+  EXPECT_TRUE(service_->IsAccessibilityEnabled());
+  EXPECT_EQ(
       "AXTree has_parent_tree title=PDF document\n"
       "id=1 pdfRoot child_ids=10000 (0, 0)-(0, 0)\n"
       "  id=10000 banner <div> child_ids=10001 offset_container_id=1 (-1, "
-      "-1)-(1, 1) text_align=left ";
-  inaccessible_pdf_tree +=
-      features::IsAccessibilityUseAXBitsetEnabled()
-          ? "is_line_breaking_object=true is_page_breaking_object=true "
-          : "is_page_breaking_object=true is_line_breaking_object=true ";
-  inaccessible_pdf_tree +=
-      "has_aria_attribute=true\n"
+      "-1)-(1, 1) text_align=left is_page_breaking_object=true "
+      "is_line_breaking_object=true has_aria_attribute=true\n"
       "    id=10001 status <div> child_ids=10002 offset_container_id=10000 (0, "
       "0)-(1, 1) text_align=left container_relevant=additions text "
       "container_live=polite relevant=additions text live=polite "
@@ -267,14 +256,8 @@
       "container_busy=false atomic=true is_line_breaking_object=true\n"
       "        id=10003 inlineTextBox name=This PDF is inaccessible. Couldn't "
       "download text extraction files. Please try again later. "
-      "offset_container_id=10002 (0, 0)-(1, 1) text_align=left\n";
-  service_->CreateFakeOpticalCharacterRecognizerForTesting(
-      /*return_empty=*/false, /*is_successful=*/false);
-  EnableScreenReaderForTesting();
-  EXPECT_FALSE(service_->IsOcrServiceEnabled());
-  EXPECT_TRUE(service_->IsAccessibilityEnabled());
-  EXPECT_EQ(inaccessible_pdf_tree,
-            service_->GetDocumentTreeToStringForTesting());
+      "offset_container_id=10002 (0, 0)-(1, 1) text_align=left\n",
+      service_->GetDocumentTreeToStringForTesting());
 
   DisableScreenReaderForTesting();
   EXPECT_FALSE(service_->IsOcrServiceEnabled());
@@ -287,8 +270,27 @@
   service_->OnOCRServiceInitialized(/*successful*/ false);
   EXPECT_FALSE(service_->IsOcrServiceEnabled());
   EXPECT_TRUE(service_->IsAccessibilityEnabled());
-  EXPECT_EQ(inaccessible_pdf_tree,
-            service_->GetDocumentTreeToStringForTesting());
+  EXPECT_EQ(
+      "AXTree has_parent_tree title=PDF document\n"
+      "id=1 pdfRoot child_ids=10000 (0, 0)-(0, 0)\n"
+      "  id=10000 banner <div> child_ids=10001 offset_container_id=1 (-1, "
+      "-1)-(1, 1) text_align=left is_page_breaking_object=true "
+      "is_line_breaking_object=true has_aria_attribute=true\n"
+      "    id=10001 status <div> child_ids=10002 offset_container_id=10000 (0, "
+      "0)-(1, 1) text_align=left container_relevant=additions text "
+      "container_live=polite relevant=additions text live=polite "
+      "container_atomic=true container_busy=false atomic=true "
+      "is_line_breaking_object=true has_aria_attribute=true\n"
+      "      id=10002 staticText name=This PDF is inaccessible. Couldn't "
+      "download text extraction files. Please try again later. child_ids=10003 "
+      "offset_container_id=10001 (0, 0)-(1, 1) text_align=left "
+      "container_relevant=additions text container_live=polite "
+      "relevant=additions text live=polite container_atomic=true "
+      "container_busy=false atomic=true is_line_breaking_object=true\n"
+      "        id=10003 inlineTextBox name=This PDF is inaccessible. Couldn't "
+      "download text extraction files. Please try again later. "
+      "offset_container_id=10002 (0, 0)-(1, 1) text_align=left\n",
+      service_->GetDocumentTreeToStringForTesting());
 
   DisableSelectToSpeakForTesting();
   EXPECT_FALSE(service_->IsAccessibilityEnabled());
@@ -2106,7 +2108,7 @@
   // Note that the region nodes under the document root node have the (0,0)
   // offset. Each page will be correctly offset as the root node of its (child)
   // tree has a correct offset.
-  std::string expected =
+  EXPECT_EQ(
       "AXTree has_parent_tree title=PDF document\n"
       "id=1 pdfRoot FOCUSABLE name=PDF document containing 2 pages "
       "name_from=attribute url=fakepdfurl.pdf clips_children "
@@ -2114,13 +2116,8 @@
       "scroll_x_min=0 scroll_y_min=0 restriction=readonly text_align=left "
       "scrollable=true is_line_breaking_object=true\n"
       "  id=10000 banner <div> child_ids=10001 offset_container_id=1 (-1, "
-      "-1)-(1, 1) text_align=left ";
-  expected +=
-      features::IsAccessibilityUseAXBitsetEnabled()
-          ? "is_line_breaking_object=true is_page_breaking_object=true "
-          : "is_page_breaking_object=true is_line_breaking_object=true ";
-  expected +=
-      "has_aria_attribute=true\n"
+      "-1)-(1, 1) text_align=left is_page_breaking_object=true "
+      "is_line_breaking_object=true has_aria_attribute=true\n"
       "    id=10001 status <div> child_ids=10002 offset_container_id=10000 (0, "
       "0)-(1, 1) text_align=left container_relevant=additions text "
       "container_live=polite relevant=additions text live=polite "
@@ -2140,8 +2137,8 @@
       "8) restriction=readonly is_page_breaking_object=true\n"
       "  id=3 region name=Page 2 name_from=attribute "
       "has_child_tree (0, 0)-(3, "
-      "8) restriction=readonly is_page_breaking_object=true\n";
-  EXPECT_EQ(expected, service_->GetDocumentTreeToStringForTesting());
+      "8) restriction=readonly is_page_breaking_object=true\n",
+      service_->GetDocumentTreeToStringForTesting());
 }
 
 IN_PROC_BROWSER_TEST_F(AXMediaAppUntrustedServiceTest,
@@ -2162,7 +2159,7 @@
   // Note that the region nodes under the document root node have the (0,0)
   // offset. Each page will be correctly offset as the root node of its (child)
   // tree has a correct offset.
-  std::string expected =
+  EXPECT_EQ(
       "AXTree has_parent_tree title=PDF document\n"
       "id=1 pdfRoot FOCUSABLE name=PDF document containing 2 pages "
       "name_from=attribute url=fakepdfurl.pdf clips_children "
@@ -2170,13 +2167,8 @@
       "scroll_x_min=0 scroll_y_min=0 restriction=readonly text_align=left "
       "scrollable=true is_line_breaking_object=true\n"
       "  id=10000 banner <div> child_ids=10001 offset_container_id=1 (-1, "
-      "-1)-(1, 1) text_align=left ";
-  expected +=
-      features::IsAccessibilityUseAXBitsetEnabled()
-          ? "is_line_breaking_object=true is_page_breaking_object=true "
-          : "is_page_breaking_object=true is_line_breaking_object=true ";
-  expected +=
-      "has_aria_attribute=true\n"
+      "-1)-(1, 1) text_align=left is_page_breaking_object=true "
+      "is_line_breaking_object=true has_aria_attribute=true\n"
       "    id=10001 status <div> child_ids=10002 offset_container_id=10000 (0, "
       "0)-(1, 1) text_align=left container_relevant=additions text "
       "container_live=polite relevant=additions text live=polite "
@@ -2194,8 +2186,8 @@
       "8) restriction=readonly is_page_breaking_object=true\n"
       "  id=3 region name=Page 2 name_from=attribute "
       "has_child_tree (0, 0)-(3, "
-      "8) restriction=readonly is_page_breaking_object=true\n";
-  EXPECT_EQ(expected, service_->GetDocumentTreeToStringForTesting());
+      "8) restriction=readonly is_page_breaking_object=true\n",
+      service_->GetDocumentTreeToStringForTesting());
 }
 
 IN_PROC_BROWSER_TEST_F(AXMediaAppUntrustedServiceTest,
diff --git a/chrome/browser/actor/site_policy.cc b/chrome/browser/actor/site_policy.cc
index 1a7ec47c..4cb0e8d 100644
--- a/chrome/browser/actor/site_policy.cc
+++ b/chrome/browser/actor/site_policy.cc
@@ -17,6 +17,8 @@
 #include "chrome/browser/actor/actor_features.h"
 #include "chrome/browser/actor/aggregated_journal.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/lookalikes/lookalike_url_service.h"
+#include "chrome/browser/lookalikes/lookalike_url_service_factory.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
@@ -173,6 +175,25 @@
     }
   }
 
+  auto* lookalike_service = LookalikeUrlServiceFactory::GetForProfile(profile);
+  LookalikeUrlService::LookalikeUrlCheckResult lookalike_result =
+      lookalike_service->CheckUrlForLookalikes(
+          url, lookalike_service->GetLatestEngagedSites(),
+          /*stop_checking_on_allowlist_or_ignore=*/true);
+  if (lookalike_result.action_type != lookalikes::LookalikeActionType::kNone &&
+      lookalike_result.action_type !=
+          lookalikes::LookalikeActionType::kRecordMetrics) {
+    // Out of caution, do not act on lookalike domains.
+    // For now, we just accept the possibility of false positives.
+    // Note that this is partially redundant in the case where the lookalike
+    // detection shows an interstitial, since we don't act on interstitials.
+    // However, it may be that the navigation is allowed and a safety tip is
+    // shown instead. We consider that sufficient cause for concern for actor
+    // code.
+    decision_wrapper->Reject("Lookalike domain");
+    return;
+  }
+
   if (auto* optimization_guide_decider =
           OptimizationGuideKeyedServiceFactory::GetForProfile(profile);
       optimization_guide_decider &&
diff --git a/chrome/browser/actor/site_policy_browsertest.cc b/chrome/browser/actor/site_policy_browsertest.cc
index d49b270..0399de4 100644
--- a/chrome/browser/actor/site_policy_browsertest.cc
+++ b/chrome/browser/actor/site_policy_browsertest.cc
@@ -12,6 +12,7 @@
 #include "base/test/test_future.h"
 #include "chrome/browser/actor/actor_features.h"
 #include "chrome/browser/actor/actor_keyed_service.h"
+#include "chrome/browser/lookalikes/lookalike_test_helper.h"
 #include "chrome/browser/optimization_guide/browser_test_util.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
@@ -38,6 +39,11 @@
 
 namespace {
 
+// Hosts that will trigger lookalike warnings. One causes an interstitial and
+// the other only a safety tip.
+constexpr char kLookalikeHostInterstitial[] = "google.com.example.com";
+constexpr char kLookalikeHostWarning[] = "accounts-google.com";
+
 #if BUILDFLAG(SAFE_BROWSING_AVAILABLE)
 
 class ActorSitePolicyBrowserTest : public InProcessBrowserTest {
@@ -88,6 +94,10 @@
   void SetUpOnMainThread() override {
     InProcessBrowserTest::SetUpOnMainThread();
     host_resolver()->AddRule("*", "127.0.0.1");
+    LookalikeTestHelper::SetUpLookalikeTestParams();
+    embedded_https_test_server().SetCertHostnames(
+        {"a.com", "b.com", "c.com", "bar.com", "*.bar.com",
+         kLookalikeHostInterstitial, kLookalikeHostWarning});
     ASSERT_TRUE(embedded_https_test_server().Start());
 
     // Optimization guide uses this histogram to signal initialization in tests.
@@ -98,6 +108,11 @@
     InitActionBlocklist(browser()->profile());
   }
 
+  void TearDownOnMainThread() override {
+    LookalikeTestHelper::TearDownLookalikeTestParams();
+    InProcessBrowserTest::TearDownOnMainThread();
+  }
+
  protected:
   void CheckUrl(const GURL& url, bool expected_allowed) {
     ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
@@ -141,6 +156,19 @@
   CheckUrl(blocked_url, false);
 }
 
+IN_PROC_BROWSER_TEST_F(ActorSitePolicyBrowserTest, BlockLookalikes) {
+  const GURL lookalike_url = embedded_https_test_server().GetURL(
+      kLookalikeHostInterstitial, "/title1.html");
+  CheckUrl(lookalike_url, false);
+}
+
+IN_PROC_BROWSER_TEST_F(ActorSitePolicyBrowserTest,
+                       TreatLookalikeWarningsAsBlocking) {
+  const GURL lookalike_url = embedded_https_test_server().GetURL(
+      kLookalikeHostWarning, "/title1.html");
+  CheckUrl(lookalike_url, false);
+}
+
 class ActorSitePolicySafeBrowsingBrowserTest
     : public ActorSitePolicyBrowserTest {
  public:
diff --git a/chrome/browser/actor/tools/page_tool.cc b/chrome/browser/actor/tools/page_tool.cc
index 4ecc8245..a3440dd7 100644
--- a/chrome/browser/actor/tools/page_tool.cc
+++ b/chrome/browser/actor/tools/page_tool.cc
@@ -141,18 +141,12 @@
     return true;
   }
 
-  // TODO(bokan): This helper should take a gfx::Point.
-  gfx::Point coordinate = target.coordinate();
-  optimization_guide::proto::Coordinate apc_coordinate;
-  apc_coordinate.set_x(coordinate.x());
-  apc_coordinate.set_y(coordinate.y());
-
   // TODO(crbug.com/426021822): FindNodeAtPoint does not handle corner cases
   // like clip paths. Need more checks to ensure we don't drop actions
   // unnecessarily.
   std::optional<optimization_guide::TargetNodeInfo> target_node_info =
       optimization_guide::FindNodeAtPoint(*last_observed_page_content,
-                                          apc_coordinate);
+                                          target.coordinate());
   if (!target_node_info) {
     return false;
   }
diff --git a/chrome/browser/ash/app_list/search/omnibox/BUILD.gn b/chrome/browser/ash/app_list/search/omnibox/BUILD.gn
index 5ee675e4..2922538 100644
--- a/chrome/browser/ash/app_list/search/omnibox/BUILD.gn
+++ b/chrome/browser/ash/app_list/search/omnibox/BUILD.gn
@@ -33,6 +33,7 @@
     "//chrome/browser/ash/app_list/search",
     "//chrome/browser/ash/app_list/search/common",
     "//chrome/browser/ash/app_list/search/ranking",
+    "//chrome/browser/autocomplete",
     "//chrome/browser/bitmap_fetcher",
     "//chrome/browser/favicon",
     "//chrome/browser/profiles:profile",
diff --git a/chrome/browser/ash/child_accounts/parent_access_code/parent_access_service.cc b/chrome/browser/ash/child_accounts/parent_access_code/parent_access_service.cc
index a143d83..8cf510cf 100644
--- a/chrome/browser/ash/child_accounts/parent_access_code/parent_access_service.cc
+++ b/chrome/browser/ash/child_accounts/parent_access_code/parent_access_service.cc
@@ -18,7 +18,6 @@
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_registry_simple.h"
-#include "components/user_manager/known_user.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
 
@@ -53,20 +52,6 @@
   return device_owner->IsChild();
 }
 
-// Returns true is any parent code config is available on the device.
-bool IsParentCodeConfigAvailable() {
-  const user_manager::UserList& users =
-      user_manager::UserManager::Get()->GetPersistedUsers();
-  user_manager::KnownUser known_user(g_browser_process->local_state());
-  for (const user_manager::User* user : users) {
-    if (known_user.FindPath(user->GetAccountId(),
-                            prefs::kKnownUserParentAccessCodeConfig)) {
-      return true;
-    }
-  }
-  return false;
-}
-
 }  // namespace
 
 // static
@@ -92,13 +77,7 @@
     case SupervisedAction::kAddUser:
       return IsDeviceOwnedByChild();
     case SupervisedAction::kReauth:
-      if (!features::IsParentAccessCodeForReauthEnabled()) {
-        return false;
-      }
-      if (!IsParentCodeConfigAvailable()) {
-        return false;
-      }
-      return IsDeviceOwnedByChild();
+      return false;
     case SupervisedAction::kUnlockTimeLimits:
       DCHECK(user_manager::UserManager::Get()->IsUserLoggedIn());
       return true;
diff --git a/chrome/browser/ash/child_accounts/parent_access_code/parent_access_service_browsertest.cc b/chrome/browser/ash/child_accounts/parent_access_code/parent_access_service_browsertest.cc
index 2a83ed8..d48daa7 100644
--- a/chrome/browser/ash/child_accounts/parent_access_code/parent_access_service_browsertest.cc
+++ b/chrome/browser/ash/child_accounts/parent_access_code/parent_access_service_browsertest.cc
@@ -14,12 +14,10 @@
 #include "base/json/json_writer.h"
 #include "chrome/browser/ash/child_accounts/parent_access_code/config_source.h"
 #include "chrome/browser/ash/child_accounts/parent_access_code/parent_access_test_utils.h"
-#include "chrome/browser/ash/login/test/feature_parameter_interface.h"
 #include "chrome/browser/ash/login/test/logged_in_user_mixin.h"
 #include "chrome/browser/ash/policy/core/user_policy_test_helper.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/test/base/mixin_based_in_process_browser_test.h"
 #include "components/account_id/account_id.h"
 #include "components/prefs/pref_service.h"
@@ -30,9 +28,6 @@
 
 namespace ash::parent_access {
 
-const auto kAllFeatureStates = FeatureAsParameterInterface<1>::Generator(
-    {&::features::kSkipParentAccessCodeForReauth});
-
 // Stores information about results of the access code validation.
 struct CodeValidationResults {
   // Number of successful access code validations.
@@ -70,9 +65,7 @@
   const AccountId account_id_;
 };
 
-class ParentAccessServiceTest
-    : public MixinBasedInProcessBrowserTest,
-      public ::testing::WithParamInterface<FeatureStateArray<1>> {
+class ParentAccessServiceTest : public MixinBasedInProcessBrowserTest {
  public:
   ParentAccessServiceTest()
       : test_observer_(std::make_unique<TestParentAccessServiceObserver>(
@@ -140,7 +133,7 @@
   std::unique_ptr<TestParentAccessServiceObserver> test_observer_;
 };
 
-IN_PROC_BROWSER_TEST_P(ParentAccessServiceTest, NoConfigAvailable) {
+IN_PROC_BROWSER_TEST_F(ParentAccessServiceTest, NoConfigAvailable) {
   auto test_value = test_values_.begin();
   EXPECT_EQ(ParentCodeValidationResult::kNoConfig,
             ValidateAccessCode(test_value->second, test_value->first));
@@ -148,7 +141,7 @@
   ExpectResults(0, 1);
 }
 
-IN_PROC_BROWSER_TEST_P(ParentAccessServiceTest, NoValidConfigAvailable) {
+IN_PROC_BROWSER_TEST_F(ParentAccessServiceTest, NoValidConfigAvailable) {
   std::vector<AccessCodeConfig> old_configs;
   old_configs.emplace_back(GetInvalidTestConfig());
   UpdatePolicy(PolicyFromConfigs(GetInvalidTestConfig(), GetInvalidTestConfig(),
@@ -161,7 +154,7 @@
   ExpectResults(0, 1);
 }
 
-IN_PROC_BROWSER_TEST_P(ParentAccessServiceTest, ValidationWithFutureConfig) {
+IN_PROC_BROWSER_TEST_F(ParentAccessServiceTest, ValidationWithFutureConfig) {
   std::vector<AccessCodeConfig> old_configs;
   old_configs.emplace_back(GetInvalidTestConfig());
   UpdatePolicy(PolicyFromConfigs(GetDefaultTestConfig(), GetInvalidTestConfig(),
@@ -174,7 +167,7 @@
   ExpectResults(1, 0);
 }
 
-IN_PROC_BROWSER_TEST_P(ParentAccessServiceTest, ValidationWithCurrentConfig) {
+IN_PROC_BROWSER_TEST_F(ParentAccessServiceTest, ValidationWithCurrentConfig) {
   std::vector<AccessCodeConfig> old_configs;
   old_configs.emplace_back(GetInvalidTestConfig());
   UpdatePolicy(PolicyFromConfigs(GetInvalidTestConfig(), GetDefaultTestConfig(),
@@ -187,7 +180,7 @@
   ExpectResults(1, 0);
 }
 
-IN_PROC_BROWSER_TEST_P(ParentAccessServiceTest, ValidationWithOldConfig) {
+IN_PROC_BROWSER_TEST_F(ParentAccessServiceTest, ValidationWithOldConfig) {
   std::vector<AccessCodeConfig> old_configs;
   old_configs.emplace_back(GetInvalidTestConfig());
   old_configs.emplace_back(GetDefaultTestConfig());
@@ -201,7 +194,7 @@
   ExpectResults(1, 0);
 }
 
-IN_PROC_BROWSER_TEST_P(ParentAccessServiceTest, MultipleValidationAttempts) {
+IN_PROC_BROWSER_TEST_F(ParentAccessServiceTest, MultipleValidationAttempts) {
   AccessCodeValues::iterator test_value = test_values_.begin();
 
   // No config - validation should fail.
@@ -227,7 +220,7 @@
   ExpectResults(test_values_.size(), 2);
 }
 
-IN_PROC_BROWSER_TEST_P(ParentAccessServiceTest, NoObserver) {
+IN_PROC_BROWSER_TEST_F(ParentAccessServiceTest, NoObserver) {
   ParentAccessService::Get().RemoveObserver(test_observer_.get());
 
   UpdatePolicy(
@@ -240,7 +233,7 @@
   ExpectResults(0, 0);
 }
 
-IN_PROC_BROWSER_TEST_P(ParentAccessServiceTest, NoAccountId) {
+IN_PROC_BROWSER_TEST_F(ParentAccessServiceTest, NoAccountId) {
   ParentAccessService::Get().RemoveObserver(test_observer_.get());
 
   UpdatePolicy(
@@ -253,7 +246,7 @@
                 EmptyAccountId(), test_value->second, test_value->first));
 }
 
-IN_PROC_BROWSER_TEST_P(ParentAccessServiceTest, InvalidAccountId) {
+IN_PROC_BROWSER_TEST_F(ParentAccessServiceTest, InvalidAccountId) {
   ParentAccessService::Get().RemoveObserver(test_observer_.get());
 
   UpdatePolicy(
@@ -267,7 +260,7 @@
                 other_child, test_value->second, test_value->first));
 }
 
-IN_PROC_BROWSER_TEST_P(ParentAccessServiceTest,
+IN_PROC_BROWSER_TEST_F(ParentAccessServiceTest,
                        ChildDeviceOwner_IsApprovalRequired) {
   user_manager::UserManager::Get()->SetOwnerId(
       logged_in_user_mixin_.GetAccountId());
@@ -292,8 +285,8 @@
   // Login screen.
   EXPECT_TRUE(
       ParentAccessService::IsApprovalRequired(SupervisedAction::kAddUser));
-  EXPECT_EQ(::features::IsParentAccessCodeForReauthEnabled(),
-            ParentAccessService::IsApprovalRequired(SupervisedAction::kReauth));
+  EXPECT_FALSE(
+      ParentAccessService::IsApprovalRequired(SupervisedAction::kReauth));
   // In session, because child user is logged in the test fixture.
   EXPECT_TRUE(ParentAccessService::IsApprovalRequired(
       SupervisedAction::kUnlockTimeLimits));
@@ -303,7 +296,7 @@
       SupervisedAction::kUpdateTimezone));
 }
 
-IN_PROC_BROWSER_TEST_P(ParentAccessServiceTest,
+IN_PROC_BROWSER_TEST_F(ParentAccessServiceTest,
                        RegularDeviceOwner_IsApprovalRequired) {
   auto* user_manager = user_manager::UserManager::Get();
   const AccountId regular_user =
@@ -343,9 +336,4 @@
       SupervisedAction::kUpdateTimezone));
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         ParentAccessServiceTest,
-                         testing::ValuesIn(kAllFeatureStates),
-                         FeatureAsParameterInterface<1>::ParamInfoToString);
-
 }  // namespace ash::parent_access
diff --git a/chrome/browser/ash/drive/file_system_util_unittest.cc b/chrome/browser/ash/drive/file_system_util_unittest.cc
index 9c17b39..79df1c6 100644
--- a/chrome/browser/ash/drive/file_system_util_unittest.cc
+++ b/chrome/browser/ash/drive/file_system_util_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "ash/constants/ash_features.h"
 #include "base/files/file_path.h"
+#include "base/test/test_file_util.h"
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/test/base/fake_gaia_mixin.h"
@@ -54,7 +55,7 @@
 }
 
 TEST_F(ProfileRelatedFileSystemUtilTest, GetCacheRootPath) {
-  TestingProfile profile;
+  TestingProfile profile(base::CreateUniqueTempDirectoryScopedToTest());
   base::FilePath profile_path = profile.GetPath();
   EXPECT_EQ(profile_path.AppendASCII("GCache/v1"),
             util::GetCacheRootPath(&profile));
diff --git a/chrome/browser/ash/login/demo_mode/BUILD.gn b/chrome/browser/ash/login/demo_mode/BUILD.gn
index 083c3a73..69f5276f 100644
--- a/chrome/browser/ash/login/demo_mode/BUILD.gn
+++ b/chrome/browser/ash/login/demo_mode/BUILD.gn
@@ -75,6 +75,8 @@
     "//third_party/icu:icui18n_hidden_visibility",
     "//third_party/icu:icuuc_public",
     "//third_party/re2",
+    "//ui/message_center",
+    "//ui/message_center/public/cpp",
     "//ui/views",
   ]
 
diff --git a/chrome/browser/ash/login/demo_mode/DEPS b/chrome/browser/ash/login/demo_mode/DEPS
index e2d59fd5..46c8039 100644
--- a/chrome/browser/ash/login/demo_mode/DEPS
+++ b/chrome/browser/ash/login/demo_mode/DEPS
@@ -46,6 +46,9 @@
   "+chrome/common/chrome_paths.h",
   "+chrome/common/extensions",
   "+chrome/grit",
+
+  # Dependencies outside of //chrome:
+  "+ui/message_center/message_center.h",
 ]
 
 specific_include_rules = {
diff --git a/chrome/browser/ash/login/demo_mode/demo_mode_idle_handler.cc b/chrome/browser/ash/login/demo_mode/demo_mode_idle_handler.cc
index 45bfd890..8a81947 100644
--- a/chrome/browser/ash/login/demo_mode/demo_mode_idle_handler.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_mode_idle_handler.cc
@@ -8,8 +8,12 @@
 
 #include "ash/constants/ash_features.h"
 #include "ash/constants/ash_pref_names.h"
+#include "ash/constants/notifier_catalogs.h"
 #include "ash/metrics/demo_session_metrics_recorder.h"
+#include "ash/public/cpp/new_window_delegate.h"
+#include "ash/public/cpp/notification_utils.h"
 #include "ash/public/cpp/wallpaper/wallpaper_controller.h"
+#include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
 #include "base/files/file_enumerator.h"
@@ -22,12 +26,15 @@
 #include "chrome/browser/ash/drive/drive_integration_service.h"
 #include "chrome/browser/ash/drive/drive_integration_service_factory.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/grit/generated_resources.h"
 #include "chromeos/ash/components/demo_mode/utils/demo_session_utils.h"
 #include "chromeos/ash/experiences/idle_detector/idle_detector.h"
 #include "components/drive/file_system_core_util.h"
 #include "components/prefs/pref_service.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/message_center/message_center.h"
 
 namespace ash {
 
@@ -42,6 +49,9 @@
 constexpr base::TimeDelta kLogoutDelayMin = base::Minutes(60);
 constexpr base::TimeDelta kLogoutDelayMax = base::Minutes(90);
 
+constexpr char kDemoSessionToSNotificationId[] = "demo_session_ToS";
+constexpr char kGooglePoliciesURL[] = "https://policies.google.com/";
+
 // The list of prefs that are reset on the start of each shopper session.
 const char* const kPrefsPrefixToReset[] = {
     "settings.audio", prefs::kPowerAcScreenBrightnessPercent,
@@ -132,6 +142,59 @@
 
 DemoModeIdleHandler::~DemoModeIdleHandler() = default;
 
+void ShowNotification() {
+  const std::u16string notification_title =
+      l10n_util::GetStringUTF16(IDS_DEMO_SESSION_TOS_NOTIFICATION_TITLE);
+  const std::u16string notification_message =
+      l10n_util::GetStringUTF16(IDS_DEMO_SESSION_TOS_NOTIFICATION_MESSAGE);
+  const std::u16string button_text =
+      l10n_util::GetStringUTF16(IDS_DEMO_SESSION_TOS_NOTIFICATION_BUTTON_TEXT);
+
+  message_center::RichNotificationData optional_fields;
+  // Set a higher priority to make sure it displays even with Do Not Disturb
+  // (DND) enabled.
+  optional_fields.priority =
+      message_center::NotificationPriority::SYSTEM_PRIORITY;
+  // Add "Learn more" button
+  optional_fields.buttons.emplace_back(message_center::ButtonInfo(button_text));
+
+  const gfx::VectorIcon& privacy_indicator_icon = kPrivacyIndicatorsIcon;
+
+  std::unique_ptr<message_center::Notification> notification =
+      ash::CreateSystemNotificationPtr(
+          message_center::NOTIFICATION_TYPE_SIMPLE,
+          kDemoSessionToSNotificationId, notification_title,
+          notification_message,
+          /*display_source=*/std::u16string(),
+          /*origin_url=*/GURL(),
+          message_center::NotifierId(
+              message_center::NotifierType::SYSTEM_COMPONENT,
+              kDemoSessionToSNotificationId,
+              ash::NotificationCatalogName::kDemoMode),
+          optional_fields,
+          // Open the URL when the button is clicked
+          // https://policies.google.com/
+          base::MakeRefCounted<message_center::HandleNotificationClickDelegate>(
+              base::BindRepeating([](std::optional<int> button_index) {
+                if (button_index.has_value() && button_index.value() == 0) {
+                  ash::NewWindowDelegate::GetPrimary()->OpenUrl(
+                      GURL(kGooglePoliciesURL),
+                      ash::NewWindowDelegate::OpenUrlFrom::kUserInteraction,
+                      ash::NewWindowDelegate::Disposition::kNewForegroundTab);
+                }
+              })),
+          privacy_indicator_icon,
+          // Demo mode has DND turned on by default, we need the warning level
+          // to be CRITICAL_WARNING to display the notification.
+          message_center::SystemNotificationWarningLevel::CRITICAL_WARNING);
+
+  auto* message_center = message_center::MessageCenter::Get();
+  CHECK(message_center);
+
+  message_center->RemoveNotification(notification->id(), /*by_user=*/false);
+  message_center->AddNotification(std::move(notification));
+}
+
 void DemoModeIdleHandler::OnUserActivity(const ui::Event* event) {
   // If there's user activity, no need `mgs_logout_timer_` any more. Device will
   // auto logout after 90s idle if logout is required.
@@ -162,6 +225,10 @@
                           weak_ptr_factory_.GetWeakPtr()),
       /*tick_clock=*/nullptr);
 
+  if (features::IsDemoSessionToSNotificationEnabled()) {
+    ShowNotification();
+  }
+
   idle_detector_->Start(
       idle_time_out_for_test_.value_or(kReLuanchDemoAppIdleDuration));
 }
diff --git a/chrome/browser/ash/login/demo_mode/demo_mode_idle_handler_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_mode_idle_handler_unittest.cc
index 71890277..9e2a315 100644
--- a/chrome/browser/ash/login/demo_mode/demo_mode_idle_handler_unittest.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_mode_idle_handler_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "ash/clipboard/clipboard_history_controller_impl.h"
 #include "ash/clipboard/clipboard_history_item.h"
+#include "ash/constants/ash_features.h"
 #include "ash/constants/ash_pref_names.h"
 #include "ash/metrics/demo_session_metrics_recorder.h"
 #include "ash/public/cpp/wallpaper/wallpaper_info.h"
@@ -17,6 +18,7 @@
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/thread_pool.h"
 #include "base/test/bind.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
 #include "base/time/time.h"
@@ -25,6 +27,7 @@
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_list.h"
+#include "chrome/grit/generated_resources.h"
 #include "chrome/test/base/chrome_ash_test_base.h"
 #include "chrome/test/base/test_browser_window.h"
 #include "chrome/test/base/testing_browser_process.h"
@@ -37,7 +40,9 @@
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/base/clipboard/scoped_clipboard_writer.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/base/user_activity/user_activity_detector.h"
+#include "ui/message_center/message_center.h"
 
 namespace ash {
 namespace {
@@ -50,6 +55,8 @@
     AccountId::FromUserEmailGaiaId(kUser, GaiaId("1111"));
 constexpr SkColor kWallpaperColor = SK_ColorMAGENTA;
 
+constexpr char kDemoSessionToSNotificationId[] = "demo_session_ToS";
+
 }  // namespace
 
 class DemoModeIdleHandlerTestBase : public ChromeAshTestBase {
@@ -58,6 +65,9 @@
       : ChromeAshTestBase(std::make_unique<content::BrowserTaskEnvironment>(
             base::test::TaskEnvironment::TimeSource::MOCK_TIME)),
         profile_manager_(TestingBrowserProcess::GetGlobal()) {
+    scoped_feature_list_.InitWithFeatures(
+        /*enabled_features=*/{features::kDemoSessionToSNotification},
+        /*disabled_features=*/{});
   }
   ~DemoModeIdleHandlerTestBase() override = default;
 
@@ -150,6 +160,7 @@
       wallpaper_controller_ = nullptr;
   base::ScopedTempDir user_data_dir_;
   std::unique_ptr<DemoSessionMetricsRecorder> metrics_recorder_;
+  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
 // DemoIdleHandler test for shopper session.
@@ -225,6 +236,33 @@
   EXPECT_TRUE(no_items.empty());
 }
 
+TEST_F(DemoModeIdleHandlerTest, ToSNotificationShown) {
+  auto* message_center = message_center::MessageCenter::Get();
+  message_center::Notification* notification =
+      message_center->FindVisibleNotificationById(
+          kDemoSessionToSNotificationId);
+  // The notification is not shown before the user's first activity.
+  EXPECT_FALSE(notification);
+
+  SimulateUserActivity();
+  // The notification is shown after the user's first activity.
+  notification = message_center->FindVisibleNotificationById(
+      kDemoSessionToSNotificationId);
+  EXPECT_TRUE(notification);
+
+  // Confirm the title and the message of the notification.
+  const std::u16string notification_title =
+      l10n_util::GetStringUTF16(IDS_DEMO_SESSION_TOS_NOTIFICATION_TITLE);
+  const std::u16string notification_message =
+      l10n_util::GetStringUTF16(IDS_DEMO_SESSION_TOS_NOTIFICATION_MESSAGE);
+
+  EXPECT_EQ(notification->title(), notification_title);
+  EXPECT_EQ(notification->message(), notification_message);
+
+  // Reset the current shopper session so it won't affect following tests.
+  FastForwardBy(kReLuanchDemoAppIdleDuration);
+}
+
 TEST_F(DemoModeIdleHandlerTest, ResetWallpaper) {
   // Set a custom wallpaper at first.
   SkBitmap bitmap;
diff --git a/chrome/browser/autocomplete/BUILD.gn b/chrome/browser/autocomplete/BUILD.gn
new file mode 100644
index 0000000..c54337ae
--- /dev/null
+++ b/chrome/browser/autocomplete/BUILD.gn
@@ -0,0 +1,15 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("autocomplete") {
+  sources = [
+    "autocomplete_classifier_factory.h",
+    "chrome_autocomplete_scheme_classifier.h",
+  ]
+  public_deps = [
+    "//base",
+    "//chrome/browser/profiles:profile",
+    "//components/omnibox/browser:location_bar",
+  ]
+}
diff --git a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsOffsetTagsInfo.java b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsOffsetTagsInfo.java
index 2113c9c3..a6c2849 100644
--- a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsOffsetTagsInfo.java
+++ b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsOffsetTagsInfo.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.browser_controls;
 
+import androidx.annotation.NonNull;
+
 import com.google.errorprone.annotations.DoNotMock;
 
 import org.chromium.build.annotations.NullMarked;
@@ -51,11 +53,11 @@
         return mTags.hasTags();
     }
 
-    public BrowserControlsOffsetTags getTags() {
+    public @NonNull BrowserControlsOffsetTags getTags() {
         return mTags;
     }
 
-    public BrowserControlsOffsetTagConstraints getConstraints() {
+    public @NonNull BrowserControlsOffsetTagConstraints getConstraints() {
         return new BrowserControlsOffsetTagConstraints(
                 mTopControlsConstraints, mContentConstraints, mBottomControlsConstraints);
     }
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index 9abd15c..5dcce57 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -996,17 +996,6 @@
             CreateTaskCompletionClosureForMojo(
                 TracingDataType::kHttpAuthCache));
 
-    scoped_refptr<payments::PaymentManifestWebDataService> web_data_service =
-        webdata_services::WebDataServiceWrapperFactory::
-            GetPaymentManifestWebDataServiceForBrowserContext(
-                profile_, ServiceAccessType::EXPLICIT_ACCESS);
-    if (web_data_service) {
-      web_data_service->ClearSecurePaymentConfirmationCredentials(
-          delete_begin_, delete_end_,
-          CreateTaskCompletionClosure(
-              TracingDataType::kSecurePaymentConfirmationCredentials));
-    }
-
 #if BUILDFLAG(IS_CHROMEOS)
     if (ash::SystemProxyManager::Get()) {
       // Sends a request to the System-proxy daemon to clear the proxy user
@@ -1136,23 +1125,26 @@
           FROM_HERE, base::DoNothing(),
           CreateTaskCompletionClosure(TracingDataType::kAutofillData));
     }
+  }
 
+  if ((remove_mask & constants::DATA_TYPE_PASSWORDS)
 #if !BUILDFLAG(IS_ANDROID)
-    if (base::FeatureList::IsEnabled(
-            browsing_data::features::kDbdRevampDesktop)) {
-      scoped_refptr<payments::PaymentManifestWebDataService>
-          payment_web_data_service =
-              webdata_services::WebDataServiceWrapperFactory::
-                  GetPaymentManifestWebDataServiceForBrowserContext(
-                      profile_, ServiceAccessType::EXPLICIT_ACCESS);
-      if (payment_web_data_service) {
-        payment_web_data_service->ClearSecurePaymentConfirmationCredentials(
-            delete_begin_, delete_end_,
-            CreateTaskCompletionClosure(
-                TracingDataType::kSecurePaymentConfirmationCredentials));
-      }
-    }
+      ||
+      ((remove_mask & constants::DATA_TYPE_FORM_DATA) &&
+       base::FeatureList::IsEnabled(browsing_data::features::kDbdRevampDesktop))
 #endif  // !BUILDFLAG(IS_ANDROID)
+  ) {
+    scoped_refptr<payments::PaymentManifestWebDataService>
+        payment_web_data_service =
+            webdata_services::WebDataServiceWrapperFactory::
+                GetPaymentManifestWebDataServiceForBrowserContext(
+                    profile_, ServiceAccessType::EXPLICIT_ACCESS);
+    if (payment_web_data_service) {
+      payment_web_data_service->ClearSecurePaymentConfirmationCredentials(
+          delete_begin_, delete_end_,
+          CreateTaskCompletionClosure(
+              TracingDataType::kSecurePaymentConfirmationCredentials));
+    }
   }
 
   //////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/chromeos/extensions/smart_card_provider_private/smart_card_provider_private_apitest.cc b/chrome/browser/chromeos/extensions/smart_card_provider_private/smart_card_provider_private_apitest.cc
index e972aa5..c744e57 100644
--- a/chrome/browser/chromeos/extensions/smart_card_provider_private/smart_card_provider_private_apitest.cc
+++ b/chrome/browser/chromeos/extensions/smart_card_provider_private/smart_card_provider_private_apitest.cc
@@ -7,6 +7,7 @@
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/test_future.h"
 #include "base/time/time.h"
 #include "chrome/browser/chromeos/extensions/smart_card_provider_private/smart_card_provider_private_api.h"
@@ -26,6 +27,7 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/features_generated.h"
 
 namespace scard_api = extensions::api::smart_card_provider_private;
 
@@ -318,6 +320,7 @@
 
  private:
   raw_ptr<const Extension, DanglingUntriaged> extension_;
+  base::test::ScopedFeatureList feature_list_{blink::features::kSmartCard};
 };
 
 class EventObserver : public EventRouter::TestObserver {
diff --git a/chrome/browser/download/download_offline_content_provider.cc b/chrome/browser/download/download_offline_content_provider.cc
index 75882f7..cfc1132 100644
--- a/chrome/browser/download/download_offline_content_provider.cc
+++ b/chrome/browser/download/download_offline_content_provider.cc
@@ -24,6 +24,7 @@
 #include "components/download/public/common/download_danger_type.h"
 #include "components/download/public/common/download_features.h"
 #include "components/download/public/common/download_item.h"
+#include "components/safe_browsing/buildflags.h"
 #include "content/public/browser/browser_context.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/display/display.h"
@@ -43,7 +44,12 @@
 #include "content/public/browser/download_manager_delegate.h"
 #include "content/public/common/content_features.h"
 #include "ui/base/device_form_factor.h"
-#endif
+
+#if BUILDFLAG(SAFE_BROWSING_DOWNLOAD_PROTECTION)
+#include "chrome/browser/download/download_ui_safe_browsing_util.h"
+#include "chrome/browser/safe_browsing/download_protection/download_protection_util.h"
+#endif  // BUILDFLAG(SAFE_BROWSING_DOWNLOAD_PROTECTION)
+#endif  // BUILDFLAG(IS_ANDROID)
 
 using OfflineItemFilter = offline_items_collection::OfflineItemFilter;
 using OfflineItemState = offline_items_collection::OfflineItemState;
@@ -295,6 +301,12 @@
   DownloadItem* item = GetDownload(id.id);
   if (item && !item->IsDone() && item->IsDangerous()) {
     item->ValidateDangerousDownload();
+#if BUILDFLAG(SAFE_BROWSING_DOWNLOAD_PROTECTION) && BUILDFLAG(IS_ANDROID)
+    SendSafeBrowsingDownloadReport(
+        safe_browsing::ClientSafeBrowsingReportRequest::
+            DANGEROUS_DOWNLOAD_WARNING_ANDROID,
+        /*did_proceed=*/true, item);
+#endif
   }
 }
 
diff --git a/chrome/browser/download/download_offline_content_provider_unittest.cc b/chrome/browser/download/download_offline_content_provider_unittest.cc
index 3f559f16..de3ead69 100644
--- a/chrome/browser/download/download_offline_content_provider_unittest.cc
+++ b/chrome/browser/download/download_offline_content_provider_unittest.cc
@@ -18,9 +18,18 @@
 #include "components/download/public/common/mock_download_item.h"
 #include "components/download/public/common/mock_simple_download_manager.h"
 #include "components/offline_items_collection/core/test_support/scoped_mock_offline_content_provider.h"
+#include "components/safe_browsing/buildflags.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if BUILDFLAG(SAFE_BROWSING_DOWNLOAD_PROTECTION) && BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/safe_browsing/download_protection/download_protection_util.h"
+#include "chrome/browser/safe_browsing/test_safe_browsing_service.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "components/safe_browsing/core/common/proto/csd.pb.h"
+#include "content/public/test/browser_task_environment.h"
+#endif
+
 using ::testing::_;
 using ::testing::Eq;
 using ::testing::Field;
@@ -40,18 +49,21 @@
 
 }  // namespace
 
-class DownloadOfflineContentProviderTest : public testing::Test {
+class DownloadOfflineContentProviderTestBase : public testing::Test {
  public:
-  DownloadOfflineContentProviderTest()
-      : provider_(&aggregator_, kTestDownloadNamespace),
+  // Subclasses must provide a TaskEnvironment directly.
+  explicit DownloadOfflineContentProviderTestBase(
+      std::unique_ptr<base::test::TaskEnvironment> task_environment)
+      : task_environment_(std::move(task_environment)),
+        provider_(&aggregator_, kTestDownloadNamespace),
         coordinator_(base::NullCallback()) {}
 
-  DownloadOfflineContentProviderTest(
-      const DownloadOfflineContentProviderTest&) = delete;
-  DownloadOfflineContentProviderTest& operator=(
-      const DownloadOfflineContentProviderTest&) = delete;
+  DownloadOfflineContentProviderTestBase(
+      const DownloadOfflineContentProviderTestBase&) = delete;
+  DownloadOfflineContentProviderTestBase& operator=(
+      const DownloadOfflineContentProviderTestBase&) = delete;
 
-  ~DownloadOfflineContentProviderTest() override = default;
+  ~DownloadOfflineContentProviderTestBase() override = default;
 
   void InitializeDownloads(bool full_browser) {
     coordinator_.SetSimpleDownloadManager(&mock_manager_, full_browser);
@@ -98,18 +110,26 @@
 
   void RunUntilMainThreadIdle() {
     ASSERT_TRUE(base::test::RunUntil(
-        [&]() { return task_environment_.MainThreadIsIdle(); }));
+        [&]() { return task_environment_->MainThreadIsIdle(); }));
   }
 
  protected:
-  base::test::SingleThreadTaskEnvironment task_environment_{
-      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+  std::unique_ptr<base::test::TaskEnvironment> task_environment_;
   OfflineContentAggregator aggregator_;
   DownloadOfflineContentProvider provider_;
   SimpleDownloadManagerCoordinator coordinator_;
   NiceMock<download::MockSimpleDownloadManager> mock_manager_;
 };
 
+class DownloadOfflineContentProviderTest
+    : public DownloadOfflineContentProviderTestBase {
+ public:
+  DownloadOfflineContentProviderTest()
+      : DownloadOfflineContentProviderTestBase(
+            std::make_unique<base::test::SingleThreadTaskEnvironment>(
+                base::test::TaskEnvironment::TimeSource::MOCK_TIME)) {}
+};
+
 TEST_F(DownloadOfflineContentProviderTest, PauseDownloadBeforeInit) {
   std::string guid = base::Uuid::GenerateRandomV4().AsLowercaseString();
   ContentId id(kTestDownloadNamespace, guid);
@@ -251,3 +271,67 @@
   provider_.OnDownloadUpdated(item.get());
   RunUntilMainThreadIdle();
 }
+
+#if BUILDFLAG(SAFE_BROWSING_DOWNLOAD_PROTECTION) && BUILDFLAG(IS_ANDROID)
+class DownloadOfflineContentProviderWithSafeBrowsingTest
+    : public DownloadOfflineContentProviderTestBase {
+ public:
+  DownloadOfflineContentProviderWithSafeBrowsingTest()
+      : DownloadOfflineContentProviderTestBase(
+            std::make_unique<content::BrowserTaskEnvironment>()) {}
+
+  void SetUp() override {
+    sb_service_ =
+        base::MakeRefCounted<safe_browsing::TestSafeBrowsingService>();
+    TestingBrowserProcess::GetGlobal()->SetSafeBrowsingService(
+        sb_service_.get());
+    g_browser_process->safe_browsing_service()->Initialize();
+
+    DownloadOfflineContentProviderTestBase::SetUp();
+  }
+
+  void TearDown() override {
+    DownloadOfflineContentProviderTestBase::TearDown();
+    TestingBrowserProcess::GetGlobal()->safe_browsing_service()->ShutDown();
+    TestingBrowserProcess::GetGlobal()->SetSafeBrowsingService(nullptr);
+    test_safe_browsing_service()->ClearDownloadReport();
+  }
+
+  safe_browsing::TestSafeBrowsingService* test_safe_browsing_service() {
+    return sb_service_.get();
+  }
+
+ protected:
+  scoped_refptr<safe_browsing::TestSafeBrowsingService> sb_service_;
+};
+
+// Tests that validating a download produces a Safe Browsing warning bypass
+// report.
+TEST_F(DownloadOfflineContentProviderWithSafeBrowsingTest,
+       ValidateSendsSafeBrowsingDownloadReport) {
+  std::string guid = base::Uuid::GenerateRandomV4().AsLowercaseString();
+  ContentId id(kTestDownloadNamespace, guid);
+
+  std::unique_ptr<download::MockDownloadItem> item =
+      CreateMockDownloadItem(guid);
+
+  EXPECT_CALL(*item, GetDangerType())
+      .WillRepeatedly(Return(download::DOWNLOAD_DANGER_TYPE_DANGEROUS_CONTENT));
+  EXPECT_CALL(*item, IsDangerous()).WillRepeatedly(Return(true));
+
+  InitializeDownloads(true);
+
+  provider_.ValidateDangerousDownload(id);
+  RunUntilMainThreadIdle();
+
+  safe_browsing::ClientSafeBrowsingReportRequest sent_report;
+  ASSERT_TRUE(sent_report.ParseFromString(
+      test_safe_browsing_service()->serialized_download_report()));
+
+  EXPECT_EQ(sent_report.type(), safe_browsing::ClientSafeBrowsingReportRequest::
+                                    DANGEROUS_DOWNLOAD_WARNING_ANDROID);
+
+  EXPECT_EQ(item->GetURL().spec(), sent_report.url());
+  EXPECT_TRUE(sent_report.did_proceed());
+}
+#endif  // BUILDFLAG(SAFE_BROWSING_DOWNLOAD_PROTECTION) && BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/enterprise/browser_management/browser_management_service.cc b/chrome/browser/enterprise/browser_management/browser_management_service.cc
index fd5947e9..c907726 100644
--- a/chrome/browser/enterprise/browser_management/browser_management_service.cc
+++ b/chrome/browser/enterprise/browser_management/browser_management_service.cc
@@ -154,6 +154,7 @@
   std::string logo_url = g_browser_process->local_state()->GetString(
       prefs::kEnterpriseLogoUrlForBrowser);
   if (logo_url.empty()) {
+    SetManagementIconForBrowser(gfx::Image());
     return;
   }
   enterprise_util::GetManagementIcon(
diff --git a/chrome/browser/enterprise/watermark/BUILD.gn b/chrome/browser/enterprise/watermark/BUILD.gn
index b45b254..54281edd 100644
--- a/chrome/browser/enterprise/watermark/BUILD.gn
+++ b/chrome/browser/enterprise/watermark/BUILD.gn
@@ -16,7 +16,7 @@
 
   deps = [
     "//chrome/common:channel_info",
-    "//components/enterprise/connectors/core:core",
+    "//components/enterprise/connectors/core",
     "//components/enterprise/watermarking",
     "//components/policy/core/browser",
     "//components/prefs",
diff --git a/chrome/browser/enterprise/watermark/settings.cc b/chrome/browser/enterprise/watermark/settings.cc
index 956edeb7..a5ab25f 100644
--- a/chrome/browser/enterprise/watermark/settings.cc
+++ b/chrome/browser/enterprise/watermark/settings.cc
@@ -7,6 +7,7 @@
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
+#include "chrome/browser/enterprise/watermark/watermark_features.h"
 #include "chrome/common/channel_info.h"
 #include "components/enterprise/connectors/core/connectors_prefs.h"
 #include "components/prefs/pref_service.h"
@@ -40,8 +41,8 @@
   int percent_value = prefs->GetInteger(pref_name);
   base::CommandLine* cmd = base::CommandLine::ForCurrentProcess();
   if (cmd->HasSwitch(cmd_opacity_percent_flag) &&
-      (chrome::GetChannel() != version_info::Channel::STABLE ||
-       chrome::GetChannel() != version_info::Channel::BETA)) {
+      chrome::GetChannel() != version_info::Channel::STABLE &&
+      chrome::GetChannel() != version_info::Channel::BETA) {
     int percent_from_flag;
     if (base::StringToInt(cmd->GetSwitchValueASCII(cmd_opacity_percent_flag),
                           &percent_from_flag)) {
@@ -64,12 +65,16 @@
 
 SkColor GetDefaultOutlineColor() {
   return SkColorSetA(
-      kBaseFillRGB,
+      kBaseOutlineRGB,
       PercentageToSkAlpha(
-          enterprise_connectors::kWatermarkStyleFillOpacityDefault));
+          enterprise_connectors::kWatermarkStyleOutlineOpacityDefault));
 }
 
 SkColor GetFillColor(const PrefService* prefs) {
+  if (!base::FeatureList::IsEnabled(
+          enterprise_watermark::kEnableWatermarkCustomization)) {
+    return GetDefaultFillColor();
+  }
   int alpha =
       GetOpacity(prefs, enterprise_connectors::kWatermarkStyleFillOpacityPref,
                  kWatermarkFillOpacityPercentFlag);
@@ -77,10 +82,13 @@
 }
 
 SkColor GetOutlineColor(const PrefService* prefs) {
+  if (!base::FeatureList::IsEnabled(
+          enterprise_watermark::kEnableWatermarkCustomization)) {
+    return GetDefaultOutlineColor();
+  }
   int alpha = GetOpacity(
       prefs, enterprise_connectors::kWatermarkStyleOutlineOpacityPref,
       kWatermarkOutlineOpacityPercentFlag);
   return SkColorSetA(kBaseOutlineRGB, alpha);
 }
-
 }  // namespace enterprise_watermark
diff --git a/chrome/browser/enterprise/watermark/watermark_browsertest.cc b/chrome/browser/enterprise/watermark/watermark_browsertest.cc
index 0b5c04c..bec096904 100644
--- a/chrome/browser/enterprise/watermark/watermark_browsertest.cc
+++ b/chrome/browser/enterprise/watermark/watermark_browsertest.cc
@@ -3,12 +3,17 @@
 // found in the LICENSE file.
 
 #include "base/test/scoped_feature_list.h"
+#include "chrome/browser/enterprise/watermark/settings.h"
+#include "chrome/browser/enterprise/watermark/watermark_features.h"
 #include "chrome/browser/enterprise/watermark/watermark_view.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/test/test_browser_ui.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/enterprise/connectors/core/connectors_prefs.h"
+#include "components/prefs/pref_service.h"
 #include "content/public/test/browser_test.h"
 #include "net/dns/mock_host_resolver.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -104,4 +109,52 @@
                          testing::Values(kMultilingualWatermarkMessage,
                                          kLongLinesWatermarkMessage));
 
+class WatermarkSettingsBrowserTest : public InProcessBrowserTest,
+                                     public testing::WithParamInterface<bool> {
+ public:
+  WatermarkSettingsBrowserTest() {
+    if (IsCustomizationEnabled()) {
+      scoped_feature_list_.InitAndEnableFeature(kEnableWatermarkCustomization);
+    } else {
+      scoped_feature_list_.InitAndDisableFeature(kEnableWatermarkCustomization);
+    }
+  }
+
+  bool IsCustomizationEnabled() const { return GetParam(); }
+
+  SkAlpha PercentageToSkAlpha(int percent_value) {
+    return std::clamp(percent_value, 0, 100) * 255 / 100;
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_P(WatermarkSettingsBrowserTest, GetColors) {
+  PrefService* prefs = browser()->profile()->GetPrefs();
+
+  // Test with default pref values.
+  SkColor expected_fill_color = GetDefaultFillColor();
+  SkColor expected_outline_color = GetDefaultOutlineColor();
+
+  EXPECT_EQ(GetFillColor(prefs), expected_fill_color);
+  EXPECT_EQ(GetOutlineColor(prefs), expected_outline_color);
+
+  // Test with custom pref values.
+  prefs->SetInteger(enterprise_connectors::kWatermarkStyleFillOpacityPref, 30);
+  prefs->SetInteger(enterprise_connectors::kWatermarkStyleOutlineOpacityPref,
+                    40);
+
+  if (IsCustomizationEnabled()) {
+    expected_fill_color =
+        SkColorSetA(SkColorSetRGB(0x00, 0x00, 0x00), PercentageToSkAlpha(30));
+    expected_outline_color =
+        SkColorSetA(SkColorSetRGB(0xff, 0xff, 0xff), PercentageToSkAlpha(40));
+  }
+
+  EXPECT_EQ(GetFillColor(prefs), expected_fill_color);
+  EXPECT_EQ(GetOutlineColor(prefs), expected_outline_color);
+}
+
+INSTANTIATE_TEST_SUITE_P(All, WatermarkSettingsBrowserTest, testing::Bool());
 }  // namespace enterprise_watermark
diff --git a/chrome/browser/extensions/OWNERS b/chrome/browser/extensions/OWNERS
index 30c3ad6..8493c22 100644
--- a/chrome/browser/extensions/OWNERS
+++ b/chrome/browser/extensions/OWNERS
@@ -23,3 +23,6 @@
 
 # Prefer rsult over directory owners.
 per-file *browser_context_keyed_service_factories*=rsult@google.com
+
+# Web accessible resources.
+per-file *web_accessible_resources*=file://extensions/browser/api/web_accessible_resources/OWNERS
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
index 654dc05..0ec8a1f4 100644
--- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
+++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
@@ -153,8 +153,6 @@
             GURL("https://phishing.com/"), "user_name_1",
             /*is_phishing_url*/ true, warning_shown);
 
-    // TODO(mxlg): Move the tests related to the ReportingEventRouter to its own
-    // unit tests file.
     enterprise_connectors::ReportingEventRouterFactory::GetForBrowserContext(
         profile_)
         ->OnPasswordReuse(GURL("https://phishing.com/"), "user_name_1",
@@ -165,8 +163,6 @@
     SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile_)
         ->OnPolicySpecifiedPasswordChanged("user_name_2");
 
-    // TODO(crbug.com/410855312):  Move the tests related to the
-    // ReportingEventRouter to its own unit tests file.
     enterprise_connectors::ReportingEventRouterFactory::GetForBrowserContext(
         profile_)
         ->OnPasswordChanged("user_name_2");
@@ -187,8 +183,6 @@
     SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile_)
         ->OnSecurityInterstitialShown(GURL("https://phishing.com/"), "PHISHING",
                                       0);
-    // TODO(mxlg): Move the tests related to the ReportingEventRouter to its own
-    // unit tests file.
     safe_browsing::ReferrerChain referrer_chain;
     enterprise_connectors::ReportingEventRouterFactory::GetForBrowserContext(
         profile_)
@@ -200,7 +194,6 @@
     SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile_)
         ->OnSecurityInterstitialProceeded(GURL("https://phishing.com/"),
                                           "PHISHING", -201);
-    // TODO(mxlg): Move the ReportingEventRouter test code to its own unit test.
     safe_browsing::ReferrerChain referrer_chain;
     enterprise_connectors::ReportingEventRouterFactory::GetForBrowserContext(
         profile_)
diff --git a/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
index fad9cd4..eb0518f 100644
--- a/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
+++ b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
@@ -24,14 +24,13 @@
 #include "chrome/browser/media/webrtc/webrtc_event_log_manager_common.h"
 #include "chrome/browser/media/webrtc/webrtc_log_uploader.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "components/policy/core/browser/browser_policy_connector.h"
 #include "components/policy/core/common/mock_configuration_policy_provider.h"
 #include "components/policy/policy_constants.h"
 #include "content/public/browser/render_view_host.h"
+#include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_utils.h"
 #include "extensions/browser/api_test_utils.h"
@@ -105,6 +104,11 @@
   void SetUpOnMainThread() override {
     ExtensionApiTest::SetUpOnMainThread();
     extension_ = extensions::ExtensionBuilder("Test").Build();
+#if BUILDFLAG(IS_ANDROID)
+    // Android's default blank page doesn't have a renderer process,so navigate
+    // to a URL that has one. Peer connection tests need a real process ID.
+    ASSERT_TRUE(NavigateToURL(GURL("chrome://version")));
+#endif
   }
 
   template<typename T>
@@ -115,11 +119,16 @@
     return function;
   }
 
-  // Overriding can use incognito session instead, etc.
-  virtual Browser* GetBrowser() { return browser(); }
+  // Override to use an alternate web contents. GetActiveWebContents() returns
+  // a web contents from the test's initial browser window, which may not be
+  // the only window in an incognito test.
+  virtual content::WebContents* GetWebContents() {
+    return GetActiveWebContents();
+  }
 
-  content::WebContents* web_contents() {
-    return GetBrowser()->tab_strip_model()->GetActiveWebContents();
+  // Convenience method to return the Profile from GetWebContents().
+  Profile* GetProfile() {
+    return Profile::FromBrowserContext(GetWebContents()->GetBrowserContext());
   }
 
   bool SetupTestServerLogUploading() {
@@ -149,9 +158,9 @@
   void AppendTabIdAndUrl(base::Value::List& parameters) {
     base::Value::Dict request_info;
     request_info.Set("tabId",
-                     extensions::ExtensionTabUtil::GetTabId(web_contents()));
+                     extensions::ExtensionTabUtil::GetTabId(GetWebContents()));
     parameters.Append(std::move(request_info));
-    parameters.Append(web_contents()
+    parameters.Append(GetWebContents()
                           ->GetLastCommittedURL()
                           .DeprecatedGetOriginAsURL()
                           .spec());
@@ -165,7 +174,7 @@
   std::optional<base::Value> RunFunction(const base::Value::List& parameters) {
     scoped_refptr<Function> function(CreateFunction<Function>());
     std::optional<base::Value> result = utils::RunFunctionAndReturnSingleResult(
-        function.get(), ParamsToString(parameters), GetBrowser()->profile());
+        function.get(), ParamsToString(parameters), GetProfile());
     return result;
   }
 
@@ -179,7 +188,7 @@
     AppendTabIdAndUrl(params);
     scoped_refptr<Function> function(CreateFunction<Function>());
     std::optional<base::Value> result = utils::RunFunctionAndReturnSingleResult(
-        function.get(), ParamsToString(params), GetBrowser()->profile());
+        function.get(), ParamsToString(params), GetProfile());
     return result;
   }
 
@@ -189,7 +198,7 @@
     DCHECK(!expected_error.empty());
     scoped_refptr<Function> function(CreateFunction<Function>());
     const std::string error_message = utils::RunFunctionAndReturnError(
-        function.get(), ParamsToString(parameters), GetBrowser()->profile());
+        function.get(), ParamsToString(parameters), GetProfile());
     EXPECT_EQ(error_message, expected_error);
   }
 
@@ -379,7 +388,7 @@
 
       std::optional<base::Value> result =
           utils::RunFunctionAndReturnSingleResult(
-              function.get(), ParamsToString(params), GetBrowser()->profile());
+              function.get(), ParamsToString(params), GetProfile());
 
       ASSERT_TRUE(result);
       ASSERT_TRUE(result->is_dict());
@@ -397,15 +406,24 @@
     }
   }
 
-  void SetUpPeerConnection(const std::string& session_id = "") {
+  // Sets up a simulated WebRTC peer connection. Registers the peer connection
+  // with the WebRtcEventLogManager using the primary main frame's
+  // RenderFrameHost and process ID. If a non-empty `session_id` is provided,
+  // it also associates this session ID with the newly added peer connection.
+  // Returns true on success.
+  bool SetUpPeerConnection(const std::string& session_id = "") {
     auto* manager = WebRtcEventLogManager::GetInstance();
 
     content::RenderFrameHost* render_frame_host =
-        web_contents()->GetPrimaryMainFrame();
+        GetWebContents()->GetPrimaryMainFrame();
     const content::GlobalRenderFrameHostId frame_id =
         render_frame_host->GetGlobalId();
-    const base::ProcessId pid =
-        render_frame_host->GetProcess()->GetProcess().Pid();
+    const base::Process& process =
+        render_frame_host->GetProcess()->GetProcess();
+    if (!process.IsValid()) {
+      return false;
+    }
+    const base::ProcessId pid = process.Pid();
     const int lid = 0;
 
     manager->OnPeerConnectionAdded(frame_id, lid, pid, /*url=*/std::string(),
@@ -414,6 +432,7 @@
     if (!session_id.empty()) {
       manager->OnPeerConnectionSessionIdSet(frame_id, lid, session_id);
     }
+    return true;
   }
 
   base::test::ScopedCommandLine scoped_command_line_;
@@ -584,7 +603,7 @@
   scoped_refptr<WebrtcLoggingPrivateStoreFunction> store(
       CreateFunction<WebrtcLoggingPrivateStoreFunction>());
   const std::string error = utils::RunFunctionAndReturnError(
-      store.get(), ParamsToString(parameters), GetBrowser()->profile());
+      store.get(), ParamsToString(parameters), GetProfile());
   ASSERT_FALSE(error.empty());
 }
 
@@ -669,8 +688,6 @@
   ASSERT_TRUE(StartAudioDebugRecordings(1));
 }
 
-#if !BUILDFLAG(IS_ANDROID)
-
 // Fixture for various tests over StartEventLogging. Intended to be sub-classed
 // to test different scenarios.
 class WebrtcLoggingPrivateApiStartEventLoggingTestBase
@@ -720,7 +737,7 @@
     WebrtcLoggingPrivateApiStartEventLoggingTestPolicyEnabled,
     StartEventLoggingForKnownPeerConnectionSucceeds) {
   const std::string session_id = "id";
-  SetUpPeerConnection(session_id);
+  ASSERT_TRUE(SetUpPeerConnection(session_id));
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
   constexpr bool expect_success = true;
   const int output_period_ms = GetParam() ? kMaxOutputPeriodMs : 0;
@@ -732,7 +749,7 @@
     WebrtcLoggingPrivateApiStartEventLoggingTestPolicyEnabled,
     StartEventLoggingWithUnlimitedSizeFails) {
   const std::string session_id = "id";
-  SetUpPeerConnection(session_id);
+  ASSERT_TRUE(SetUpPeerConnection(session_id));
   const int max_size_bytes = kWebRtcEventLogManagerUnlimitedFileSize;
   constexpr bool expect_success = false;
   const std::string error_message =
@@ -745,7 +762,7 @@
     WebrtcLoggingPrivateApiStartEventLoggingTestPolicyEnabled,
     StartEventLoggingWithTooSmallMaxSize) {
   const std::string session_id = "id";
-  SetUpPeerConnection(session_id);
+  ASSERT_TRUE(SetUpPeerConnection(session_id));
   const int max_size_bytes = 1;
   constexpr bool expect_success = false;
   const std::string error_message = kStartRemoteLoggingFailureMaxSizeTooSmall;
@@ -757,7 +774,7 @@
     WebrtcLoggingPrivateApiStartEventLoggingTestPolicyEnabled,
     StartEventLoggingWithExcessiveMaxSizeFails) {
   const std::string session_id = "id";
-  SetUpPeerConnection(session_id);
+  ASSERT_TRUE(SetUpPeerConnection(session_id));
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes + 1;
   constexpr bool expect_success = false;
   const std::string error_message = kStartRemoteLoggingFailureMaxSizeTooLarge;
@@ -769,7 +786,7 @@
     WebrtcLoggingPrivateApiStartEventLoggingTestPolicyEnabled,
     StartEventLoggingWithTooLargeOutputPeriodMsFails) {
   const std::string session_id = "id";
-  SetUpPeerConnection(session_id);
+  ASSERT_TRUE(SetUpPeerConnection(session_id));
   const int output_period_ms = kMaxOutputPeriodMs + 1;
   constexpr bool expect_success = false;
   const std::string error_message =
@@ -797,7 +814,7 @@
   const std::string session_id_1 = "id1";
   const std::string session_id_2 = "id2";
 
-  SetUpPeerConnection(session_id_1);
+  ASSERT_TRUE(SetUpPeerConnection(session_id_1));
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
   constexpr bool expect_success = false;
   const std::string error_message =
@@ -809,7 +826,7 @@
 IN_PROC_BROWSER_TEST_F(
     WebrtcLoggingPrivateApiStartEventLoggingTestPolicyEnabled,
     StartEventLoggingIfSessionIdNeverSetFails) {
-  SetUpPeerConnection();  // Note lack of session ID.
+  ASSERT_TRUE(SetUpPeerConnection());  // Note lack of session ID.
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
   constexpr bool expect_success = false;
   const std::string error_message =
@@ -821,7 +838,7 @@
 IN_PROC_BROWSER_TEST_F(
     WebrtcLoggingPrivateApiStartEventLoggingTestPolicyEnabled,
     StartEventLoggingIfSessionIdNeverSetFailsForEmptySessionId) {
-  SetUpPeerConnection();  // Note lack of session ID.
+  ASSERT_TRUE(SetUpPeerConnection());  // Note lack of session ID.
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
   constexpr bool expect_success = false;
   const std::string error_message =
@@ -833,7 +850,7 @@
 IN_PROC_BROWSER_TEST_F(
     WebrtcLoggingPrivateApiStartEventLoggingTestPolicyEnabled,
     StartEventLogginWithEmptySessionIdFails) {
-  SetUpPeerConnection("session_id");
+  ASSERT_TRUE(SetUpPeerConnection("session_id"));
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
   constexpr bool expect_success = false;
   const std::string error_message =
@@ -846,7 +863,7 @@
     WebrtcLoggingPrivateApiStartEventLoggingTestPolicyEnabled,
     StartEventLoggingForAlreadyLoggedPeerConnectionFails) {
   const std::string session_id = "id";
-  SetUpPeerConnection(session_id);
+  ASSERT_TRUE(SetUpPeerConnection(session_id));
 
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
 
@@ -869,7 +886,7 @@
     WebrtcLoggingPrivateApiStartEventLoggingTestPolicyEnabled,
     StartEventLoggingForTooLowWebAppIdFails) {
   const std::string session_id = "id";
-  SetUpPeerConnection(session_id);
+  ASSERT_TRUE(SetUpPeerConnection(session_id));
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
   const size_t web_app_id =
       webrtc_event_logging::kMinWebRtcEventLogWebAppId - 1;
@@ -885,7 +902,7 @@
     WebrtcLoggingPrivateApiStartEventLoggingTestPolicyEnabled,
     StartEventLoggingForTooHighWebAppIdFails) {
   const std::string session_id = "id";
-  SetUpPeerConnection(session_id);
+  ASSERT_TRUE(SetUpPeerConnection(session_id));
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
   const size_t web_app_id =
       webrtc_event_logging::kMaxWebRtcEventLogWebAppId + 1;
@@ -946,30 +963,38 @@
       default;
 
  protected:
-  Browser* GetBrowser() override {
-    if (!browser_) {
-      browser_ = CreateIncognitoBrowser();
-    }
-    return browser_;
+  void SetUpOnMainThread() override {
+    WebrtcLoggingPrivateApiStartEventLoggingTestBase::SetUpOnMainThread();
+    // Android requires opening a new tab to create an incognito profile, and it
+    // doesn't hurt on other platforms. Must occur before SetUpPeerConnection()
+    // is called in the test because that uses GetWebContents().
+    incognito_web_contents_ =
+        PlatformOpenURLOffTheRecord(profile(), GURL("chrome://version"));
+  }
+
+  void TearDownOnMainThread() override {
+    incognito_web_contents_ = nullptr;
+    WebrtcLoggingPrivateApiStartEventLoggingTestBase::TearDownOnMainThread();
+  }
+
+  content::WebContents* GetWebContents() override {
+    return incognito_web_contents_;
   }
 
   bool WebRtcEventLogCollectionPolicy() const override { return true; }
 
  private:
-  raw_ptr<Browser, AcrossTasksDanglingUntriaged> browser_{
-      nullptr};  // Does not own the object.
+  raw_ptr<content::WebContents> incognito_web_contents_ = nullptr;
 };
 
 IN_PROC_BROWSER_TEST_F(
     WebrtcLoggingPrivateApiStartEventLoggingTestInIncognitoMode,
     StartEventLoggingFails) {
   const std::string session_id = "id";
-  SetUpPeerConnection(session_id);
+  ASSERT_TRUE(SetUpPeerConnection(session_id));
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
   constexpr bool expect_success = false;
   const std::string error_message = kStartRemoteLoggingFailureFeatureDisabled;
   StartEventLogging(session_id, max_size_bytes, 0, kWebAppId, expect_success,
                     error_message);
 }
-
-#endif  // !BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/extensions/commands/command_service_browsertest.cc b/chrome/browser/extensions/commands/command_service_browsertest.cc
index 79d1536..f68b9c1 100644
--- a/chrome/browser/extensions/commands/command_service_browsertest.cc
+++ b/chrome/browser/extensions/commands/command_service_browsertest.cc
@@ -15,7 +15,6 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "content/public/test/browser_test.h"
@@ -28,11 +27,17 @@
 #include "ui/base/accelerators/command.h"
 #include "ui/base/accelerators/command_constants.h"
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+#include "chrome/browser/ui/browser.h"
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
+
 namespace {
+#if BUILDFLAG(ENABLE_EXTENSIONS)
 const char kBasicBrowserActionKeybinding[] = "Ctrl+Shift+F";
 const char kBasicNamedKeybinding[] = "Ctrl+Shift+Y";
 const char kBasicAlternateKeybinding[] = "Ctrl+Shift+G";
 const char kBasicNamedCommand[] = "toggle-feature";
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 constexpr char kAltNKeybinding[] = "Alt+N";
 constexpr char kAltZKeybinding[] = "Alt+Z";
 constexpr char kExtensionId[] = "pgoakhfeplldmjheffidklpoklkppipp";
@@ -47,6 +52,7 @@
     },
     "%s": {}})";
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
 // Get another command platform, which is used for simulating a command has been
 // assigned with a shortcut on another platform.
 std::string GetAnotherCommandPlatform() {
@@ -62,6 +68,7 @@
   return "";
 #endif
 }
+#endif
 
 // Parameters passed to CommandServiceMv3UpgradeTest parameterized tests.
 struct ManifestCommandTestParameters {
@@ -114,9 +121,7 @@
       const ui::KeyboardCode keyboard_code);
 
   TestExtensionDir& test_dir() { return test_dir_; }
-  CommandService* command_service() {
-    return CommandService::Get(browser()->profile());
-  }
+  CommandService* command_service() { return CommandService::Get(profile()); }
 
  private:
   TestExtensionDir test_dir_;
@@ -393,6 +398,8 @@
                                         /*keyboard_code=*/ui::VKEY_U);
 }
 
+// TODO(crbug.com/404070124): Enable on desktop android.
+#if BUILDFLAG(ENABLE_EXTENSIONS)
 IN_PROC_BROWSER_TEST_F(CommandServiceTest, RemoveShortcutSurvivesUpdate) {
   base::ScopedAllowBlockingForTesting allow_blocking;
   base::ScopedTempDir scoped_temp_dir;
@@ -412,8 +419,8 @@
                                scoped_temp_dir.GetPath().AppendASCII("v2.crx"),
                                pem_path, base::FilePath());
 
-  ExtensionRegistry* registry = ExtensionRegistry::Get(browser()->profile());
-  CommandService* command_service = CommandService::Get(browser()->profile());
+  ExtensionRegistry* registry = ExtensionRegistry::Get(profile());
+  CommandService* command_service = CommandService::Get(profile());
 
   // Install v1 of the extension.
   ASSERT_TRUE(InstallExtension(path_v1, 1));
@@ -462,7 +469,7 @@
   const Extension* extension = InstallExtension(extension_dir, 1);
   ASSERT_TRUE(extension);
 
-  ScopedDictPrefUpdate updater(browser()->profile()->GetPrefs(),
+  ScopedDictPrefUpdate updater(profile()->GetPrefs(),
                                prefs::kExtensionCommands);
   base::Value::Dict& bindings = updater.Get();
 
@@ -476,7 +483,7 @@
   keybinding.Set("global", false);
   bindings.Set(anotherPlatformKey, std::move(keybinding));
 
-  CommandService* command_service = CommandService::Get(browser()->profile());
+  CommandService* command_service = CommandService::Get(profile());
   command_service->RemoveKeybindingPrefs(extension->id(), kNamedCommandName);
 
   // Removal of keybinding preference should be platform-specific, so the key on
@@ -491,7 +498,7 @@
   const Extension* extension = InstallExtension(extension_dir, 1);
   ASSERT_TRUE(extension);
 
-  CommandService* command_service = CommandService::Get(browser()->profile());
+  CommandService* command_service = CommandService::Get(profile());
 
   {
     Command command;
@@ -544,7 +551,7 @@
   const Extension* extension = InstallExtension(extension_dir, 1);
   ASSERT_TRUE(extension);
 
-  CommandService* command_service = CommandService::Get(browser()->profile());
+  CommandService* command_service = CommandService::Get(profile());
 
   {
     Command command;
@@ -593,7 +600,7 @@
   const Extension* extension = InstallExtension(extension_dir, 1);
   ASSERT_TRUE(extension);
 
-  CommandService* command_service = CommandService::Get(browser()->profile());
+  CommandService* command_service = CommandService::Get(profile());
 
   {
     ui::CommandMap command_map;
@@ -643,7 +650,7 @@
   const Extension* extension = InstallExtension(extension_dir, 1);
   ASSERT_TRUE(extension);
 
-  CommandService* command_service = CommandService::Get(browser()->profile());
+  CommandService* command_service = CommandService::Get(profile());
 
   {
     ui::CommandMap command_map;
@@ -682,6 +689,7 @@
     EXPECT_EQ(0u, command_map.count(kBasicNamedCommand));
   }
 }
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
 // Test both browser and page actions for these tests.
 INSTANTIATE_TEST_SUITE_P(BrowserAction,
diff --git a/chrome/browser/extensions/plugin_manager.cc b/chrome/browser/extensions/plugin_manager.cc
index a05132c4..1e5da04 100644
--- a/chrome/browser/extensions/plugin_manager.cc
+++ b/chrome/browser/extensions/plugin_manager.cc
@@ -20,10 +20,6 @@
 #include "third_party/skia/include/core/SkColor.h"
 #include "url/gurl.h"
 
-#if BUILDFLAG(ENABLE_NACL)
-#include "components/nacl/common/nacl_constants.h"
-#endif
-
 using content::PluginService;
 
 namespace extensions {
@@ -46,24 +42,8 @@
 
 void PluginManager::OnExtensionLoaded(content::BrowserContext* browser_context,
                                       const Extension* extension) {
-  bool plugins_or_nacl_changed = false;
-#if BUILDFLAG(ENABLE_NACL)
-  const NaClModuleInfo::List* nacl_modules =
-      NaClModuleInfo::GetNaClModules(extension);
-  if (nacl_modules) {
-    plugins_or_nacl_changed = true;
-    for (auto module = nacl_modules->begin(); module != nacl_modules->end();
-         ++module) {
-      RegisterNaClModule(*module);
-    }
-    UpdatePluginListWithNaClModules();
-  }
-#endif
-
   const MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension);
   if (handler && handler->HasPlugin()) {
-    plugins_or_nacl_changed = true;
-
     content::WebPluginInfo info;
     info.type = content::WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN;
     info.name = base::UTF8ToUTF16(extension->name());
@@ -84,105 +64,21 @@
 
     PluginService::GetInstance()->RefreshPlugins();
     PluginService::GetInstance()->RegisterInternalPlugin(info, true);
-  }
-
-  if (plugins_or_nacl_changed)
     PluginService::GetInstance()->PurgePluginListCache(profile_, false);
+  }
 }
 
 void PluginManager::OnExtensionUnloaded(
     content::BrowserContext* browser_context,
     const Extension* extension,
     UnloadedExtensionReason reason) {
-  bool plugins_or_nacl_changed = false;
-#if BUILDFLAG(ENABLE_NACL)
-  const NaClModuleInfo::List* nacl_modules =
-      NaClModuleInfo::GetNaClModules(extension);
-  if (nacl_modules) {
-    plugins_or_nacl_changed = true;
-    for (auto module = nacl_modules->begin(); module != nacl_modules->end();
-         ++module) {
-      UnregisterNaClModule(*module);
-    }
-    UpdatePluginListWithNaClModules();
-  }
-#endif
-
   const MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension);
   if (handler && handler->HasPlugin()) {
-    plugins_or_nacl_changed = true;
     base::FilePath path = handler->GetPluginPath();
     PluginService::GetInstance()->UnregisterInternalPlugin(path);
     PluginService::GetInstance()->RefreshPlugins();
-  }
-
-  if (plugins_or_nacl_changed)
     PluginService::GetInstance()->PurgePluginListCache(profile_, false);
-}
-
-#if BUILDFLAG(ENABLE_NACL)
-
-void PluginManager::RegisterNaClModule(const NaClModuleInfo& info) {
-  nacl_module_list_.push_front(info);
-}
-
-void PluginManager::UnregisterNaClModule(const NaClModuleInfo& info) {
-  auto iter = FindNaClModule(info.url);
-  if (iter != nacl_module_list_.end())
-    nacl_module_list_.erase(iter);
-}
-
-void PluginManager::UpdatePluginListWithNaClModules() {
-  // An extension has been added which has a nacl_module component, which means
-  // there is a MIME type that module wants to handle, so we need to add that
-  // MIME type to plugins which handle NaCl modules in order to allow the
-  // individual modules to handle these types.
-  static const base::NoDestructor<base::FilePath> path(
-      nacl::kInternalNaClPluginFileName);
-  const content::ContentPluginInfo* registered_info =
-      PluginService::GetInstance()->GetRegisteredPluginInfo(*path);
-  if (!registered_info)
-    return;
-
-  // Check each MIME type the plugins handle for the NaCl MIME type.
-  for (const auto& mime_type : registered_info->mime_types) {
-    if (mime_type.mime_type == nacl::kNaClPluginMimeType) {
-      // This plugin handles "application/x-nacl".
-
-      PluginService::GetInstance()->UnregisterInternalPlugin(
-          registered_info->path);
-
-      content::WebPluginInfo info = registered_info->ToWebPluginInfo();
-
-      for (const auto& nacl_module : nacl_module_list_) {
-        // Add the MIME type specified in the extension to this NaCl plugin,
-        // With an extra "nacl" argument to specify the location of the NaCl
-        // manifest file.
-        content::WebPluginMimeType mime_type_info;
-        mime_type_info.mime_type = nacl_module.mime_type;
-        mime_type_info.additional_params.emplace_back(
-            u"nacl", base::UTF8ToUTF16(nacl_module.url.spec()));
-        info.mime_types.emplace_back(std::move(mime_type_info));
-      }
-
-      PluginService::GetInstance()->RefreshPlugins();
-      PluginService::GetInstance()->RegisterInternalPlugin(info, true);
-      // This plugin has been modified, no need to check the rest of its
-      // types, but continue checking other plugins.
-      break;
-    }
   }
 }
 
-NaClModuleInfo::List::iterator PluginManager::FindNaClModule(const GURL& url) {
-  for (auto iter = nacl_module_list_.begin(); iter != nacl_module_list_.end();
-       ++iter) {
-    if (iter->url == url)
-      return iter;
-  }
-  return nacl_module_list_.end();
-}
-
-#endif  // BUILDFLAG(ENABLE_NACL)
-
 }  // namespace extensions
diff --git a/chrome/browser/extensions/plugin_manager.h b/chrome/browser/extensions/plugin_manager.h
index ea61a35..ab3cd243 100644
--- a/chrome/browser/extensions/plugin_manager.h
+++ b/chrome/browser/extensions/plugin_manager.h
@@ -7,13 +7,10 @@
 
 #include "base/memory/raw_ptr.h"
 #include "base/scoped_observation.h"
-#include "components/nacl/common/buildflags.h"
 #include "extensions/browser/browser_context_keyed_api_factory.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_registry_observer.h"
-#include "extensions/common/manifest_handlers/nacl_modules_handler.h"
 
-class GURL;
 class Profile;
 
 namespace content {
@@ -38,25 +35,6 @@
  private:
   friend class BrowserContextKeyedAPIFactory<PluginManager>;
 
-#if BUILDFLAG(ENABLE_NACL)
-
-  // We implement some Pepper plugins using NaCl to take advantage of NaCl's
-  // strong sandbox. Typically, these NaCl modules are stored in extensions
-  // and registered here. Not all NaCl modules need to register for a MIME
-  // type, just the ones that are responsible for rendering a particular MIME
-  // type, like application/pdf. Note: We only register NaCl modules in the
-  // browser process.
-  void RegisterNaClModule(const NaClModuleInfo& info);
-  void UnregisterNaClModule(const NaClModuleInfo& info);
-
-  // Call UpdatePluginListWithNaClModules() after registering or unregistering
-  // a NaCl module to see those changes reflected in the PluginList.
-  void UpdatePluginListWithNaClModules();
-
-  extensions::NaClModuleInfo::List::iterator FindNaClModule(const GURL& url);
-
-#endif  // BUILDFLAG(ENABLE_NACL)
-
   // ExtensionRegistryObserver implementation.
   void OnExtensionLoaded(content::BrowserContext* browser_context,
                          const Extension* extension) override;
@@ -68,8 +46,6 @@
   static const char* service_name() { return "PluginManager"; }
   static const bool kServiceIsNULLWhileTesting = true;
 
-  extensions::NaClModuleInfo::List nacl_module_list_;
-
   raw_ptr<Profile> profile_;
 
   // Listen to extension load, unloaded notifications.
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 042dad8..1718f48 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -692,7 +692,7 @@
   {
     "name": "autofill-enable-amount-extraction-testing",
     "owners": [ "jamessun@google.com", "payments-autofill-team@google.com" ],
-    "expiry_milestone": 145
+    "expiry_milestone": 155
   },
   {
     "name": "autofill-enable-buy-now-pay-later",
@@ -1457,6 +1457,11 @@
     "expiry_milestone": 142
   },
   {
+    "name": "cct-adaptive-button-test-switch",
+    "owners": [ "jinsukkim@google.com", "clank-app-team@google.com" ],
+    "expiry_milestone": 142
+  },
+  {
     "name": "cct-auth-tab",
     "owners": [ "sinansahin@google.com", "chrome-connective-tissue@google.com"],
     "expiry_milestone": 150
@@ -9729,6 +9734,11 @@
     "expiry_milestone": -1
   },
   {
+    "name" : "toolbar-phone-animation-refactor",
+    "owners": [ "skavuluru@google.com", "nemco@google.com", "clank-large-form-factors@google.com" ],
+    "expiry_milestone" : 145
+  },
+  {
     "name" : "toolbar-pinning",
     "owners": [ "corising@chromium.org", "tbergquist@chromium.org", "top-chrome-desktop-ui@chromium.org" ],
     "expiry_milestone" : 135
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index ddb5164..a8222d27 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -697,16 +697,21 @@
 const char kAutofillEnableAmountExtractionDesktopDescription[] =
     "When enabled, Chrome will extract the checkout amount from the checkout "
     "page of the allowlisted merchant websites.";
-const char kAutofillEnableAmountExtractionTestingName[] =
-    "Enable amount extraction testing on Chrome desktop";
-const char kAutofillEnableAmountExtractionTestingDescription[] =
-    "Enables testing of the result of checkout amount extraction on desktop. "
-    "This flag will allow amount extraction to run on any website when a CC "
-    "form is clicked.";
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
         // BUILDFLAG(IS_CHROMEOS)
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
+const char kAutofillEnableAmountExtractionTestingName[] =
+    "Enable amount extraction testing on Chrome desktop and Clank";
+const char kAutofillEnableAmountExtractionTestingDescription[] =
+    "Enables testing of the result of checkout amount extraction on Chrome "
+    "desktop and Clank. This flag will allow amount extraction to run on any "
+    "website when a CC form is clicked.";
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
+
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
     BUILDFLAG(IS_CHROMEOS)
 const char kAutofillEnableBuyNowPayLaterName[] =
     "Enable buy now pay later on Autofill";
@@ -4131,10 +4136,6 @@
 const char kTabletTabStripAnimationDescription[] =
     "Enables new tablet tab strip animations.";
 
-const char kToolbarPhoneCleanupName[] = "Toolbar Phone cleanup";
-const char kToolbarPhoneCleanupDescription[] =
-    "Enables cleanup on toolbar phone class.";
-
 const char kCommerceDeveloperName[] = "Commerce developer mode";
 const char kCommerceDeveloperDescription[] =
     "Allows users in the allowlist to enter the developer mode";
@@ -4220,6 +4221,12 @@
 const char kTopControlsRefactorDescription[] =
     "Enables the alternative code path in Android for the top controls layout "
     "control.";
+
+const char kToolbarPhoneAnimationRefactorName[] =
+    "Toolbar Phone Animation Refactor";
+const char kToolbarPhoneAnimationRefactorDescription[] =
+    "Enables the refactored animation code path in Android for the toolbar "
+    "phone class.";
 #endif
 
 #if BUILDFLAG(IS_ANDROID)
@@ -5581,6 +5588,13 @@
 const char kCCTAdaptiveButtonDescription[] =
     "Enables adaptive action button in Custom Tabs toolbar";
 
+const char kCCTAdaptiveButtonTestSwitchName[] =
+    "Test flags for adaptive button in Custom Tabs";
+const char kCCTAdaptiveButtonTestSwitchDescription[] =
+    "Enables adaptive action button in Custom Tabs toolbar, with some tweaks "
+    "to facilitate testing 1) simulate narrow toolbar to hide MTB 2) Always "
+    "show static action MTB chip animation";
+
 const char kAdaptiveButtonInTopToolbarPageSummaryName[] =
     "Adaptive button in top toolbar - Page Summary";
 const char kAdaptiveButtonInTopToolbarPageSummaryDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index ce4e648..62789a2 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -436,10 +436,15 @@
 extern const char kAutofillEnableAmountExtractionAllowlistDesktopDescription[];
 extern const char kAutofillEnableAmountExtractionDesktopName[];
 extern const char kAutofillEnableAmountExtractionDesktopDescription[];
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+        // BUILDFLAG(IS_CHROMEOS)
+
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
 extern const char kAutofillEnableAmountExtractionTestingName[];
 extern const char kAutofillEnableAmountExtractionTestingDescription[];
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
-        // BUILDFLAG(IS_CHROMEOS)
+        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
     BUILDFLAG(IS_CHROMEOS)
@@ -2354,8 +2359,8 @@
 extern const char kTabletTabStripAnimationName[];
 extern const char kTabletTabStripAnimationDescription[];
 
-extern const char kToolbarPhoneCleanupName[];
-extern const char kToolbarPhoneCleanupDescription[];
+extern const char kToolbarPhoneAnimationRefactorName[];
+extern const char kToolbarPhoneAnimationRefactorDescription[];
 
 extern const char kCommerceDeveloperName[];
 extern const char kCommerceDeveloperDescription[];
@@ -2774,6 +2779,8 @@
 
 extern const char kCCTAdaptiveButtonName[];
 extern const char kCCTAdaptiveButtonDescription[];
+extern const char kCCTAdaptiveButtonTestSwitchName[];
+extern const char kCCTAdaptiveButtonTestSwitchDescription[];
 
 extern const char kAdaptiveButtonInTopToolbarCustomizationName[];
 extern const char kAdaptiveButtonInTopToolbarCustomizationDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index ae17119..e259ab0 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -64,6 +64,7 @@
 #include "components/shared_highlighting/core/common/shared_highlighting_features.h"
 #include "components/signin/public/base/signin_switches.h"
 #include "components/subresource_filter/core/browser/subresource_filter_features.h"
+#include "components/supervised_user/core/common/features.h"
 #include "components/sync/base/features.h"
 #include "components/sync_sessions/features.h"
 #include "components/visited_url_ranking/public/features.h"
@@ -243,6 +244,7 @@
     &kCacheIsMultiInstanceApi31Enabled,
     &kCastDeviceFilter,
     &kCCTAdaptiveButton,
+    &kCCTAdaptiveButtonTestSwitch,
     &kCCTAuthTab,
     &kCCTAuthTabDisableAllExternalIntents,
     &kCCTAuthTabEnableHttpsRedirects,
@@ -382,7 +384,6 @@
     &kTabGroupEntryPointsAndroid,
     &kTabGroupParityBottomSheetAndroid,
     &kTabletTabStripAnimation,
-    &kToolbarPhoneCleanup,
     &kTabFreezeOnUndoableClosureKillSwitch,
     &kTabStateFlatBuffer,
     &kTabStripContextMenuAndroid,
@@ -402,6 +403,7 @@
     &kTabWindowManagerReportIndicesMismatch,
     &kTestDefaultDisabled,
     &kTestDefaultEnabled,
+    &kToolbarPhoneAnimationRefactor,
     &kTopControlsRefactor,
     &kTouchToSearchCallout,
     &kTraceBinderIpc,
@@ -460,6 +462,7 @@
         kSegmentationPlatformAndroidHomeModuleRankerV2,
     &sensitive_content::features::kSensitiveContent,
     &sensitive_content::features::kSensitiveContentWhileSwitchingTabs,
+    &supervised_user::kPropagateDeviceContentFiltersToSupervisedUser,
     &switches::kForceStartupSigninPromo,
     &sync_sessions::kOptimizeAssociateWindowsAndroid,
     &syncer::kWebApkBackupAndRestoreBackend,
@@ -566,7 +569,7 @@
 
 BASE_FEATURE(kAndroidNativePagesInNewTab,
              "AndroidNativePagesInNewTab",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 BASE_FEATURE(kAndroidProgressBarVisualUpdate,
              "AndroidProgressBarVisualUpdate",
@@ -717,6 +720,10 @@
              "CCTAdaptiveButton",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kCCTAdaptiveButtonTestSwitch,
+             "CCTAdaptiveButtonTestSwitch",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kCCTAuthTab, "CCTAuthTab", base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kCCTAuthTabDisableAllExternalIntents,
              "CCTAuthTabDisableAllExternalIntents",
@@ -1261,10 +1268,6 @@
              "TabletTabStripAnimation",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-BASE_FEATURE(kToolbarPhoneCleanup,
-             "ToolbarPhoneCleanup",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 BASE_FEATURE(kTabFreezeOnUndoableClosureKillSwitch,
              "TabFreezeOnUndoableClosureKillSwitch",
              base::FEATURE_ENABLED_BY_DEFAULT);
@@ -1341,6 +1344,10 @@
              "TestDefaultEnabled",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+BASE_FEATURE(kToolbarPhoneAnimationRefactor,
+             "ToolbarPhoneAnimationRefactor",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // Enables the use of the refactored Top Controls approach on Android.
 BASE_FEATURE(kTopControlsRefactor,
              "TopControlsRefactor",
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index e11ad116..d766d8b 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -75,6 +75,7 @@
 BASE_DECLARE_FEATURE(kCacheIsMultiInstanceApi31Enabled);
 BASE_DECLARE_FEATURE(kCastDeviceFilter);
 BASE_DECLARE_FEATURE(kCCTAdaptiveButton);
+BASE_DECLARE_FEATURE(kCCTAdaptiveButtonTestSwitch);
 BASE_DECLARE_FEATURE(kCCTAuthTab);
 BASE_DECLARE_FEATURE(kCCTAuthTabDisableAllExternalIntents);
 BASE_DECLARE_FEATURE(kCCTAuthTabEnableHttpsRedirects);
@@ -224,7 +225,6 @@
 BASE_DECLARE_FEATURE(kTabGroupEntryPointsAndroid);
 BASE_DECLARE_FEATURE(kTabGroupParityBottomSheetAndroid);
 BASE_DECLARE_FEATURE(kTabletTabStripAnimation);
-BASE_DECLARE_FEATURE(kToolbarPhoneCleanup);
 BASE_DECLARE_FEATURE(kTabFreezeOnUndoableClosureKillSwitch);
 BASE_DECLARE_FEATURE(kTabStateFlatBuffer);
 BASE_DECLARE_FEATURE(kTabStripContextMenuAndroid);
@@ -247,6 +247,7 @@
 BASE_DECLARE_FEATURE(kTestDefaultDisabled);
 BASE_DECLARE_FEATURE(kTestDefaultEnabled);
 BASE_DECLARE_FEATURE(kTopControlsRefactor);
+BASE_DECLARE_FEATURE(kToolbarPhoneAnimationRefactor);
 BASE_DECLARE_FEATURE(kTouchToSearchCallout);
 BASE_DECLARE_FEATURE(kTraceBinderIpc);
 BASE_DECLARE_FEATURE(kStartSurfaceReturnTime);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 83386f51..5e195d2 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -281,6 +281,7 @@
             "CacheIsMultiInstanceApi31Enabled";
     public static final String CAPTIVE_PORTAL_CERTIFICATE_LIST = "CaptivePortalCertificateList";
     public static final String CCT_ADAPTIVE_BUTTON = "CCTAdaptiveButton";
+    public static final String CCT_ADAPTIVE_BUTTON_TEST_SWITCH = "CCTAdaptiveButtonTestSwitch";
     public static final String CCT_AUTH_TAB = "CCTAuthTab";
     public static final String CCT_AUTH_TAB_DISABLE_ALL_EXTERNAL_INTENTS =
             "CCTAuthTabDisableAllExternalIntents";
@@ -512,6 +513,8 @@
     public static final String PRIVACY_SANDBOX_SENTIMENT_SURVEY = "PrivacySandboxSentimentSurvey";
     public static final String PRIVACY_SANDBOX_SETTINGS_4 = "PrivacySandboxSettings4";
     public static final String PROCESS_RANK_POLICY_ANDROID = "ProcessRankPolicyAndroid";
+    public static final String PROPAGATE_DEVICE_CONTENT_FILTERS_TO_SUPERVISED_USER =
+            "PropagateDeviceContentFiltersToSupervisedUser";
     public static final String PUSH_MESSAGING_DISALLOW_SENDER_IDS =
             "PushMessagingDisallowSenderIDs";
     public static final String PWA_RESTORE_UI = "PwaRestoreUi";
@@ -625,6 +628,7 @@
     public static final String TEST_DEFAULT_DISABLED = "TestDefaultDisabled";
     public static final String TEST_DEFAULT_ENABLED = "TestDefaultEnabled";
     public static final String TINKER_TANK_BOTTOM_SHEET = "TinkerTankBottomSheet";
+    public static final String TOOLBAR_PHONE_ANIMATION_REFACTOR = "ToolbarPhoneAnimationRefactor";
     public static final String TOOLBAR_SCROLL_ABLATION = "AndroidToolbarScrollAblation";
     public static final String TOP_CONTROLS_REFACTOR = "TopControlsRefactor";
     public static final String TOUCH_TO_SEARCH_CALLOUT = "TouchToSearchCallout";
@@ -1155,7 +1159,7 @@
     public static final MutableFlagWithSafeDefault sAndroidDumpOnScrollWithoutResource =
             newMutableFlagWithSafeDefault(ANDROID_DUMP_ON_SCROLL_WITHOUT_RESOURCE, false);
     public static final MutableFlagWithSafeDefault sAndroidNativePagesInNewTab =
-            newMutableFlagWithSafeDefault(ANDROID_NATIVE_PAGES_IN_NEW_TAB, false);
+            newMutableFlagWithSafeDefault(ANDROID_NATIVE_PAGES_IN_NEW_TAB, true);
     public static final MutableFlagWithSafeDefault sAndroidPinnedTabs =
             newMutableFlagWithSafeDefault(ANDROID_PINNED_TABS, false);
     public static final MutableFlagWithSafeDefault
@@ -1245,6 +1249,8 @@
             newMutableFlagWithSafeDefault(TAB_SWITCHER_GROUP_SUGGESTIONS_TEST_MODE_ANDROID, false);
     public static final MutableFlagWithSafeDefault sTabSwitcherForeignFaviconSupport =
             newMutableFlagWithSafeDefault(TAB_SWITCHER_FOREIGN_FAVICON_SUPPORT, true);
+    public static final MutableFlagWithSafeDefault sToolbarPhoneAnimationRefactor =
+            newMutableFlagWithSafeDefault(TOOLBAR_PHONE_ANIMATION_REFACTOR, false);
     public static final MutableFlagWithSafeDefault sToolbarScrollAblation =
             newMutableFlagWithSafeDefault(TOOLBAR_SCROLL_ABLATION, false);
 
diff --git a/chrome/browser/glic/host/glic_api_browsertest.cc b/chrome/browser/glic/host/glic_api_browsertest.cc
index 8409da574..0e87284a 100644
--- a/chrome/browser/glic/host/glic_api_browsertest.cc
+++ b/chrome/browser/glic/host/glic_api_browsertest.cc
@@ -1516,21 +1516,24 @@
 
 // Given the time-based nature of debouncing, testing with non-mocked clocks can
 // be flaky. This suite increases the applied delays to reduce the the chance of
-// flakiness.
-class GlicApiTestWithOneTabMoreDebounceDelay : public GlicApiTestWithOneTab {
+// flakiness. This suite is disabled on all slow binaries.
+#if defined(SLOW_BINARY)
+#define MAYBE_GlicApiTestWithOneTabMoreDebounceDelay \
+  DISABLED_GlicApiTestWithOneTabMoreDebounceDelay
+#else
+#define MAYBE_GlicApiTestWithOneTabMoreDebounceDelay \
+  GlicApiTestWithOneTabMoreDebounceDelay
+#endif
+class MAYBE_GlicApiTestWithOneTabMoreDebounceDelay
+    : public GlicApiTestWithOneTab {
  public:
-  GlicApiTestWithOneTabMoreDebounceDelay() {
+  MAYBE_GlicApiTestWithOneTabMoreDebounceDelay() {
     features2_.InitWithFeaturesAndParameters(
         /*enabled_features=*/
         {{
             features::kGlicTabFocusDataDedupDebounce,
             {
-// For slow binaries, use a longer debounce delay.
-#if defined(SLOW_BINARY)
-                {features::kGlicTabFocusDataDebounceDelayMs.name, "200"},
-#else
                 {features::kGlicTabFocusDataDebounceDelayMs.name, "100"},
-#endif
             },
         }},
         /*disabled_features=*/
@@ -1544,15 +1547,14 @@
 // Confirm that the web client receives a minimal number of focused tab updates
 // by triggering events that generate such updates.
 // TODO(b/424242331): figure out why this is failing on linux-rel bot.
-// TODO(b/427154832): Disabled test for windows due to consistent failures.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
-#define MAYBE_testSingleFocusedTabUpdatesOnTabEvents \
-  DISABLED_testSingleFocusedTabUpdatesOnTabEvents
-#else
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
 #define MAYBE_testSingleFocusedTabUpdatesOnTabEvents \
   testSingleFocusedTabUpdatesOnTabEvents
+#else
+#define MAYBE_testSingleFocusedTabUpdatesOnTabEvents \
+  DISABLED_testSingleFocusedTabUpdatesOnTabEvents
 #endif
-IN_PROC_BROWSER_TEST_F(GlicApiTestWithOneTabMoreDebounceDelay,
+IN_PROC_BROWSER_TEST_F(MAYBE_GlicApiTestWithOneTabMoreDebounceDelay,
                        MAYBE_testSingleFocusedTabUpdatesOnTabEvents) {
   // Initial state with first tab.
   ExecuteJsTest();
diff --git a/chrome/browser/glic/resources/BUILD.gn b/chrome/browser/glic/resources/BUILD.gn
index 8290b35..0bf8fb81 100644
--- a/chrome/browser/glic/resources/BUILD.gn
+++ b/chrome/browser/glic/resources/BUILD.gn
@@ -43,5 +43,8 @@
     "glic_resources.h",
   ]
   public_deps = [ ":grit" ]
-  deps = [ "//base" ]
+  deps = [
+    "//base",
+    "//chrome/common:chrome_features",
+  ]
 }
diff --git a/chrome/browser/glic/resources/browser_resources.grd b/chrome/browser/glic/resources/browser_resources.grd
index 3f0f102..5bb7ff4e 100644
--- a/chrome/browser/glic/resources/browser_resources.grd
+++ b/chrome/browser/glic/resources/browser_resources.grd
@@ -33,6 +33,15 @@
       <include name="IDR_GLIC_PROFILE_BRANDING_CSS" file="glic_profile_branding.css" type="BINDATA" compress="brotli" />
       <include name="IDR_GLIC_TAB_MEDIA_GLIC_ACTIVE" file="tab_media_glic_active.svg" type="BINDATA" compress="brotli" />
       <include name="IDR_GLIC_ACCESSING_ICON" file="../../../app/vector_icons/tv.icon" type="BINDATA" compress="brotli" />
+      <include name="IDR_GLIC_BUTTON_VECTOR_ICON_V2" file="glic_button.icon" type="BINDATA" compress="brotli" />
+      <include name="IDR_GLIC_STATUS_ICON_V2" file="glic_button.icon" type="BINDATA" compress="brotli" />
+      <include name="IDR_GLIC_STATUS_ICON_DARK_V2" file="glic_status_icon_dark.png" type="BINDATA" />
+      <include name="IDR_GLIC_STATUS_ICON_LIGHT_V2" file="glic_status_icon_light.png" type="BINDATA" />
+      <include name="IDR_GLIC_PROFILE_LOGO_V2" file="glic_profile_logo.svg" type="BINDATA" compress="brotli" />
+      <include name="IDR_GLIC_PROFILE_BANNER_BOTTOM_LEFT_V2" file="glic_profile_banner_bottom_left.svg" type="BINDATA" compress="brotli" />
+      <include name="IDR_GLIC_PROFILE_BANNER_TOP_RIGHT_V2" file="glic_profile_banner_top_right.svg" type="BINDATA" compress="brotli" />
+      <include name="IDR_GLIC_PROFILE_BANNER_BOTTOM_LEFT_LIGHT_V2" file="glic_profile_banner_bottom_left_light.svg" type="BINDATA" compress="brotli" />
+      <include name="IDR_GLIC_PROFILE_BANNER_TOP_RIGHT_LIGHT_V2" file="glic_profile_banner_top_right_light.svg" type="BINDATA" compress="brotli" />
     </includes>
 
     <!-- NOTE: file is currently marked as untranslatable in
diff --git a/chrome/browser/glic/resources/glic_resources.cc b/chrome/browser/glic/resources/glic_resources.cc
index 5b94e8b..7ef0f28 100644
--- a/chrome/browser/glic/resources/glic_resources.cc
+++ b/chrome/browser/glic/resources/glic_resources.cc
@@ -4,11 +4,40 @@
 
 #include "chrome/browser/glic/resources/glic_resources.h"
 
+#include "chrome/browser/glic/resources/grit/glic_browser_resources.h"
+#include "chrome/common/chrome_features.h"
+
 namespace glic {
 
 int GetResourceID(int id) {
-  // TODO(b/421974290): Implement.
-  return id;
+  if (!base::FeatureList::IsEnabled(features::kGlicAssetsV2)) {
+    return id;
+  }
+
+  // If kGlicAssetsV2 is enabled, look up the corresponding new resource.
+  switch (id) {
+    case IDR_GLIC_BUTTON_VECTOR_ICON:
+      return IDR_GLIC_BUTTON_VECTOR_ICON_V2;
+    case IDR_GLIC_STATUS_ICON:
+      return IDR_GLIC_STATUS_ICON_V2;
+    case IDR_GLIC_STATUS_ICON_DARK:
+      return IDR_GLIC_STATUS_ICON_DARK_V2;
+    case IDR_GLIC_STATUS_ICON_LIGHT:
+      return IDR_GLIC_STATUS_ICON_LIGHT_V2;
+    case IDR_GLIC_PROFILE_LOGO:
+      return IDR_GLIC_PROFILE_LOGO_V2;
+    case IDR_GLIC_PROFILE_BANNER_BOTTOM_LEFT:
+      return IDR_GLIC_PROFILE_BANNER_BOTTOM_LEFT_V2;
+    case IDR_GLIC_PROFILE_BANNER_TOP_RIGHT:
+      return IDR_GLIC_PROFILE_BANNER_TOP_RIGHT_V2;
+    case IDR_GLIC_PROFILE_BANNER_BOTTOM_LEFT_LIGHT:
+      return IDR_GLIC_PROFILE_BANNER_BOTTOM_LEFT_LIGHT_V2;
+    case IDR_GLIC_PROFILE_BANNER_TOP_RIGHT_LIGHT:
+      return IDR_GLIC_PROFILE_BANNER_TOP_RIGHT_LIGHT_V2;
+
+    default:
+      return id;
+  }
 }
 
 }  // namespace glic
diff --git a/chrome/browser/glic/resources/internal b/chrome/browser/glic/resources/internal
index 17c4e25..cb320ba 160000
--- a/chrome/browser/glic/resources/internal
+++ b/chrome/browser/glic/resources/internal
@@ -1 +1 @@
-Subproject commit 17c4e2565b19e4156b304349df23964da915e3ed
+Subproject commit cb320ba11dc958d243b0fd4dc1c93021d078ea5b
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager.cc b/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
index fd47bcf..96bed96 100644
--- a/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
+++ b/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
@@ -11,6 +11,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/thread_pool.h"
+#include "build/android_buildflags.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
@@ -112,7 +113,7 @@
 // necessarily for any given user profile.
 // Certain platforms (mobile) are blocked from remote-bound logging.
 bool IsRemoteLoggingFeatureEnabled() {
-#if BUILDFLAG(IS_ANDROID)
+#if BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_DESKTOP_ANDROID)
   bool enabled = false;
 #else
   bool enabled = true;
@@ -463,7 +464,7 @@
   if (remote_log_file_writer_factory_for_testing_) {
     return std::move(remote_log_file_writer_factory_for_testing_);
   } else {
-#if !BUILDFLAG(IS_ANDROID)
+#if !BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_DESKTOP_ANDROID)
     return std::make_unique<GzippedLogFileWriterFactory>(
         std::make_unique<GzipLogCompressorFactory>(
             std::make_unique<DefaultGzippedSizeEstimator::Factory>()));
diff --git a/chrome/browser/metrics/chrome_android_metrics_provider.cc b/chrome/browser/metrics/chrome_android_metrics_provider.cc
index 73a71b7..21ca6c0 100644
--- a/chrome/browser/metrics/chrome_android_metrics_provider.cc
+++ b/chrome/browser/metrics/chrome_android_metrics_provider.cc
@@ -8,6 +8,7 @@
 
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/system/sys_info.h"
 #include "base/task/thread_pool.h"
 #include "chrome/browser/android/customtabs/custom_tab_session_state_tracker.h"
 #include "chrome/browser/android/metrics/uma_session_stats.h"
@@ -77,6 +78,11 @@
   metrics::AndroidMetricsHelper::RegisterPrefs(registry);
 }
 
+void ChromeAndroidMetricsProvider::AsyncInit(base::OnceClosure done_callback) {
+  hardware_class_ = base::SysInfo::GetAndroidHardwareClass();
+  std::move(done_callback).Run();
+}
+
 void ChromeAndroidMetricsProvider::OnDidCreateMetricsLog() {
   const auto type = chrome::android::GetActivityType();
 
@@ -145,3 +151,14 @@
 void ChromeAndroidMetricsProvider::ResetGlobalStateForTesting() {
   metrics::AndroidMetricsHelper::ResetGlobalStateForTesting();
 }
+
+void ChromeAndroidMetricsProvider::ProvideSystemProfileMetrics(
+    metrics::SystemProfileProto* system_profile_proto) {
+  if (hardware_class_.empty()) {
+    return;
+  }
+
+  metrics::SystemProfileProto::Hardware* hardware =
+      system_profile_proto->mutable_hardware();
+  hardware->set_full_hardware_class(hardware_class_);
+}
diff --git a/chrome/browser/metrics/chrome_android_metrics_provider.h b/chrome/browser/metrics/chrome_android_metrics_provider.h
index 80ebfa8..f1e88b3 100644
--- a/chrome/browser/metrics/chrome_android_metrics_provider.h
+++ b/chrome/browser/metrics/chrome_android_metrics_provider.h
@@ -32,16 +32,20 @@
   static void RegisterPrefs(PrefRegistrySimple* registry);
 
   // metrics::MetricsProvider:
+  void AsyncInit(base::OnceClosure done_callback) override;
   void OnDidCreateMetricsLog() override;
   void ProvidePreviousSessionData(
       metrics::ChromeUserMetricsExtension* uma_proto) override;
   void ProvideCurrentSessionData(
       metrics::ChromeUserMetricsExtension* uma_proto) override;
+  void ProvideSystemProfileMetrics(metrics::SystemProfileProto* proto) override;
 
   static void ResetGlobalStateForTesting();
 
  private:
   raw_ptr<PrefService> local_state_;
+  // Stores the full hardware class of the Android device.
+  std::string hardware_class_;
 };
 
 #endif  // CHROME_BROWSER_METRICS_CHROME_ANDROID_METRICS_PROVIDER_H_
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptor.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptor.java
index af6c984..7d6b490 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptor.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptor.java
@@ -204,6 +204,7 @@
      * @param metadata The metadata including notification id, tag, type, etc.
      * @param pendingIntentProvider Provides the {@link PendingIntent} to launch Chrome.
      */
+    @SuppressWarnings("WrongConstant") // Triggers for |flags| on PendingIntent.getService().
     public static PendingIntent createInterceptPendingIntent(
             @IntentType int intentType,
             @NotificationUmaTracker.ActionType int actionType,
diff --git a/chrome/browser/picture_in_picture/BUILD.gn b/chrome/browser/picture_in_picture/BUILD.gn
index 3e2eb8a..89ce0a9c 100644
--- a/chrome/browser/picture_in_picture/BUILD.gn
+++ b/chrome/browser/picture_in_picture/BUILD.gn
@@ -36,6 +36,7 @@
       "picture_in_picture_occlusion_observer.h",
       "picture_in_picture_occlusion_tracker.h",
       "picture_in_picture_occlusion_tracker_observer.h",
+      "picture_in_picture_widget_fade_animator.h",
       "picture_in_picture_window.h",
       "picture_in_picture_window_manager_uma_helper.h",
       "scoped_disallow_picture_in_picture.h",
@@ -101,6 +102,7 @@
       "picture_in_picture_occlusion_observer.cc",
       "picture_in_picture_occlusion_tracker.cc",
       "picture_in_picture_occlusion_tracker_observer.cc",
+      "picture_in_picture_widget_fade_animator.cc",
       "picture_in_picture_window_manager_uma_helper.cc",
       "scoped_disallow_picture_in_picture.cc",
       "scoped_picture_in_picture_occlusion_observation.cc",
@@ -149,6 +151,7 @@
       "auto_pip_setting_overlay_view_unittest.cc",
       "auto_pip_setting_view_unittest.cc",
       "picture_in_picture_occlusion_tracker_unittest.cc",
+      "picture_in_picture_widget_fade_animator_unittest.cc",
       "picture_in_picture_window_manager_uma_helper_unittest.cc",
     ]
     deps += [
diff --git a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.cc b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.cc
index 0f1bd76..ddd3ffd 100644
--- a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.cc
+++ b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.cc
@@ -32,52 +32,101 @@
 }
 
 void AutoPictureInPictureTabModelObserverHelper::StartObserving() {
-  NOTIMPLEMENTED();
-  // TODO(crbug.com/421608904): add implementation
+  if (is_observing_) {
+    return;
+  }
+  is_observing_ = true;
+
+  // Start observing the list of TabModels.
+  TabModelList::AddObserver(this);
+
+  // Find the correct model to observe and set the initial activation state.
+  ReevaluateObservedModelAndState();
 }
 
 void AutoPictureInPictureTabModelObserverHelper::StopObserving() {
-  NOTIMPLEMENTED();
-  // TODO(crbug.com/421608904): add implementation
+  if (!is_observing_) {
+    return;
+  }
+  is_observing_ = false;
+
+  // Remove the global TabModelList observer.
+  TabModelList::RemoveObserver(this);
+
+  // If we are observing a specific TabModel, remove the observer from it.
+  if (observed_tab_model_) {
+    observed_tab_model_->RemoveObserver(this);
+    observed_tab_model_ = nullptr;
+  }
 }
 
+// The following callbacks are for events that might change the active tab
+// or the state of the observed tab model. We re-evaluate our state in each
+// case.
 content::WebContents*
 AutoPictureInPictureTabModelObserverHelper::GetActiveWebContents() const {
-  NOTIMPLEMENTED();
-  // TODO(crbug.com/421608904): add implementation
-  return nullptr;
+  if (!observed_tab_model_) {
+    return nullptr;
+  }
+  return observed_tab_model_->GetActiveWebContents();
 }
 
 void AutoPictureInPictureTabModelObserverHelper::DidSelectTab(
     TabAndroid* tab,
     TabModel::TabSelectionType type) {
-  NOTIMPLEMENTED();
-  // TODO(crbug.com/421608904): add implementation
+  ReevaluateObservedModelAndState();
 }
 
 void AutoPictureInPictureTabModelObserverHelper::TabRemoved(TabAndroid* tab) {
-  NOTIMPLEMENTED();
-  // TODO(crbug.com/421608904): add implementation
+  ReevaluateObservedModelAndState();
 }
 
 void AutoPictureInPictureTabModelObserverHelper::WillCloseTab(TabAndroid* tab) {
-  NOTIMPLEMENTED();
-  // TODO(crbug.com/421608904): add implementation
+  ReevaluateObservedModelAndState();
 }
 
 void AutoPictureInPictureTabModelObserverHelper::OnTabModelAdded(
     TabModel* model) {
-  NOTIMPLEMENTED();
-  // TODO(crbug.com/421608904): add implementation
+  ReevaluateObservedModelAndState();
 }
 
 void AutoPictureInPictureTabModelObserverHelper::OnTabModelRemoved(
     TabModel* model) {
-  NOTIMPLEMENTED();
-  // TODO(crbug.com/421608904): add implementation
+  ReevaluateObservedModelAndState();
+}
+
+void AutoPictureInPictureTabModelObserverHelper::
+    ReevaluateObservedModelAndState() {
+  // Find the TabModel that currently contains our observed WebContents.
+  TabModel* current_model =
+      TabModelList::GetTabModelForWebContents(GetObservedWebContents());
+
+  // If the TabModel has changed (e.g., tab moved between windows), update
+  // observers.
+  if (current_model != observed_tab_model_) {
+    if (observed_tab_model_) {
+      observed_tab_model_->RemoveObserver(this);
+    }
+    observed_tab_model_ = current_model;
+    if (observed_tab_model_) {
+      observed_tab_model_->AddObserver(this);
+    }
+  }
+
+  // Check for activation status.
+  UpdateIsTabActivated();
 }
 
 void AutoPictureInPictureTabModelObserverHelper::UpdateIsTabActivated() {
-  NOTIMPLEMENTED();
-  // TODO(crbug.com/421608904): add implementation
+  bool was_active = is_tab_activated_;
+  content::WebContents* active_wc = GetActiveWebContents();
+
+  // The observed tab is considered "active" if its model exists and its
+  // WebContents is the currently active one in that model.
+  is_tab_activated_ =
+      (observed_tab_model_ && active_wc == GetObservedWebContents());
+
+  if (is_tab_activated_ != was_active) {
+    RunCallback(is_tab_activated_);
+  }
 }
diff --git a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h
index 733bfd5..c61fd0ca 100644
--- a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h
+++ b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h
@@ -45,15 +45,16 @@
   void OnTabModelRemoved(TabModel* model) override;
 
  private:
+  // Find the correct tab model to observe.
+  void ReevaluateObservedModelAndState();
+
   // Updates `is_tab_activated_` based on the current model state and runs the
   // callback if it changed.
   void UpdateIsTabActivated();
 
-  // TODO(crbug.com/421608904): remove [[maybe_unused]] once implementation is
-  // added.
-  [[maybe_unused]] raw_ptr<TabModel> observed_tab_model_ = nullptr;
-  [[maybe_unused]] bool is_tab_activated_ = false;
-  [[maybe_unused]] bool is_observing_ = false;
+  raw_ptr<TabModel> observed_tab_model_ = nullptr;
+  bool is_tab_activated_ = false;
+  bool is_observing_ = false;
 };
 
 #endif  // CHROME_BROWSER_PICTURE_IN_PICTURE_AUTO_PICTURE_IN_PICTURE_TAB_MODEL_OBSERVER_HELPER_H_
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator.cc b/chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator.cc
new file mode 100644
index 0000000..23b0cf0
--- /dev/null
+++ b/chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator.cc
@@ -0,0 +1,36 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator.h"
+
+#include "ui/views/widget/widget.h"
+
+PictureInPictureWidgetFadeAnimator::PictureInPictureWidgetFadeAnimator() =
+    default;
+PictureInPictureWidgetFadeAnimator::~PictureInPictureWidgetFadeAnimator() =
+    default;
+
+void PictureInPictureWidgetFadeAnimator::AnimateShowWindow(
+    views::Widget* widget,
+    PictureInPictureWidgetFadeAnimator::WidgetShowType show_type) {
+  CancelAndReset();
+
+  widget->SetVisibilityChangedAnimationsEnabled(false);
+
+  fade_animator_ = std::make_unique<views::WidgetFadeAnimator>(widget);
+  fade_animator_->set_fade_in_duration(base::Milliseconds(kFadeInDurationMs));
+  fade_animator_->set_show_type(show_type);
+
+  fade_animator_->FadeIn();
+  ++fade_in_calls_count_;
+}
+
+void PictureInPictureWidgetFadeAnimator::CancelAndReset() {
+  if (!fade_animator_) {
+    return;
+  }
+  fade_animator_->CancelFadeIn();
+  fade_animator_->CancelFadeOut();
+  fade_animator_.reset();
+}
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator.h b/chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator.h
new file mode 100644
index 0000000..064d31e
--- /dev/null
+++ b/chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator.h
@@ -0,0 +1,56 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_PICTURE_IN_PICTURE_PICTURE_IN_PICTURE_WIDGET_FADE_ANIMATOR_H_
+#define CHROME_BROWSER_PICTURE_IN_PICTURE_PICTURE_IN_PICTURE_WIDGET_FADE_ANIMATOR_H_
+
+#include <memory>
+
+#include "ui/views/animation/widget_fade_animator.h"
+
+namespace views {
+class Widget;
+}
+
+// Fade animator used by both types of Picture-in-Picture windows (Video and
+// Document). Currently only used to animate the window opening.
+//
+// Fade in animation is disabled for Document Picture-in-Picture on Windows. On
+// Windows, resizable windows can not be translucent.
+class PictureInPictureWidgetFadeAnimator {
+ public:
+  static constexpr int kFadeInDurationMs = 500;
+
+  using WidgetShowType = views::WidgetFadeAnimator::WidgetShowType;
+  PictureInPictureWidgetFadeAnimator();
+  PictureInPictureWidgetFadeAnimator(
+      const PictureInPictureWidgetFadeAnimator&) = delete;
+  PictureInPictureWidgetFadeAnimator& operator=(
+      const PictureInPictureWidgetFadeAnimator&) = delete;
+  ~PictureInPictureWidgetFadeAnimator();
+
+  // Applies the "show animation" to `widget`. The show widget call is
+  // controlled using `show_type`. Video Picture-in-Picture windows are shown as
+  // inactive, while the show type for Document picture in picture windows is
+  // determined by the browser.
+  void AnimateShowWindow(
+      views::Widget* widget,
+      PictureInPictureWidgetFadeAnimator::WidgetShowType show_type);
+
+  // Cancels any ongoing animations and resets the `fade_animator_` if it
+  // exists.
+  void CancelAndReset();
+
+  views::WidgetFadeAnimator* GetWidgetFadeAnimatorForTesting() {
+    return fade_animator_.get();
+  }
+
+  int GetFadeInCallsCountForTesting() { return fade_in_calls_count_; }
+
+ private:
+  std::unique_ptr<views::WidgetFadeAnimator> fade_animator_;
+  int fade_in_calls_count_ = 0;
+};
+
+#endif  // CHROME_BROWSER_PICTURE_IN_PICTURE_PICTURE_IN_PICTURE_WIDGET_FADE_ANIMATOR_H_
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator_unittest.cc b/chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator_unittest.cc
new file mode 100644
index 0000000..8380aeb4
--- /dev/null
+++ b/chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator_unittest.cc
@@ -0,0 +1,202 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator.h"
+
+#include "base/test/task_environment.h"
+#include "ui/compositor/layer.h"
+#include "ui/views/animation/widget_fade_animator.h"
+#include "ui/views/test/views_test_base.h"
+#include "ui/views/widget/widget.h"
+
+namespace {
+
+class PictureInPictureWidgetFadeAnimatorTest : public views::ViewsTestBase {
+ public:
+  PictureInPictureWidgetFadeAnimatorTest()
+      : views::ViewsTestBase(
+            base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
+  PictureInPictureWidgetFadeAnimatorTest(
+      const PictureInPictureWidgetFadeAnimatorTest&) = delete;
+  PictureInPictureWidgetFadeAnimatorTest& operator=(
+      const PictureInPictureWidgetFadeAnimatorTest&) = delete;
+
+  void SetUp() override {
+    ViewsTestBase::SetUp();
+    fade_animator_ = std::make_unique<PictureInPictureWidgetFadeAnimator>();
+    widget_ = CreateTestWidget(views::Widget::InitParams::CLIENT_OWNS_WIDGET);
+  }
+
+  void TearDown() override {
+    if (widget_) {
+      widget_.reset();
+    }
+    ViewsTestBase::TearDown();
+  }
+
+  bool IsFadingIn() {
+    return fade_animator()->GetWidgetFadeAnimatorForTesting()->IsFadingIn();
+  }
+
+  views::Widget* widget() { return widget_.get(); }
+
+  PictureInPictureWidgetFadeAnimator* fade_animator() {
+    return fade_animator_.get();
+  }
+
+ protected:
+  void FastForwardPastAnimationDuration() {
+    task_environment()->FastForwardBy(base::Milliseconds(
+        PictureInPictureWidgetFadeAnimator::kFadeInDurationMs * 2));
+  }
+  void FastForwardToMiddleOfAnimation() {
+    task_environment()->FastForwardBy(base::Milliseconds(
+        PictureInPictureWidgetFadeAnimator::kFadeInDurationMs / 2));
+  }
+
+ private:
+  std::unique_ptr<views::Widget> widget_;
+  std::unique_ptr<PictureInPictureWidgetFadeAnimator> fade_animator_;
+};
+
+}  // anonymous namespace
+
+TEST_F(PictureInPictureWidgetFadeAnimatorTest,
+       AnimateShowWindow_CreatesAndStartsAnimation) {
+  ASSERT_NE(nullptr, widget());
+  ASSERT_FALSE(widget()->IsVisible());
+  ASSERT_NE(nullptr, widget()->GetLayer());
+  ASSERT_FLOAT_EQ(1.0f, widget()->GetLayer()->opacity());
+
+  // Start animation.
+  fade_animator()->AnimateShowWindow(
+      widget(),
+      PictureInPictureWidgetFadeAnimator::WidgetShowType::kShowInactive);
+
+  // Fast-forward to the middle of the animation and, verify that the fade
+  // animator is fading in.
+  FastForwardToMiddleOfAnimation();
+  EXPECT_TRUE(widget()->IsVisible());
+  EXPECT_TRUE(IsFadingIn());
+
+  // Fast-forward past the end of the animation and, verify that the fade
+  // animator is not fading in.
+  FastForwardPastAnimationDuration();
+  EXPECT_TRUE(widget()->IsVisible());
+  EXPECT_FALSE(IsFadingIn());
+}
+
+TEST_F(PictureInPictureWidgetFadeAnimatorTest,
+       CancelAndReset_WhenAnimatorExists_ResetsAnimator) {
+  // Start animation.
+  fade_animator()->AnimateShowWindow(
+      widget(),
+      PictureInPictureWidgetFadeAnimator::WidgetShowType::kShowInactive);
+
+  // Fast-forward to the middle of the animation and, verify that the fade
+  // animator is fading in.
+  FastForwardToMiddleOfAnimation();
+  EXPECT_TRUE(widget()->IsVisible());
+  EXPECT_TRUE(IsFadingIn());
+
+  // Cancel and reset animator in the middle of the animation and, verify that
+  // the widget remains visible and the fade animator is reset.
+  fade_animator()->CancelAndReset();
+  EXPECT_TRUE(widget()->IsVisible());
+  EXPECT_EQ(nullptr, fade_animator()->GetWidgetFadeAnimatorForTesting());
+}
+
+TEST_F(PictureInPictureWidgetFadeAnimatorTest,
+       CancelAndReset_WhenNotAnimating_DoesNothing) {
+  ASSERT_NE(nullptr, widget());
+  ASSERT_FALSE(widget()->IsVisible());
+  ASSERT_NE(nullptr, widget()->GetLayer());
+  ASSERT_FLOAT_EQ(1.0f, widget()->GetLayer()->opacity());
+
+  // Calling `CancelAndReset` when the animation has not started should not
+  // crash.
+  fade_animator()->CancelAndReset();
+  ASSERT_FALSE(widget()->IsVisible());
+  EXPECT_EQ(nullptr, fade_animator()->GetWidgetFadeAnimatorForTesting());
+}
+
+TEST_F(PictureInPictureWidgetFadeAnimatorTest,
+       AnimateShowWindow_MultipleCalls_RecreatesAnimator) {
+  // Start animation.
+  fade_animator()->AnimateShowWindow(
+      widget(),
+      PictureInPictureWidgetFadeAnimator::WidgetShowType::kShowInactive);
+
+  // Fast-forward to the middle of the animation and, verify that the fade
+  // animator is fading in.
+  FastForwardToMiddleOfAnimation();
+  EXPECT_TRUE(IsFadingIn());
+
+  // Second call to `AnimateShowWindow` should cancel the first animation and
+  // then start a new one.
+  fade_animator()->AnimateShowWindow(
+      widget(),
+      PictureInPictureWidgetFadeAnimator::WidgetShowType::kShowActive);
+  EXPECT_TRUE(widget()->IsVisible());
+  EXPECT_TRUE(IsFadingIn());
+
+  // Fast-forward past the end of the animation and, verify the fade animator is
+  // not fading in.
+  FastForwardPastAnimationDuration();
+  EXPECT_FALSE(IsFadingIn());
+}
+
+TEST_F(PictureInPictureWidgetFadeAnimatorTest,
+       Destructor_WithActiveAnimation_CleansUp) {
+  // Create a local fade animator and start the animation.
+  std::unique_ptr<PictureInPictureWidgetFadeAnimator> local_fade_animator =
+      std::make_unique<PictureInPictureWidgetFadeAnimator>();
+  local_fade_animator->AnimateShowWindow(
+      widget(),
+      PictureInPictureWidgetFadeAnimator::WidgetShowType::kShowInactive);
+
+  // Fast-forward to the middle of the animation and, verify that the fade
+  // animator is fading in.
+  FastForwardToMiddleOfAnimation();
+  EXPECT_TRUE(
+      local_fade_animator->GetWidgetFadeAnimatorForTesting()->IsFadingIn());
+
+  // Resetting the local animator should not crash and the widget should remain
+  // visible.
+  local_fade_animator.reset();
+  EXPECT_TRUE(widget()->IsVisible());
+}
+
+TEST_F(PictureInPictureWidgetFadeAnimatorTest,
+       CancelAndReset_DoesNotResetFadeInCallsCount) {
+  EXPECT_EQ(0, fade_animator()->GetFadeInCallsCountForTesting());
+
+  // Start animation and verify the fade in calls count.
+  fade_animator()->AnimateShowWindow(
+      widget(),
+      PictureInPictureWidgetFadeAnimator::WidgetShowType::kShowInactive);
+  EXPECT_EQ(1, fade_animator()->GetFadeInCallsCountForTesting());
+
+  // Verify that calling `CancelAndReset` does not set the fade in calls count
+  // to 0.
+  fade_animator()->CancelAndReset();
+  EXPECT_EQ(1, fade_animator()->GetFadeInCallsCountForTesting());
+}
+
+TEST_F(PictureInPictureWidgetFadeAnimatorTest,
+       AnimateShowWindow_MultipleCalls_IncrementsFadeInCallsCount) {
+  EXPECT_EQ(0, fade_animator()->GetFadeInCallsCountForTesting());
+
+  // Start animation and verify the fade in calls count.
+  fade_animator()->AnimateShowWindow(
+      widget(),
+      PictureInPictureWidgetFadeAnimator::WidgetShowType::kShowInactive);
+  EXPECT_EQ(1, fade_animator()->GetFadeInCallsCountForTesting());
+
+  // Second call to `AnimateShowWindow` should increase the fade in calls count.
+  fade_animator()->AnimateShowWindow(
+      widget(),
+      PictureInPictureWidgetFadeAnimator::WidgetShowType::kShowActive);
+  EXPECT_EQ(2, fade_animator()->GetFadeInCallsCountForTesting());
+}
diff --git a/chrome/browser/picture_in_picture/test/BUILD.gn b/chrome/browser/picture_in_picture/test/BUILD.gn
index cc83911..4b0655a 100644
--- a/chrome/browser/picture_in_picture/test/BUILD.gn
+++ b/chrome/browser/picture_in_picture/test/BUILD.gn
@@ -17,6 +17,7 @@
     "//base:callback_java",
     "//base/test:public_transit_java",
     "//chrome/android:chrome_java",
+    "//chrome/android/javatests:chrome_test_java_helper",
     "//chrome/browser/flags:java",
     "//chrome/browser/tab:java",
     "//chrome/browser/tabmodel:java",
diff --git a/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTest.java b/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTest.java
index 3ab9c3eb..a77f0810 100644
--- a/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTest.java
+++ b/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTest.java
@@ -5,8 +5,14 @@
 package org.chromium.chrome.browser.picture_in_picture;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import static org.chromium.base.test.util.Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE;
+import static org.chromium.chrome.browser.multiwindow.MultiWindowTestHelper.moveActivityToFront;
 
 import androidx.test.filters.MediumTest;
+import androidx.test.platform.app.InstrumentationRegistry;
 
 import org.junit.After;
 import org.junit.Before;
@@ -15,16 +21,31 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.ApplicationTestUtils;
 import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.CriteriaHelper;
 import org.chromium.base.test.util.DisabledTest;
+import org.chromium.base.test.util.Restriction;
+import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.browser.multiwindow.MultiWindowTestHelper;
+import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabLaunchType;
+import org.chromium.chrome.browser.tab.TabSelectionType;
+import org.chromium.chrome.browser.tabmodel.TabModelUtils;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.R;
 import org.chromium.chrome.test.transit.AutoResetCtaTransitTestRule;
 import org.chromium.chrome.test.transit.ChromeTransitTestRules;
+import org.chromium.chrome.test.transit.hub.RegularTabSwitcherStation;
 import org.chromium.chrome.test.transit.page.PageStation;
 import org.chromium.chrome.test.transit.page.WebPageStation;
+import org.chromium.chrome.test.util.ChromeTabUtils;
+import org.chromium.chrome.test.util.MenuUtils;
+import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.content_public.browser.WebContents;
 
 import java.util.concurrent.TimeoutException;
@@ -34,21 +55,46 @@
  * a JNI bridge to verify the behavior of the C++ class.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@CommandLineFlags.Add({
+    ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
+    ChromeSwitches.DISABLE_TAB_MERGING_FOR_TESTING
+})
+@Restriction({RESTRICTION_TYPE_NON_LOW_END_DEVICE})
 @Batch(Batch.PER_CLASS)
 public class AutoPiPTabModelObserverHelperTest {
     @Rule
     public final AutoResetCtaTransitTestRule mActivityTestRule =
             ChromeTransitTestRules.fastAutoResetCtaActivityRule();
 
-    private WebPageStation mPage;
+    private static class TabActivationCallbackHelper extends CallbackHelper {
+        private boolean mIsActivated;
+
+        public void notifyCalled(boolean value) {
+            mIsActivated = value;
+            notifyCalled();
+        }
+
+        public boolean isActivated() {
+            return mIsActivated;
+        }
+    }
+
+    private TabActivationCallbackHelper mOnActivationChangedCallbackHelper;
+    private ChromeTabbedActivity mInitialActivity;
+    private ChromeTabbedActivity mSecondActivity;
+    private WebPageStation mInitialPage;
+    private Tab mInitialTab;
     private WebContents mObservedWebContents;
-    private final CallbackHelper mOnActivationChangedCallbackHelper = new CallbackHelper();
+
+    private static final String BLANK_PAGE_URL = "about:blank";
 
     @Before
     public void setUp() {
-        mPage = mActivityTestRule.startOnBlankPage();
-        mObservedWebContents = mPage.webContentsElement.get();
+        mOnActivationChangedCallbackHelper = new TabActivationCallbackHelper();
+        mInitialPage = mActivityTestRule.startOnBlankPage();
+        mInitialTab = mInitialPage.loadedTabElement.get();
+        mInitialActivity = mInitialPage.getActivity();
+        mObservedWebContents = mInitialPage.webContentsElement.get();
 
         // Initialize the C++ test utilities for the WebContents under observation,
         // passing it the callback to be invoked from C++.
@@ -57,7 +103,7 @@
                     AutoPiPTabModelObserverHelperTestUtils.initialize(
                             mObservedWebContents,
                             (isActivated) -> {
-                                mOnActivationChangedCallbackHelper.notifyCalled();
+                                mOnActivationChangedCallbackHelper.notifyCalled(isActivated);
                             });
                 });
     }
@@ -66,51 +112,218 @@
     public void tearDown() {
         ThreadUtils.runOnUiThreadBlocking(
                 () -> AutoPiPTabModelObserverHelperTestUtils.destroy(mObservedWebContents));
+
+        if (mSecondActivity != null) {
+            ApplicationTestUtils.finishActivity(mSecondActivity);
+        }
+        if (mInitialActivity != null) {
+            ApplicationTestUtils.finishActivity(mInitialActivity);
+        }
     }
 
+    /** Tests that tab switching should activate/deactivate the observed tab. */
     @Test
     @MediumTest
-    @DisabledTest(message = "Implementation not yet landed. See crbug.com/421608904")
     public void testTriggersOnTabActivationChanged() throws TimeoutException {
-        int callCount = mOnActivationChangedCallbackHelper.getCallCount();
+        int callCount = startObservingAndAssertInitialCallback(/* expectedIsActivated= */ true);
 
-        // Start observing.
-        AutoPiPTabModelObserverHelperTestUtils.startObserving(mObservedWebContents);
-
-        // Open and switch to a new tab. This should deactivate our observed tab.
-        PageStation page = mPage.openNewTabFast();
+        PageStation page = mInitialPage.openNewTabFast();
         mOnActivationChangedCallbackHelper.waitForCallback(callCount++);
+        assertFalse(mOnActivationChangedCallbackHelper.isActivated());
 
-        // Switch back to the original tab. This should activate it.
         page.openRegularTabSwitcher().selectTabAtIndex(0, WebPageStation.newBuilder());
         mOnActivationChangedCallbackHelper.waitForCallback(callCount++);
+        assertTrue(mOnActivationChangedCallbackHelper.isActivated());
     }
 
+    /** Tests that stopping observation prevents callbacks, and starting it resumes them. */
     @Test
     @MediumTest
-    @DisabledTest(message = "Implementation not yet landed. See crbug.com/421608904")
     public void testStopAndStartObserving() throws TimeoutException {
-        int callCount = mOnActivationChangedCallbackHelper.getCallCount();
+        int callCount = startObservingAndAssertInitialCallback(/* expectedIsActivated= */ true);
 
-        // Start observing, then immediately stop.
-        AutoPiPTabModelObserverHelperTestUtils.startObserving(mObservedWebContents);
         AutoPiPTabModelObserverHelperTestUtils.stopObserving(mObservedWebContents);
-
-        // Open a new tab. Since we are not observing, no additional callback
-        // should fire.
-        PageStation page = mPage.openNewTabFast();
+        PageStation page = mInitialPage.openNewTabFast();
         assertEquals(
-                "Callback should not have fired.",
+                "Callback should not have fired after stopping observation.",
                 callCount,
                 mOnActivationChangedCallbackHelper.getCallCount());
 
-        // Start observing again.
-        AutoPiPTabModelObserverHelperTestUtils.startObserving(mObservedWebContents);
+        // Start observing again. Since the second tab is currently selected, the originally
+        // observed tab is not active.
+        callCount = startObservingAndAssertInitialCallback(/* expectedIsActivated= */ false);
 
-        // Switch back to the original tab. It should now trigger the callback.
+        // Tab switching after observing is resumed should trigger the callback.
         page.openRegularTabSwitcher().selectTabAtIndex(0, WebPageStation.newBuilder());
         mOnActivationChangedCallbackHelper.waitForCallback(callCount++);
+        assertTrue(mOnActivationChangedCallbackHelper.isActivated());
     }
 
-    // TODO(crbug.com/421608904): add additional multi window tests.
+    /** Tests that creating a tab in the background does not trigger a callback. */
+    @Test
+    @MediumTest
+    public void testOpenBackgroundTab() throws TimeoutException {
+        int callCount = startObservingAndAssertInitialCallback(/* expectedIsActivated= */ true);
+
+        // Open a tab in the background
+        Tab backgroundTab =
+                ThreadUtils.runOnUiThreadBlocking(
+                        () -> {
+                            return mInitialActivity
+                                    .getCurrentTabCreator()
+                                    .createNewTab(
+                                            new LoadUrlParams(BLANK_PAGE_URL),
+                                            TabLaunchType.FROM_LONGPRESS_BACKGROUND,
+                                            mInitialTab);
+                        });
+        ChromeTabUtils.waitForTabPageLoaded(backgroundTab, BLANK_PAGE_URL);
+        assertEquals(
+                "Callback should not have fired after opening a background tab.",
+                callCount,
+                mOnActivationChangedCallbackHelper.getCallCount());
+
+        // Select the background tab
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    TabModelUtils.selectTabById(
+                            mInitialActivity.getTabModelSelector(),
+                            backgroundTab.getId(),
+                            TabSelectionType.FROM_USER);
+                });
+        mOnActivationChangedCallbackHelper.waitForCallback(callCount++);
+        assertFalse(mOnActivationChangedCallbackHelper.isActivated());
+    }
+
+    /** Tests that creating a tab in the background does not trigger a callback. */
+    @Test
+    @MediumTest
+    public void testCloseTab() throws TimeoutException {
+        int callCount = startObservingAndAssertInitialCallback(/* expectedIsActivated= */ true);
+
+        // Open a second tab and switch to it
+        PageStation page = mInitialPage.openNewTabFast();
+        mOnActivationChangedCallbackHelper.waitForCallback(callCount++);
+        assertFalse(mOnActivationChangedCallbackHelper.isActivated());
+
+        // Switch back to the original tab
+        page = page.openRegularTabSwitcher().selectTabAtIndex(0, WebPageStation.newBuilder());
+        mOnActivationChangedCallbackHelper.waitForCallback(callCount++);
+        assertTrue(mOnActivationChangedCallbackHelper.isActivated());
+
+        // Close the active tab should trigger a callback
+        RegularTabSwitcherStation regularTabSwitcher = page.openRegularTabSwitcher();
+        regularTabSwitcher = regularTabSwitcher.closeTabAtIndex(0, RegularTabSwitcherStation.class);
+        mOnActivationChangedCallbackHelper.waitForCallback(callCount++);
+        assertFalse(mOnActivationChangedCallbackHelper.isActivated());
+    }
+
+    /* Tests that opening a second window doesn't change the tab model being observed. */
+    @Test
+    @MediumTest
+    public void testOpenSecondWindow() throws TimeoutException {
+        // TODO(crbug.com/425983853): use MultiWindowManagerApi31 methods to create windows.
+        if (MultiWindowUtils.isMultiInstanceApi31Enabled()) {
+            return;
+        }
+        int callCount = startObservingAndAssertInitialCallback(/* expectedIsActivated= */ true);
+
+        // Create a second window
+        createAndInitializeSecondWindow(mInitialActivity);
+        assertEquals(
+                "Callback should not have fired after opening a second window.",
+                callCount,
+                mOnActivationChangedCallbackHelper.getCallCount());
+
+        // Switching away from the observed tab in the original window should still deactivate it
+        moveActivityToFront(mInitialActivity);
+        mInitialPage.openNewTabFast();
+        mOnActivationChangedCallbackHelper.waitForCallback(callCount++);
+        assertFalse(mOnActivationChangedCallbackHelper.isActivated());
+    }
+
+    /**
+     * Tests moving an active observed tab to a new window, where it remains active. This should not
+     * trigger a callback as its activation state doesn't change.
+     */
+    @Test
+    @MediumTest
+    public void testMoveActiveObservedTabToNewWindow() throws TimeoutException {
+        // TODO(crbug.com/425983853): use MultiWindowManagerApi31 methods to create windows and
+        // reparent tabs.
+        if (MultiWindowUtils.isMultiInstanceApi31Enabled()) {
+            return;
+        }
+        int callCount = startObservingAndAssertInitialCallback(/* expectedIsActivated= */ true);
+        // Open a new tab
+        PageStation page = mInitialPage.openNewTabFast();
+        mOnActivationChangedCallbackHelper.waitForCallback(callCount++);
+        assertFalse(mOnActivationChangedCallbackHelper.isActivated());
+        // Switch back to the original tab
+        page = page.openRegularTabSwitcher().selectTabAtIndex(0, WebPageStation.newBuilder());
+        mOnActivationChangedCallbackHelper.waitForCallback(callCount++);
+        assertTrue(mOnActivationChangedCallbackHelper.isActivated());
+
+        // Create a second window
+        createAndInitializeSecondWindow(mInitialActivity);
+        // Move the original tab(active) to the new window
+        moveActivityToFront(mInitialActivity);
+        MenuUtils.invokeCustomMenuActionSync(
+                InstrumentationRegistry.getInstrumentation(),
+                mSecondActivity,
+                R.id.move_to_other_window_menu_id);
+
+        assertEquals(
+                "Moving an active tab should not trigger a callback.",
+                callCount,
+                mOnActivationChangedCallbackHelper.getCallCount());
+    }
+
+    /**
+     * Tests moving an inactive observed tab to a new window and making it active. This should
+     * trigger a callback.
+     */
+    @Test
+    @MediumTest
+    @DisabledTest(
+            message = "Background tab reparenting test support not added. See crbug.com/425983853")
+    public void testMoveInactiveObservedTabToNewWindow() {
+        // TODO(crbug.com/421608904): test moving observed tab in the background to another window.
+        // The tab should be activated.
+    }
+
+    /**
+     * Creates and initializes a second ChromeTabbedActivity window. This is a blocking call that
+     * waits until the new activity is fully ready for interaction.
+     *
+     * @param initialActivity The initial activity to create the second one from.
+     */
+    private void createAndInitializeSecondWindow(ChromeTabbedActivity initialActivity) {
+        mSecondActivity = MultiWindowTestHelper.createSecondChromeTabbedActivity(initialActivity);
+
+        CriteriaHelper.pollUiThread(
+                () -> mSecondActivity.getTabModelSelector().isTabStateInitialized());
+        ChromeTabUtils.fullyLoadUrlInNewTab(
+                InstrumentationRegistry.getInstrumentation(),
+                mSecondActivity,
+                BLANK_PAGE_URL,
+                /* incognito= */ false);
+    }
+
+    /**
+     * Helper method to start observing and assert the state of the initial callback.
+     *
+     * @param expectedIsActivated The expected activation state after starting to observe.
+     * @return The updated call count.
+     * @throws TimeoutException if the observer callback does not fire within the timeout period.
+     */
+    private int startObservingAndAssertInitialCallback(boolean expectedIsActivated)
+            throws TimeoutException {
+        int callCount = mOnActivationChangedCallbackHelper.getCallCount();
+
+        AutoPiPTabModelObserverHelperTestUtils.startObserving(mObservedWebContents);
+        mOnActivationChangedCallbackHelper.waitForCallback(callCount);
+        assertEquals(expectedIsActivated, mOnActivationChangedCallbackHelper.isActivated());
+
+        return mOnActivationChangedCallbackHelper.getCallCount();
+    }
 }
diff --git a/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc b/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc
index 0157b41..bf800c2 100644
--- a/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc
+++ b/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc
@@ -154,8 +154,7 @@
 
   // views::ViewObserver overrides.
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override {
+                               views::View* starting_view) override {
     MaybeNotifyOfVisibilityChange(observed_view);
   }
   void OnViewBoundsChanged(views::View* observed_view) override {
@@ -237,8 +236,7 @@
   ~OverlayControlsBecomingVisibleObserver() override = default;
 
   void OnViewVisibilityChanged(views::View*,
-                               views::View* controls_container,
-                               bool visible) override {
+                               views::View* controls_container) override {
     if (controls_container->GetVisible()) {
       std::move(visibility_changed_callback_).Run();
     } else {
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 4614fac..339510d 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -852,9 +852,6 @@
   { key::kWebHidBlockedForUrls,
     prefs::kManagedWebHidBlockedForUrls,
     base::Value::Type::LIST },
-  { key::kWebRtcEventLogCollectionAllowed,
-    prefs::kWebRtcEventLogCollectionAllowed,
-    base::Value::Type::BOOLEAN },
   { key::kWebRtcIPHandling,
     prefs::kWebRTCIPHandlingPolicy,
     base::Value::Type::STRING },
@@ -1026,6 +1023,9 @@
   { key::kEnableMediaRouter,
     prefs::kEnableMediaRouter,
     base::Value::Type::BOOLEAN },
+  { key::kWebRtcEventLogCollectionAllowed,
+    prefs::kWebRtcEventLogCollectionAllowed,
+    base::Value::Type::BOOLEAN },
   { key::kWebRtcUdpPortRange,
     prefs::kWebRTCUDPPortRange,
     base::Value::Type::STRING },
diff --git a/chrome/browser/preferences/BUILD.gn b/chrome/browser/preferences/BUILD.gn
index 895b8c5..c5f1d8c 100644
--- a/chrome/browser/preferences/BUILD.gn
+++ b/chrome/browser/preferences/BUILD.gn
@@ -75,7 +75,7 @@
     "//components/translate/core/browser/translate_pref_names.h",
   ]
 
-  template = "android/java_templates/Pref.java.tmpl"
+  class_name = "org.chromium.chrome.browser.preferences.Pref"
 }
 
 generate_jni("jni_headers") {
diff --git a/chrome/browser/preferences/android/java_templates/Pref.java.tmpl b/chrome/browser/preferences/android/java_templates/Pref.java.tmpl
deleted file mode 100644
index e02acfb0..0000000
--- a/chrome/browser/preferences/android/java_templates/Pref.java.tmpl
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.preferences;
-
-/** Contains pref string constants. */
-public final class Pref {{
-
-{NATIVE_STRINGS}
-
-    // Prevents instantiation.
-    private Pref() {{}}
-}}
diff --git a/chrome/browser/preloading/search_preload/BUILD.gn b/chrome/browser/preloading/search_preload/BUILD.gn
index 3669de8..35115d45 100644
--- a/chrome/browser/preloading/search_preload/BUILD.gn
+++ b/chrome/browser/preloading/search_preload/BUILD.gn
@@ -44,6 +44,7 @@
   deps = [
     ":search_preload",
     "//base/test:test_support",
+    "//chrome/browser/autocomplete",
     "//chrome/browser/search_engines",
     "//chrome/test:platform_browser_tests",
     "//chrome/test:test_support",
diff --git a/chrome/browser/profiles/BUILD.gn b/chrome/browser/profiles/BUILD.gn
index 1513ed7..a80e6d55 100644
--- a/chrome/browser/profiles/BUILD.gn
+++ b/chrome/browser/profiles/BUILD.gn
@@ -227,6 +227,7 @@
     "//chrome/browser:font_pref",
     "//chrome/browser/affiliations",
     "//chrome/browser/ai",
+    "//chrome/browser/autocomplete",
     "//chrome/browser/autofill",
     "//chrome/browser/background:background",
     "//chrome/browser/bitmap_fetcher",
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
index f2978a4..97a5e201 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -131,7 +131,6 @@
 #include "net/test/embedded_test_server/http_response.h"
 #include "pdf/buildflags.h"
 #include "pdf/pdf_features.h"
-#include "services/network/public/cpp/ip_address_space_overrides_test_utils.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -350,7 +349,7 @@
   }
 
   void OpenImagePageAndContextMenu(std::string image_path) {
-    ASSERT_TRUE(embedded_test_server()->Started());
+    ASSERT_TRUE(embedded_test_server()->Start());
     GURL image_url(embedded_test_server()->GetURL(image_path));
     GURL page("data:text/html,<img src='" + image_url.spec() + "'>");
     ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), page));
@@ -477,54 +476,6 @@
 #endif
   }
 
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    ContextMenuBrowserTestBase::SetUpCommandLine(command_line);
-    ASSERT_TRUE(embedded_test_server()->Start());
-    // Treat the test server as public to bypass Local Network Access checks.
-    network::AddPublicIpAddressSpaceOverrideToCommandLine(
-        *embedded_test_server(), *command_line);
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-// Like ContextMenuBrowserTest, but doesn't set up
-// embedded_test_server()-Start() because a few tests need to do special setup.
-class ContextMenuBrowserNoEmbeddedServerStartTest
-    : public ContextMenuBrowserTestBase,
-      public ::testing::WithParamInterface</*is_preview_enabled*/ bool> {
- protected:
-  ContextMenuBrowserNoEmbeddedServerStartTest() {
-    if (IsPreviewEnabled()) {
-      scoped_feature_list_.InitWithFeatures(
-          {blink::features::kLinkPreview,
-#if BUILDFLAG(ENABLE_GLIC)
-           features::kGlic,
-#endif  // BUILDFLAG(ENABLE_GLIC)
-           media::kContextMenuSaveVideoFrameAs,
-           media::kContextMenuSearchForVideoFrame},
-          {});
-    } else {
-      scoped_feature_list_.InitWithFeatures(
-          {
-#if BUILDFLAG(ENABLE_GLIC)
-              features::kGlic,
-#endif  // BUILDFLAG(ENABLE_GLIC)
-              media::kContextMenuSaveVideoFrameAs,
-              media::kContextMenuSearchForVideoFrame},
-          {blink::features::kLinkPreview});
-    }
-  }
-
-  bool IsPreviewEnabled() {
-#if BUILDFLAG(IS_ANDROID)
-    return false;
-#else
-    return GetParam();
-#endif
-  }
-
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
 };
@@ -537,14 +488,6 @@
                                              : "LinkPreviewDisabled";
                          });
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         ContextMenuBrowserNoEmbeddedServerStartTest,
-                         testing::Bool(),
-                         [](const testing::TestParamInfo<bool>& info) {
-                           return info.param ? "LinkPreviewEnabled"
-                                             : "LinkPreviewDisabled";
-                         });
-
 class PdfPluginContextMenuBrowserTest : public PDFExtensionTestBase {
  public:
   PdfPluginContextMenuBrowserTest() = default;
@@ -801,6 +744,8 @@
 // Verifies "Save as" is not enabled for links blocked via policy.
 IN_PROC_BROWSER_TEST_P(ContextMenuBrowserTest,
                        SaveAsEntryIsDisabledForBlockedUrls) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+
   auto initial_url = embedded_test_server()->GetURL("/empty.html");
   browser()->profile()->GetPrefs()->SetList(
       policy::policy_prefs::kUrlBlocklist,
@@ -820,6 +765,8 @@
 // Verifies "Save as" is enabled for links that are not blocked via policy.
 IN_PROC_BROWSER_TEST_P(ContextMenuBrowserTest,
                        SaveAsEntryIsNotDisabledForNonBlockedUrls) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+
   auto initial_url = embedded_test_server()->GetURL("/empty.html");
   browser()->profile()->GetPrefs()->SetList(
       policy::policy_prefs::kUrlBlocklist,
@@ -1644,6 +1591,7 @@
 
 IN_PROC_BROWSER_TEST_P(ContextMenuBrowserTest,
                        OpenNewTabInChromeFromWebAppWithAnOpenBrowser) {
+  ASSERT_TRUE(embedded_test_server()->Start());
   GURL title1(embedded_test_server()->GetURL("/title1.html"));
   GURL title2(embedded_test_server()->GetURL("/title2.html"));
 
@@ -1687,6 +1635,7 @@
 
 IN_PROC_BROWSER_TEST_P(ContextMenuBrowserTest,
                        OpenNewTabInChromeFromWebAppWithoutAnOpenBrowser) {
+  ASSERT_TRUE(embedded_test_server()->Start());
   GURL title1(embedded_test_server()->GetURL("/title1.html"));
 
   const AppId app_id = InstallTestWebApp(
@@ -1735,6 +1684,7 @@
 IN_PROC_BROWSER_TEST_P(ContextMenuBrowserTest, OpenAboutBlankInNewTab) {
   ui_test_utils::AllBrowserTabAddedWaiter add_tab;
 
+  ASSERT_TRUE(embedded_test_server()->Start());
   GURL page(embedded_test_server()->GetURL("/title1.html"));
 
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), page));
@@ -1760,6 +1710,7 @@
 IN_PROC_BROWSER_TEST_P(ContextMenuBrowserTest, OpenDataURLInNewTab) {
   ui_test_utils::AllBrowserTabAddedWaiter add_tab;
 
+  ASSERT_TRUE(embedded_test_server()->Start());
   GURL page(embedded_test_server()->GetURL("/title1.html"));
 
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), page));
@@ -1784,6 +1735,7 @@
 IN_PROC_BROWSER_TEST_P(ContextMenuBrowserTest, OpenInNewTabReferrer) {
   ui_test_utils::AllBrowserTabAddedWaiter add_tab;
 
+  ASSERT_TRUE(embedded_test_server()->Start());
   GURL echoheader(embedded_test_server()->GetURL("/echoheader?Referer"));
 
   // Go to a |page| with a link to echoheader URL.
@@ -1822,6 +1774,7 @@
 IN_PROC_BROWSER_TEST_P(ContextMenuBrowserTest, OpenIncognitoNoneReferrer) {
   ui_test_utils::AllBrowserTabAddedWaiter add_tab;
 
+  ASSERT_TRUE(embedded_test_server()->Start());
   GURL echoheader(embedded_test_server()->GetURL("/echoheader?Referer"));
 
   // Go to a |page| with a link to echoheader URL.
@@ -1857,6 +1810,7 @@
   // Register observer.
   ContextMenuWaiter menu_observer;
 
+  ASSERT_TRUE(embedded_test_server()->Start());
   GURL url(embedded_test_server()->GetURL("/download-anchor-same-origin.html"));
 
   // Go to a page with a link having download attribute.
@@ -1894,6 +1848,7 @@
 // frame.  This is a regression test for https://crbug.com/1085040.
 IN_PROC_BROWSER_TEST_P(ContextMenuBrowserTest,
                        MenuContentsVerification_MainFrame) {
+  ASSERT_TRUE(embedded_test_server()->Start());
   GURL url(embedded_test_server()->GetURL("/iframe.html"));
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
 
@@ -1941,6 +1896,7 @@
 // subframe.
 IN_PROC_BROWSER_TEST_P(ContextMenuBrowserTest,
                        MenuContentsVerification_Subframe) {
+  ASSERT_TRUE(embedded_test_server()->Start());
   GURL url(embedded_test_server()->GetURL("/iframe.html"));
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
   content::WebContents* tab =
@@ -1999,6 +1955,7 @@
 // with height more than visual viewport bounds.
 IN_PROC_BROWSER_TEST_P(ContextMenuBrowserTest,
                        NonLocatedContextMenuOnLargeImageElement) {
+  ASSERT_TRUE(embedded_test_server()->Start());
   GURL image_url(
       "data:text/html,<html><img src=\"http://example.test/cat.jpg\" "
       "width=\"200\" height=\"10000\" tabindex=\"-1\" /></html>");
@@ -2083,6 +2040,7 @@
   // Register observer.
   ContextMenuWaiter menu_observer;
 
+  ASSERT_TRUE(embedded_test_server()->Start());
   GURL url(
       embedded_test_server()->GetURL("/download-anchor-cross-origin.html"));
 
@@ -2315,6 +2273,7 @@
     }
   }
 
+  ASSERT_TRUE(embedded_test_server()->Start());
   GURL url(embedded_test_server()->GetURL("/"));
 
   std::unique_ptr<TestRenderViewContextMenu> menu(
@@ -2360,6 +2319,7 @@
       profile, chrome::startup::IsProcessStartup::kNo,
       chrome::startup::IsFirstRun::kNo, false);
 
+  ASSERT_TRUE(embedded_test_server()->Start());
 
   GURL echoheader(embedded_test_server()->GetURL("/echoheader?Referer"));
   // Go to a |page| with a link to echoheader URL.
@@ -3366,6 +3326,7 @@
 // Ensure that the context menu can tolerate changes to session history that
 // happen between menu initialization and command execution.
 IN_PROC_BROWSER_TEST_P(ContextMenuBrowserTest, BackAfterBackEntryRemoved) {
+  ASSERT_TRUE(embedded_test_server()->Start());
 
   WebContents* web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
@@ -3453,8 +3414,7 @@
                                          nullptr);
 }
 
-IN_PROC_BROWSER_TEST_P(ContextMenuBrowserNoEmbeddedServerStartTest,
-                       SubframeNewTabInitiator) {
+IN_PROC_BROWSER_TEST_P(ContextMenuBrowserTest, SubframeNewTabInitiator) {
   // If a frame on example.com opens a subframe with a different opaque origin,
   // the subframe origin should be passed through to a context menu on that
   // initiator, so:
diff --git a/chrome/browser/resources/actor_internals/actor_internals.html b/chrome/browser/resources/actor_internals/actor_internals.html
index 87c211f3f..e4d66f6 100644
--- a/chrome/browser/resources/actor_internals/actor_internals.html
+++ b/chrome/browser/resources/actor_internals/actor_internals.html
@@ -24,5 +24,14 @@
       <th>Timestamp</th>
     </thead>
   </table>
+  <template id="actor-events-row">
+    <tr data-timestamp>
+      <td></td>
+      <td></td>
+      <td></td>
+      <td></td>
+      <td></td>
+    </tr>
+  </template>
 </body>
 </html>
\ No newline at end of file
diff --git a/chrome/browser/resources/actor_internals/actor_internals.ts b/chrome/browser/resources/actor_internals/actor_internals.ts
index 1f85e6d..6047ba1e 100644
--- a/chrome/browser/resources/actor_internals/actor_internals.ts
+++ b/chrome/browser/resources/actor_internals/actor_internals.ts
@@ -29,24 +29,34 @@
 window.onload = function() {
   const proxy = BrowserProxy.getInstance();
   proxy.callbackRouter.journalEntryAdded.addListener((entry: JournalEntry) => {
-    const table = getRequiredElement('actor-events-table');
-    const tr = document.createElement('tr');
-    let td = document.createElement('td');
-    td.textContent = entry.url;
-    tr.appendChild(td);
-    td = document.createElement('td');
-    td.textContent = entry.event;
-    tr.appendChild(td);
-    td = document.createElement('td');
-    td.textContent = entry.type;
-    tr.appendChild(td);
-    td = document.createElement('td');
-    td.textContent = entry.details;
-    tr.appendChild(td);
-    td = document.createElement('td');
-    td.textContent = new Date(entry.timestamp).toUTCString();
-    tr.appendChild(td);
-    table.appendChild(tr);
+    const table = getRequiredElement<HTMLTableElement>('actor-events-table');
+
+    const template =
+        getRequiredElement<HTMLTemplateElement>('actor-events-row');
+    // Clone the new row and insert it into the table
+    const clone = (template.content.cloneNode(true) as DocumentFragment);
+    const tr = clone.children[0] as HTMLElement;
+    tr.dataset['timestamp'] = entry.timestamp.getTime().toString();
+    const td = clone.querySelectorAll('td');
+    td[0]!.textContent = entry.url;
+    td[1]!.textContent = entry.event;
+    td[2]!.textContent = entry.type;
+    td[3]!.textContent = entry.details;
+    td[4]!.textContent = new Date(entry.timestamp).toUTCString();
+
+    const rows = table.rows;
+    for (let i = rows.length - 1; i > 0; i--) {
+      const timestamp = Number(rows[i]!.dataset['timestamp']);
+      if (entry.timestamp.getTime() >= timestamp) {
+        if (i === rows.length - 1) {
+          break;
+        }
+        table.insertBefore(clone, rows[i + 1]!);
+        return;
+      }
+    }
+
+    table.appendChild(clone);
   });
 
   getRequiredElement('start-logging').onclick = startLogging;
diff --git a/chrome/browser/resources/ash/settings/os_about_page/about_page_browser_proxy.ts b/chrome/browser/resources/ash/settings/os_about_page/about_page_browser_proxy.ts
index 8720397..f6d8e65 100644
--- a/chrome/browser/resources/ash/settings/os_about_page/about_page_browser_proxy.ts
+++ b/chrome/browser/resources/ash/settings/os_about_page/about_page_browser_proxy.ts
@@ -200,6 +200,8 @@
    */
   getChannelInfo(): Promise<ChannelInfo>;
 
+  canChangeFirmware(): Promise<boolean>;
+
   canChangeChannel(): Promise<boolean>;
 
   getVersionInfo(): Promise<VersionInfo>;
@@ -324,6 +326,10 @@
     return sendWithPromise('getChannelInfo');
   }
 
+  canChangeFirmware(): Promise<boolean> {
+    return sendWithPromise('canChangeFirmware');
+  }
+
   canChangeChannel(): Promise<boolean> {
     return sendWithPromise('canChangeChannel');
   }
diff --git a/chrome/browser/resources/ash/settings/os_about_page/os_about_page.html b/chrome/browser/resources/ash/settings/os_about_page/os_about_page.html
index eb75373..4055918 100644
--- a/chrome/browser/resources/ash/settings/os_about_page/os_about_page.html
+++ b/chrome/browser/resources/ash/settings/os_about_page/os_about_page.html
@@ -253,6 +253,7 @@
             external
             deep-link-focus-id$="[[Setting.kDiagnostics]]">
         </cr-link-row>
+        <template is="dom-if" if="[[canChangeFirmware_]]">
         <cr-link-row class="hr" id="firmwareUpdates"
             start-icon="os-settings:about-firmware-updates"
             on-click="onFirmwareUpdatesClick_"
@@ -272,6 +273,32 @@
                 firmwareUpdateCount_)]]">
           </div>
         </cr-link-row>
+        </template>
+        <template is="dom-if" if="[[!canChangeFirmware_]]">
+        <cr-link-row class="hr" id="firmwareUpdates"
+            start-icon="os-settings:about-firmware-updates"
+            label="$i18n{aboutFirmwareUpdates}"
+            sub-label="[[getFirmwareSublabel_(firmwareUpdateCount_)]]"
+            external
+            using-slotted-label
+            disabled=true
+            deep-link-focus-id$="[[Setting.kFirmwareUpdates]]">
+          <iron-icon id="firmwareUpdateBadge"
+              icon$="[[getFirmwareUpdatesIcon_(firmwareUpdateCount_)]]"
+              hidden$="[[!shouldShowFirmwareUpdatesBadge_(
+                firmwareUpdateCount_)]]">
+          </iron-icon>
+          <div id="firmwareUpdateBadgeSeparator"
+              class="separator separator-firmware-updates-badge"
+              hidden$="[[!shouldShowFirmwareUpdatesBadge_(
+                firmwareUpdateCount_)]]">
+          </div>
+          <cr-policy-indicator
+            id="changeChannelPolicyIndicator"
+            indicator-type="[[getFirmwareDisabledIndicatorType_()]]">
+           </cr-policy-indicator>
+        </cr-link-row>
+        </template>
         <cr-link-row class="hr" id="detailedBuildInfoTrigger"
             start-icon="os-settings:about-additional-details"
             on-click="onDetailedBuildInfoClick_"
diff --git a/chrome/browser/resources/ash/settings/os_about_page/os_about_page.ts b/chrome/browser/resources/ash/settings/os_about_page/os_about_page.ts
index bbc5370b..519685a 100644
--- a/chrome/browser/resources/ash/settings/os_about_page/os_about_page.ts
+++ b/chrome/browser/resources/ash/settings/os_about_page/os_about_page.ts
@@ -23,10 +23,12 @@
 import './eol_offer_section.js';
 import './update_warning_dialog.js';
 import '../crostini_page/crostini_settings_card.js';
+import 'chrome://resources/ash/common/cr_elements/policy/cr_policy_indicator.js';
 
 import {LifetimeBrowserProxyImpl} from '/shared/settings/lifetime_browser_proxy.js';
 import type {CrButtonElement} from 'chrome://resources/ash/common/cr_elements/cr_button/cr_button.js';
 import {I18nMixin} from 'chrome://resources/ash/common/cr_elements/i18n_mixin.js';
+import {CrPolicyIndicatorType} from 'chrome://resources/ash/common/cr_elements/policy/cr_policy_indicator_mixin.js';
 import {WebUiListenerMixin} from 'chrome://resources/ash/common/cr_elements/web_ui_listener_mixin.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
@@ -92,6 +94,11 @@
         value: false,
       },
 
+      /**
+       * Whether users may initiate firmware updates
+       */
+      canChangeFirmware_: Boolean,
+
       currentUpdateStatusEvent_: {
         type: Object,
         value: {
@@ -288,6 +295,7 @@
   ]);
 
   private isDarkModeActive_: boolean;
+  private canChangeFirmware_: boolean;
   private currentUpdateStatusEvent_: UpdateStatusChangedEvent;
   private isManaged_: boolean;
   private deviceManager_: string;
@@ -415,6 +423,12 @@
         this.onExtendedUpdatesSettingChanged_.bind(this));
   }
 
+  private updateFirmwareInfo_(): void {
+    this.aboutBrowserProxy_.canChangeFirmware().then(canChangeFirmware => {
+      this.canChangeFirmware_ = canChangeFirmware;
+    });
+  }
+
   private onUpdateStatusChanged_(event: UpdateStatusChangedEvent): void {
     if (event.status === UpdateStatus.CHECKING) {
       this.hasCheckedForUpdates_ = true;
@@ -489,6 +503,10 @@
         this.currentUpdateStatusEvent_.status !== UpdateStatus.DISABLED;
   }
 
+  private getFirmwareDisabledIndicatorType_(): string {
+    return CrPolicyIndicatorType.DEVICE_POLICY;
+  }
+
   /**
    * Hide the button container if all buttons are hidden, otherwise the
    * container displays an unwanted border (see separator class).
@@ -755,6 +773,7 @@
   private onTpmFirmwareUpdateStatusChanged_(
       event: TpmFirmwareUpdateStatusChangedEvent): void {
     this.showTPMFirmwareUpdateLineItem_ = event.updateAvailable;
+    this.updateFirmwareInfo_();
   }
 
   private onTpmFirmwareUpdateClick_(): void {
@@ -787,9 +806,13 @@
   // </if>
 
   private getFirmwareSublabel_(): string|null {
-    return this.firmwareUpdateCount_ > 0 ?
-        this.i18n('aboutFirmwareUpdateAvailableDescription') :
-        this.i18n('aboutFirmwareUpToDateDescription');
+    if (!this.canChangeFirmware_) {
+      return this.i18n('aboutFirmwareUpdatesDisabledDescription');
+    }
+    if (this.firmwareUpdateCount_ > 0) {
+      return this.i18n('aboutFirmwareUpdateAvailableDescription');
+    }
+    return this.i18n('aboutFirmwareUpToDateDescription');
   }
 
   private computeShowExtendedUpdatesOption_(): boolean {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv2/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/mv2/BUILD.gn
index 7f5299cc..333f0208 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv2/BUILD.gn
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv2/BUILD.gn
@@ -20,7 +20,6 @@
     ":copied_files",
     ":minify_js_background",
     ":minify_js_panel",
-    "//third_party/chromevox:chromevox_third_party_resources",
     "//third_party/liblouis",
   ]
 }
@@ -40,6 +39,9 @@
 # Messageformat third_party directory.
 messageformat_dir = "//third_party/node/node_modules/messageformat/lib/"
 
+# Location of sre dependency.
+sre_browser_file = "//third_party/chromevox/third_party/sre/sre_browser.js"
+
 # List of all modules that are included in one or more of the production
 # chromevox scripts.
 #
@@ -188,6 +190,7 @@
   extra_deps = [
     #copied files
     ":stage_ts_build",
+    ":stage_ts_build_sre",
   ]
 
   definitions = [
@@ -217,6 +220,11 @@
     "/common/*|" + rebase_path("$common_tsc_dir/*", target_gen_dir),
     "/chromevox/mv2/third_party/messageformat/messageformat.rollup.js|" +
         rebase_path("$messageformat_dir/messageformat.d.ts", target_gen_dir),
+
+    # Point the TS compiler to the copied version of sre_browser.js.
+    "/chromevox/mv2/third_party/sre/sre_browser.js|" +
+        rebase_path("$ts_build_staging_dir/third_party/sre/sre_browser.js",
+                    target_gen_dir),
   ]
 
   in_files = ts_modules + js_modules
@@ -238,6 +246,9 @@
   js_module_in_files = [ "es6_loader.js" ]
   external_paths =
       [ "/common/*|" + rebase_path("$common_tsc_dir/*", root_build_dir) ]
+
+  excludes = [ "/chromevox/mv2/third_party/sre/sre_browser.js" ]
+
   out_folder = "$target_gen_dir/bundle/background"
 
   deps = [
@@ -293,6 +304,7 @@
   mode = "copy"
   dest_dir = chromevox_out_dir
   deps = [
+    ":copy_sre",
     ":minify_js_messageformat",
     ":ts_build",
     "../../common:copied_files",
@@ -543,3 +555,16 @@
   in_files = [ "messageformat.rollup.js" ]
   out_folder = "$chromevox_out_dir/third_party/messageformat/"
 }
+
+# Copy sre_browser.js to the staging directory so that it can be used at build
+# time.
+copy("stage_ts_build_sre") {
+  sources = [ "$sre_browser_file" ]
+  outputs = [ "$ts_build_staging_dir/third_party/sre/sre_browser.js" ]
+}
+
+# Copy sre_browser.js to chromevox_out_dir so that it can be used at runtime.
+copy("copy_sre") {
+  sources = [ "$sre_browser_file" ]
+  outputs = [ "$chromevox_out_dir/third_party/sre/sre_browser.js" ]
+}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv2/background/background.html b/chrome/browser/resources/chromeos/accessibility/chromevox/mv2/background/background.html
index 884a7411..5af8be3 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv2/background/background.html
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv2/background/background.html
@@ -9,7 +9,3 @@
   global), but not vice versa.
 -->
 <script type="module" src="es6_loader.rollup.js"></script>
-
-<!-- Third party -->
-<!-- Speech Rule Engine -->
-<script src="../../third_party/sre/sre_browser.js"></script>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv2/background/math_handler.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv2/background/math_handler.ts
index b7f9931..2ae024f 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv2/background/math_handler.ts
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv2/background/math_handler.ts
@@ -5,6 +5,7 @@
 /**
  * @fileoverview Handles math output and exploration.
  */
+import {SRE} from '/chromevox/mv2/third_party/sre/sre_browser.js';
 import {AutomationPredicate} from '/common/automation_predicate.js';
 import type {CursorRange} from '/common/cursors/range.js';
 import {TestImportManager} from '/common/testing/test_import_manager.js';
@@ -17,9 +18,6 @@
 
 import AutomationNode = chrome.automation.AutomationNode;
 
-// Speech Rule Engine is included as a global variable in background.html.
-declare let SRE: any;
-
 /**
  * Handles specialized code to navigate, announce, and interact with math
  * content (encoded in MathML).
diff --git a/chrome/browser/resources/new_tab_page/app.ts b/chrome/browser/resources/new_tab_page/app.ts
index 8431b42d9..9bbc66c 100644
--- a/chrome/browser/resources/new_tab_page/app.ts
+++ b/chrome/browser/resources/new_tab_page/app.ts
@@ -35,7 +35,7 @@
 import {CustomizeDialogPage} from './customize_dialog_types.js';
 import type {IframeElement} from './iframe.js';
 import type {LogoElement} from './logo.js';
-import {recordDuration, recordLoadDuration} from './metrics_utils.js';
+import {recordBoolean, recordDuration, recordEnumeration, recordLoadDuration, recordSparseValueWithPersistentHash, recordValue} from './metrics_utils.js';
 import {ParentTrustedDocumentProxy} from './modules/microsoft_auth_frame_connector.js';
 import type {PageCallbackRouter, PageHandlerRemote, Theme} from './new_tab_page.mojom-webui.js';
 import {IphFeature, NtpBackgroundImageSource} from './new_tab_page.mojom-webui.js';
@@ -113,12 +113,11 @@
     window.matchMedia('(min-width: 900px)');
 
 function recordClick(element: NtpElement) {
-  chrome.metricsPrivate.recordEnumerationValue(
-      'NewTabPage.Click', element, NtpElement.MAX_VALUE + 1);
+  recordEnumeration('NewTabPage.Click', element, NtpElement.MAX_VALUE + 1);
 }
 
 function recordCustomizeChromeOpen(element: NtpCustomizeChromeEntryPoint) {
-  chrome.metricsPrivate.recordEnumerationValue(
+  recordEnumeration(
       'NewTabPage.CustomizeChromeOpened', element,
       NtpCustomizeChromeEntryPoint.MAX_VALUE + 1);
 }
@@ -356,7 +355,7 @@
      */
     this.backgroundImageLoadStartEpoch_ = performance.timeOrigin;
 
-    chrome.metricsPrivate.recordValue(
+    recordValue(
         {
           metricName: 'NewTabPage.Height',
           type: chrome.metricsPrivate.MetricTypeType.HISTOGRAM_LINEAR,
@@ -365,7 +364,7 @@
           buckets: 200,
         },
         Math.floor(window.innerHeight));
-    chrome.metricsPrivate.recordValue(
+    recordValue(
         {
           metricName: 'NewTabPage.Width',
           type: chrome.metricsPrivate.MetricTypeType.HISTOGRAM_LINEAR,
@@ -481,8 +480,7 @@
     }
     FocusOutlineManager.forDocument(document);
     if (this.composeButtonEnabled) {
-      chrome.metricsPrivate.recordBoolean(
-          'NewTabPage.ComposeEntrypoint.Shown', true);
+      recordBoolean('NewTabPage.ComposeEntrypoint.Shown', true);
       this.pageHandler_.incrementComposeButtonShownCount();
     }
   }
@@ -750,16 +748,16 @@
   }
 
   private onThemeLoaded_(theme: Theme) {
-    chrome.metricsPrivate.recordSparseValueWithPersistentHash(
+    recordSparseValueWithPersistentHash(
         'NewTabPage.Collections.IdOnLoad',
         theme.backgroundImageCollectionId ?? '');
 
     if (!theme.backgroundImage) {
-      chrome.metricsPrivate.recordEnumerationValue(
+      recordEnumeration(
           'NewTabPage.BackgroundImageSource', NtpBackgroundImageSource.kNoImage,
           NtpBackgroundImageSource.MAX_VALUE + 1);
     } else {
-      chrome.metricsPrivate.recordEnumerationValue(
+      recordEnumeration(
           'NewTabPage.BackgroundImageSource', theme.backgroundImage.imageSource,
           NtpBackgroundImageSource.MAX_VALUE + 1);
     }
diff --git a/chrome/browser/resources/new_tab_page/lens_upload_dialog.ts b/chrome/browser/resources/new_tab_page/lens_upload_dialog.ts
index bb2abaf..7784ffa 100644
--- a/chrome/browser/resources/new_tab_page/lens_upload_dialog.ts
+++ b/chrome/browser/resources/new_tab_page/lens_upload_dialog.ts
@@ -13,6 +13,7 @@
 import {LensErrorType, LensSubmitType} from './lens_form.js';
 import {getCss} from './lens_upload_dialog.css.js';
 import {getHtml} from './lens_upload_dialog.html.js';
+import {recordEnumeration} from './metrics_utils.js';
 import {WindowProxy} from './window_proxy.js';
 
 enum DialogState {
@@ -96,13 +97,13 @@
 }
 
 export function recordLensUploadDialogAction(action: LensUploadDialogAction) {
-  chrome.metricsPrivate.recordEnumerationValue(
+  recordEnumeration(
       'NewTabPage.Lens.UploadDialog.DialogAction', action,
       Object.keys(LensUploadDialogAction).length);
 }
 
 export function recordLensUploadDialogError(action: LensUploadDialogError) {
-  chrome.metricsPrivate.recordEnumerationValue(
+  recordEnumeration(
       'NewTabPage.Lens.UploadDialog.DialogError', action,
       Object.keys(LensUploadDialogError).length);
 }
diff --git a/chrome/browser/resources/new_tab_page/metrics_utils.ts b/chrome/browser/resources/new_tab_page/metrics_utils.ts
index 323b377..cc92b953 100644
--- a/chrome/browser/resources/new_tab_page/metrics_utils.ts
+++ b/chrome/browser/resources/new_tab_page/metrics_utils.ts
@@ -4,8 +4,14 @@
 
 import {loadTimeData} from './i18n_setup.js';
 
-/** Records |durationMs| in the |metricName| histogram. */
+/** Records `durationMs` in the `metricName` histogram. */
 export function recordDuration(metricName: string, durationMs: number) {
+  // In rare cases, chrome.metricsPrivate is not available.
+  // TODO(crbug.com/40162029): Remove this check once the bug is fixed.
+  if (!chrome.metricsPrivate) {
+    return;
+  }
+
   chrome.metricsPrivate.recordValue(
       {
         metricName,
@@ -18,8 +24,8 @@
 }
 
 /**
- * Records the duration between navigation start and |msSinceEpoch| in the
- * |metricName| histogram.
+ * Records the duration between navigation start and `msSinceEpoch` in the
+ * `metricName` histogram.
  */
 export function recordLoadDuration(metricName: string, msSinceEpoch: number) {
   recordDuration(
@@ -27,10 +33,16 @@
 }
 
 /**
- * Records |value| (expected to be between 0 and 10) into the ten-bucket
- * |metricName| histogram.
+ * Records `value` (expected to be between 0 and 10) into the ten-bucket
+ * `metricName` histogram.
  */
 export function recordPerdecage(metricName: string, value: number) {
+  // In rare cases, chrome.metricsPrivate is not available.
+  // TODO(crbug.com/40162029): Remove this check once the bug is fixed.
+  if (!chrome.metricsPrivate) {
+    return;
+  }
+
   chrome.metricsPrivate.recordValue(
       {
         metricName,
@@ -43,10 +55,16 @@
 }
 
 /**
- * Records that an event has happened rather than a value in the |metricName|
+ * Records that an event has happened rather than a value in the `metricName`
  * histogram.
  */
-export function recordOccurence(metricName: string) {
+export function recordOccurrence(metricName: string) {
+  // In rare cases, chrome.metricsPrivate is not available.
+  // TODO(crbug.com/40162029): Remove this check once the bug is fixed.
+  if (!chrome.metricsPrivate) {
+    return;
+  }
+
   chrome.metricsPrivate.recordValue(
       {
         metricName,
@@ -57,3 +75,56 @@
       },
       1);
 }
+
+export function recordEnumeration(
+    metricName: string, value: number, enumSize: number) {
+  // In rare cases, chrome.metricsPrivate is not available.
+  // TODO(crbug.com/40162029): Remove this check once the bug is fixed.
+  if (!chrome.metricsPrivate) {
+    return;
+  }
+
+  chrome.metricsPrivate.recordEnumerationValue(metricName, value, enumSize);
+}
+
+export function recordValue(
+    metric: chrome.metricsPrivate.MetricType, value: number) {
+  // In rare cases, chrome.metricsPrivate is not available.
+  // TODO(crbug.com/40162029): Remove this check once the bug is fixed.
+  if (!chrome.metricsPrivate) {
+    return;
+  }
+
+  chrome.metricsPrivate.recordValue(metric, value);
+}
+
+export function recordBoolean(metricName: string, value: boolean) {
+  // In rare cases, chrome.metricsPrivate is not available.
+  // TODO(crbug.com/40162029): Remove this check once the bug is fixed.
+  if (!chrome.metricsPrivate) {
+    return;
+  }
+
+  chrome.metricsPrivate.recordBoolean(metricName, value);
+}
+
+export function recordSparseValueWithPersistentHash(
+    metricName: string, value: string) {
+  // In rare cases, chrome.metricsPrivate is not available.
+  // TODO(crbug.com/40162029): Remove this check once the bug is fixed.
+  if (!chrome.metricsPrivate) {
+    return;
+  }
+
+  chrome.metricsPrivate.recordSparseValueWithPersistentHash(metricName, value);
+}
+
+export function recordSmallCount(metricName: string, value: number) {
+  // In rare cases, chrome.metricsPrivate is not available.
+  // TODO(crbug.com/40162029): Remove this check once the bug is fixed.
+  if (!chrome.metricsPrivate) {
+    return;
+  }
+
+  chrome.metricsPrivate.recordSmallCount(metricName, value);
+}
diff --git a/chrome/browser/resources/new_tab_page/middle_slot_promo.ts b/chrome/browser/resources/new_tab_page/middle_slot_promo.ts
index 8bf36212..5d7c5d2 100644
--- a/chrome/browser/resources/new_tab_page/middle_slot_promo.ts
+++ b/chrome/browser/resources/new_tab_page/middle_slot_promo.ts
@@ -15,6 +15,7 @@
 
 import {getCss} from './middle_slot_promo.css.js';
 import {getHtml} from './middle_slot_promo.html.js';
+import {recordEnumeration} from './metrics_utils.js';
 import type {PageHandlerRemote, Promo} from './new_tab_page.mojom-webui.js';
 import {NewTabPageProxy} from './new_tab_page_proxy.js';
 import {WindowProxy} from './window_proxy.js';
@@ -30,7 +31,7 @@
 }
 
 export function recordPromoDismissAction(action: PromoDismissAction) {
-  chrome.metricsPrivate.recordEnumerationValue(
+  recordEnumeration(
       'NewTabPage.Promos.DismissAction', action,
       Object.keys(PromoDismissAction).length);
 }
diff --git a/chrome/browser/resources/new_tab_page/modules/module_wrapper.ts b/chrome/browser/resources/new_tab_page/modules/module_wrapper.ts
index af31ccc..2a5c051 100644
--- a/chrome/browser/resources/new_tab_page/modules/module_wrapper.ts
+++ b/chrome/browser/resources/new_tab_page/modules/module_wrapper.ts
@@ -4,7 +4,7 @@
 
 import {CrLitElement, render} from 'chrome://resources/lit/v3_0/lit.rollup.js';
 
-import {recordLoadDuration, recordOccurence, recordPerdecage} from '../metrics_utils.js';
+import {recordLoadDuration, recordOccurrence, recordPerdecage, recordSparseValueWithPersistentHash} from '../metrics_utils.js';
 import {NewTabPageProxy} from '../new_tab_page_proxy.js';
 import {WindowProxy} from '../window_proxy.js';
 
@@ -91,8 +91,8 @@
       NewTabPageProxy.getInstance().handler.onModuleUsed(
           this.module.descriptor.id);
 
-      recordOccurence('NewTabPage.Modules.Usage');
-      recordOccurence(`NewTabPage.Modules.Usage.${this.module.descriptor.id}`);
+      recordOccurrence('NewTabPage.Modules.Usage');
+      recordOccurrence(`NewTabPage.Modules.Usage.${this.module.descriptor.id}`);
     }, {once: true});
 
     // Dispatch at most one interaction event for a module's `More Actions` menu
@@ -105,13 +105,13 @@
 
     // Log module's id when module's info button is clicked.
     this.module.element.addEventListener('info-button-click', () => {
-      chrome.metricsPrivate.recordSparseValueWithPersistentHash(
+      recordSparseValueWithPersistentHash(
           'NewTabPage.Modules.InfoButtonClicked', this.module.descriptor.id);
     }, {once: true});
 
     // Track whether the user hovered on the module.
     this.module.element.addEventListener('mouseover', () => {
-      chrome.metricsPrivate.recordSparseValueWithPersistentHash(
+      recordSparseValueWithPersistentHash(
           'NewTabPage.Modules.Hover', this.module.descriptor.id);
     }, {
       capture: true,  // So that modules cannot swallow event.
diff --git a/chrome/browser/resources/new_tab_page/modules/v2/authentication/microsoft_auth_module.ts b/chrome/browser/resources/new_tab_page/modules/v2/authentication/microsoft_auth_module.ts
index 795e35011..5742dad 100644
--- a/chrome/browser/resources/new_tab_page/modules/v2/authentication/microsoft_auth_module.ts
+++ b/chrome/browser/resources/new_tab_page/modules/v2/authentication/microsoft_auth_module.ts
@@ -7,6 +7,7 @@
 import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js';
 
 import {I18nMixinLit, loadTimeData} from '../../../i18n_setup.js';
+import {recordEnumeration} from '../../../metrics_utils.js';
 import type {MicrosoftAuthPageHandlerRemote} from '../../../microsoft_auth.mojom-webui.js';
 import {AuthType} from '../../../ntp_microsoft_auth_shared_ui.mojom-webui.js';
 import {ParentTrustedDocumentProxy} from '../../microsoft_auth_frame_connector.js';
@@ -108,7 +109,7 @@
     const proxyInstance = ParentTrustedDocumentProxy.getInstance();
     if (proxyInstance) {
       proxyInstance.getChildDocument().acquireTokenPopup();
-      chrome.metricsPrivate.recordEnumerationValue(
+      recordEnumeration(
           `NewTabPage.MicrosoftAuth.AuthStarted`, AuthType.kPopup,
           AuthType.MAX_VALUE + 1);
     }
diff --git a/chrome/browser/resources/new_tab_page/modules/v2/calendar/calendar_event.ts b/chrome/browser/resources/new_tab_page/modules/v2/calendar/calendar_event.ts
index 167c941e..4f856be 100644
--- a/chrome/browser/resources/new_tab_page/modules/v2/calendar/calendar_event.ts
+++ b/chrome/browser/resources/new_tab_page/modules/v2/calendar/calendar_event.ts
@@ -9,6 +9,7 @@
 
 import type {CalendarEvent} from '../../../calendar_data.mojom-webui.js';
 import {I18nMixinLit} from '../../../i18n_setup.js';
+import {recordSmallCount} from '../../../metrics_utils.js';
 import {WindowProxy} from '../../../window_proxy.js';
 
 import {getCss} from './calendar_event.css.js';
@@ -180,7 +181,7 @@
       action = CalendarAction.DOUBLE_BOOKED_EVENT_HEADER_CLICKED;
     }
     recordCalendarAction(action, this.moduleName);
-    chrome.metricsPrivate.recordSmallCount(
+    recordSmallCount(
         `NewTabPage.${this.moduleName}.EventClickIndex`, this.index);
   }
 
diff --git a/chrome/browser/resources/new_tab_page/modules/v2/calendar/common.ts b/chrome/browser/resources/new_tab_page/modules/v2/calendar/common.ts
index c1b49921..39f76df 100644
--- a/chrome/browser/resources/new_tab_page/modules/v2/calendar/common.ts
+++ b/chrome/browser/resources/new_tab_page/modules/v2/calendar/common.ts
@@ -4,6 +4,8 @@
 
 import type {Time} from 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
 
+import {recordEnumeration} from '../../../metrics_utils.js';
+
 // Microseconds between windows and unix epoch.
 const kWindowsToUnixEpochOffset: bigint = 11644473600000000n;
 
@@ -27,7 +29,7 @@
 
 export function recordCalendarAction(
     action: CalendarAction, moduleName: string) {
-  chrome.metricsPrivate.recordEnumerationValue(
+  recordEnumeration(
       `NewTabPage.${moduleName}.UserAction`, action,
       CalendarAction.MAX_VALUE + 1);
 }
diff --git a/chrome/browser/resources/new_tab_page/modules/v2/file_suggestion/file_suggestion.ts b/chrome/browser/resources/new_tab_page/modules/v2/file_suggestion/file_suggestion.ts
index 1947db5..0ba7b10 100644
--- a/chrome/browser/resources/new_tab_page/modules/v2/file_suggestion/file_suggestion.ts
+++ b/chrome/browser/resources/new_tab_page/modules/v2/file_suggestion/file_suggestion.ts
@@ -6,6 +6,7 @@
 
 import type {File} from '../../../file_suggestion.mojom-webui.js';
 import {RecommendationType} from '../../../file_suggestion.mojom-webui.js';
+import {recordEnumeration, recordSmallCount} from '../../../metrics_utils.js';
 
 import {getCss} from './file_suggestion.css.js';
 import {getHtml} from './file_suggestion.html.js';
@@ -48,11 +49,11 @@
     this.dispatchEvent(clickFileEvent);
     const currentTarget = e.currentTarget as HTMLElement;
     const index = Number(currentTarget.dataset['index']);
-    chrome.metricsPrivate.recordSmallCount(
+    recordSmallCount(
         `NewTabPage.${this.moduleName}.FileClick`, index);
     const recommendationType = this.files[index].recommendationType;
     if (recommendationType != null) {
-      chrome.metricsPrivate.recordEnumerationValue(
+      recordEnumeration(
           `NewTabPage.${this.moduleName}.RecommendationTypeClick`,
           recommendationType, RecommendationType.MAX_VALUE + 1);
     }
diff --git a/chrome/browser/resources/new_tab_page/modules/v2/file_suggestion/microsoft_files_module.ts b/chrome/browser/resources/new_tab_page/modules/v2/file_suggestion/microsoft_files_module.ts
index 3f0fb0d..7455976 100644
--- a/chrome/browser/resources/new_tab_page/modules/v2/file_suggestion/microsoft_files_module.ts
+++ b/chrome/browser/resources/new_tab_page/modules/v2/file_suggestion/microsoft_files_module.ts
@@ -11,6 +11,7 @@
 import type {File} from '../../../file_suggestion.mojom-webui.js';
 import {RecommendationType} from '../../../file_suggestion.mojom-webui.js';
 import {I18nMixinLit, loadTimeData} from '../../../i18n_setup.js';
+import {recordSmallCount} from '../../../metrics_utils.js';
 import type {MicrosoftFilesPageHandlerRemote} from '../../../microsoft_files.mojom-webui.js';
 import {ParentTrustedDocumentProxy} from '../../microsoft_auth_frame_connector.js';
 import {ModuleDescriptor} from '../../module_descriptor.js';
@@ -148,13 +149,13 @@
           files[i].recommendationType!,
           numOfFiles.get(files[i].recommendationType!)! + 1);
     }
-    chrome.metricsPrivate.recordSmallCount(
+    recordSmallCount(
         'NewTabPage.MicrosoftFiles.ShownFiles.Used',
         numOfFiles.get(RecommendationType.kUsed)!);
-    chrome.metricsPrivate.recordSmallCount(
+    recordSmallCount(
         'NewTabPage.MicrosoftFiles.ShownFiles.Shared',
         numOfFiles.get(RecommendationType.kShared)!);
-    chrome.metricsPrivate.recordSmallCount(
+    recordSmallCount(
         'NewTabPage.MicrosoftFiles.ShownFiles.Trending',
         numOfFiles.get(RecommendationType.kTrending)!);
   }
diff --git a/chrome/browser/resources/new_tab_page/modules/v2/modules.ts b/chrome/browser/resources/new_tab_page/modules/v2/modules.ts
index 63f693c..9abe380 100644
--- a/chrome/browser/resources/new_tab_page/modules/v2/modules.ts
+++ b/chrome/browser/resources/new_tab_page/modules/v2/modules.ts
@@ -12,7 +12,7 @@
 import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js';
 
 import {loadTimeData} from '../../i18n_setup.js';
-import {recordOccurence as recordOccurrence} from '../../metrics_utils.js';
+import {recordBoolean, recordOccurrence, recordSmallCount, recordSparseValueWithPersistentHash} from '../../metrics_utils.js';
 import type {ModuleIdName, PageCallbackRouter, PageHandlerRemote} from '../../new_tab_page.mojom-webui.js';
 import {NewTabPageProxy} from '../../new_tab_page_proxy.js';
 import {WindowProxy} from '../../window_proxy.js';
@@ -214,7 +214,6 @@
     this.callbackRouter_.removeListener(this.setModulesLoadableListenerId_);
 
     this.eventTracker_.removeAll();
-
   }
 
   override firstUpdated() {
@@ -281,17 +280,16 @@
 
   private recordInitialLoadMetrics_(
       modules: Module[], modulesIdNames: ModuleIdName[]) {
-    chrome.metricsPrivate.recordSmallCount(
-        'NewTabPage.Modules.LoadedModulesCount', modules.length);
+    recordSmallCount('NewTabPage.Modules.LoadedModulesCount', modules.length);
     modulesIdNames.forEach(({id}) => {
-      chrome.metricsPrivate.recordBoolean(
+      recordBoolean(
           `NewTabPage.Modules.EnabledOnNTPLoad.${id}`,
           !this.disabledModules_.all &&
               !this.disabledModules_.ids.includes(id));
     });
-    chrome.metricsPrivate.recordSmallCount(
+    recordSmallCount(
         'NewTabPage.Modules.InstanceCount', this.moduleInstances_.length);
-    chrome.metricsPrivate.recordBoolean(
+    recordBoolean(
         'NewTabPage.Modules.VisibleOnNTPLoad', !this.disabledModules_.all);
     this.recordModuleLoadedWithModules_(/*onNtpLoad=*/ true);
   }
@@ -306,7 +304,7 @@
     for (const moduleDescriptorId of moduleDescriptorIds) {
       moduleDescriptorIds.forEach(id => {
         if (id !== moduleDescriptorId) {
-          chrome.metricsPrivate.recordSparseValueWithPersistentHash(
+          recordSparseValueWithPersistentHash(
               `${histogramBase}.${moduleDescriptorId}`, id);
         }
       });
@@ -373,7 +371,7 @@
       }
 
       this.moduleInstances_ = newModuleInstances;
-      chrome.metricsPrivate.recordSmallCount(
+      recordSmallCount(
           'NewTabPage.Modules.ReloadedModulesCount',
           this.moduleInstances_.length);
       this.recordModuleLoadedWithModules_(/*onNtpLoad=*/ false);
@@ -440,18 +438,16 @@
           restoreCallback();
         }
         this.pageHandler_.setModuleDisabled(id, false);
-        chrome.metricsPrivate.recordSparseValueWithPersistentHash(
-            'NewTabPage.Modules.Enabled', id);
-        chrome.metricsPrivate.recordSparseValueWithPersistentHash(
+        recordSparseValueWithPersistentHash('NewTabPage.Modules.Enabled', id);
+        recordSparseValueWithPersistentHash(
             'NewTabPage.Modules.Enabled.Toast', id);
       },
     };
 
     this.pageHandler_.setModuleDisabled(id, true);
     this.$.undoToast.show();
-    chrome.metricsPrivate.recordSparseValueWithPersistentHash(
-        METRIC_NAME_MODULE_DISABLED, id);
-    chrome.metricsPrivate.recordSparseValueWithPersistentHash(
+    recordSparseValueWithPersistentHash(METRIC_NAME_MODULE_DISABLED, id);
+    recordSparseValueWithPersistentHash(
         `${METRIC_NAME_MODULE_DISABLED}.ModuleRequest`, id);
   }
 
diff --git a/chrome/browser/resources/new_tab_page/modules/v2/most_relevant_tab_resumption/module.ts b/chrome/browser/resources/new_tab_page/modules/v2/most_relevant_tab_resumption/module.ts
index c79c969..dc25e4e 100644
--- a/chrome/browser/resources/new_tab_page/modules/v2/most_relevant_tab_resumption/module.ts
+++ b/chrome/browser/resources/new_tab_page/modules/v2/most_relevant_tab_resumption/module.ts
@@ -11,7 +11,7 @@
 import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js';
 
 import {I18nMixinLit, loadTimeData} from '../../../i18n_setup.js';
-import {recordOccurence as recordOccurrence} from '../../../metrics_utils.js';
+import {recordEnumeration, recordOccurrence, recordSmallCount, recordValue} from '../../../metrics_utils.js';
 import {ScoredURLUserAction} from '../../../most_relevant_tab_resumption.mojom-webui.js';
 import type {URLVisit} from '../../../url_visit_types.mojom-webui.js';
 import {FormFactor, VisitSource} from '../../../url_visit_types.mojom-webui.js';
@@ -146,13 +146,12 @@
     const urlVisit = this.urlVisits[index];
     assert(urlVisit);
 
-    chrome.metricsPrivate.recordSmallCount(
-        'NewTabPage.TabResumption.VisitDismissIndex', index);
+    recordSmallCount('NewTabPage.TabResumption.VisitDismissIndex', index);
     MostRelevantTabResumptionProxyImpl.getInstance().handler.dismissURLVisit(
         urlVisit);
 
     this.urlVisits =
-      [...this.urlVisits.slice(0, index), ...this.urlVisits.slice(index + 1)];
+        [...this.urlVisits.slice(0, index), ...this.urlVisits.slice(index + 1)];
     assert(this.urlVisits.length >= 0);
 
     const eventName = this.urlVisits.length > 0 ? 'dismiss-module-element' :
@@ -160,8 +159,7 @@
     this.fire(eventName, {
       message: loadTimeData.getString('modulesTabResumptionSingleDismiss'),
       restoreCallback: () => {
-        chrome.metricsPrivate.recordSmallCount(
-            'NewTabPage.TabResumption.VisitRestoreIndex', index);
+        recordSmallCount('NewTabPage.TabResumption.VisitRestoreIndex', index);
         this.urlVisits = [
           ...this.urlVisits.slice(0, index),
           urlVisit,
@@ -180,14 +178,13 @@
     const urlVisit = this.urlVisits[index];
     assert(urlVisit);
 
-    chrome.metricsPrivate.recordSmallCount(
-        'NewTabPage.TabResumption.ClickIndex', index);
-    chrome.metricsPrivate.recordEnumerationValue(
+    recordSmallCount('NewTabPage.TabResumption.ClickIndex', index);
+    recordEnumeration(
         'NewTabPage.TabResumption.Visit.ClickSource', urlVisit.source,
         VisitSource.MAX_VALUE);
 
     // Calculate the number of milliseconds in the difference. Max is 4 days.
-    chrome.metricsPrivate.recordValue(
+    recordValue(
         {
           metricName: 'NewTabPage.TabResumption.TimeElapsedSinceLastVisit',
           type: chrome.metricsPrivate.MetricTypeType.HISTOGRAM_LOG,
diff --git a/chrome/browser/resources/new_tab_page/new_tab_page.ts b/chrome/browser/resources/new_tab_page/new_tab_page.ts
index c40572f1..05301394f 100644
--- a/chrome/browser/resources/new_tab_page/new_tab_page.ts
+++ b/chrome/browser/resources/new_tab_page/new_tab_page.ts
@@ -27,7 +27,7 @@
 export {IframeElement} from './iframe.js';
 export {ProcessedFile, processFile} from './image_processor.js';
 export {LogoElement} from './logo.js';
-export {recordDuration, recordLoadDuration, recordOccurence, recordPerdecage} from './metrics_utils.js';
+export {recordBoolean, recordDuration, recordEnumeration, recordLoadDuration, recordOccurrence, recordPerdecage, recordSmallCount, recordSparseValueWithPersistentHash, recordValue} from './metrics_utils.js';
 export {NewTabPageProxy} from './new_tab_page_proxy.js';
 export {checkTransparency, isBMP, isPNG, isWebP} from './transparency.js';
 export {$$} from './utils.js';
diff --git a/chrome/browser/resources/new_tab_page/voice_search_overlay.ts b/chrome/browser/resources/new_tab_page/voice_search_overlay.ts
index 3bab864..849d498c 100644
--- a/chrome/browser/resources/new_tab_page/voice_search_overlay.ts
+++ b/chrome/browser/resources/new_tab_page/voice_search_overlay.ts
@@ -8,6 +8,7 @@
 import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js';
 
 import {loadTimeData} from './i18n_setup.js';
+import {recordEnumeration} from './metrics_utils.js';
 import type {PageHandlerRemote} from './new_tab_page.mojom-webui.js';
 import {NewTabPageProxy} from './new_tab_page_proxy.js';
 import {getCss} from './voice_search_overlay.css.js';
@@ -113,7 +114,7 @@
 }
 
 export function recordVoiceAction(action: Action) {
-  chrome.metricsPrivate.recordEnumerationValue(
+  recordEnumeration(
       'NewTabPage.VoiceActions', action, Object.keys(Action).length);
 }
 
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/other_google_data_dialog.html b/chrome/browser/resources/settings/clear_browsing_data_dialog/other_google_data_dialog.html
index 6abaa1e..0b59254d 100644
--- a/chrome/browser/resources/settings/clear_browsing_data_dialog/other_google_data_dialog.html
+++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/other_google_data_dialog.html
@@ -17,14 +17,12 @@
     font-weight: 500;
   }
 
-  .link-row {
+  .link-rows-block > * {
     background-color: var(--dbd-container-color);
     padding: 4px 16px;
   }
 
-  /* TODO(crbug.com/397187800): Fix broken border logic due to conditional
-    visibility of the .link-row. */
-  .link-row:first-child {
+  .first-link-row {
     border-bottom-left-radius: var(--dbd-container-stacked-border-radius);
     border-bottom-right-radius: var(--dbd-container-stacked-border-radius);
     border-top-left-radius: var(--dbd-container-border-radius);
@@ -32,7 +30,7 @@
     margin-bottom: 2px;
   }
 
-  .link-row:last-child {
+  .last-link-row {
     border-bottom-left-radius: var(--dbd-container-border-radius);
     border-bottom-right-radius: var(--dbd-container-border-radius);
     border-top-left-radius: var(--dbd-container-stacked-border-radius);
@@ -40,12 +38,12 @@
     margin-bottom: 0;
   }
 
-  .link-row:not(:first-child):not(:last-child) {
+  .middle-link-row {
     border-radius: var(--dbd-container-stacked-border-radius);
     margin-bottom: 2px;
   }
 
-  .link-row:only-child {
+  .only-link-row {
     border-radius: var(--dbd-container-border-radius);
     margin-bottom: 0;
   }
@@ -70,26 +68,27 @@
     <div id="subpageDescription">$i18n{otherDataDescription}
     </div>
     <div class="link-rows-block">
-      <cr-link-row class="link-row" external
+      <cr-link-row external using-slotted-label
+          class$="[[getPasswordsLinkCssClass_(syncStatus_, isGoogleDse_)]]"
           sub-label="$i18n{manageInGooglePasswordManager}"
-          id="passwordManagerLink" on-click="onPasswordManagerClick_"
-          using-slotted-label>
+          id="passwordManagerLink" on-click="onPasswordManagerClick_">
         <div slot="label" class="label">$i18n{passwordsAndPasskeys}</div>
       </cr-link-row>
-      <cr-link-row id="googleSearchHistoryLink" class="link-row" external
-          hidden="[[!shouldShowGoogleSearchHistoryLink_(
+      <cr-link-row id="googleSearchHistoryLink" class="middle-link-row"
+          external hidden="[[!shouldShowGoogleSearchHistoryLink_(
               syncStatus_, isGoogleDse_)]]"
           on-click="onGoogleSearchHistoryLinkClick_"
           sub-label="$i18n{manageInYourGoogleAccount}" using-slotted-label>
         <div slot="label" class="label">$i18n{searchHistory}</div>
       </cr-link-row>
-      <cr-link-row id="myActivityLink" class="link-row" external
+      <cr-link-row id="myActivityLink" external using-slotted-label
+          class$="[[getMyActivityLinkCssClass_(isGoogleDse_)]]"
           hidden="[[!shouldShowMyActivityLink_(syncStatus_)]]"
           sub-label="$i18n{manageInYourGoogleAccount}"
-          on-click="onMyActivityLinkClick_" using-slotted-label>
+          on-click="onMyActivityLinkClick_">
         <div slot="label" class="label">$i18n{myActivity}</div>
       </cr-link-row>
-      <div id="nonGoogleSearchHistoryLink" class="cr-row first link-row"
+      <div id="nonGoogleSearchHistoryLink" class="cr-row first last-link-row"
           hidden="[[isGoogleDse_]]">
         <div class="flex cr-padded-text">
           <div class="label">$i18n{searchHistory}</div>
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/other_google_data_dialog.ts b/chrome/browser/resources/settings/clear_browsing_data_dialog/other_google_data_dialog.ts
index 470912856..9b3899b 100644
--- a/chrome/browser/resources/settings/clear_browsing_data_dialog/other_google_data_dialog.ts
+++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/other_google_data_dialog.ts
@@ -136,6 +136,20 @@
   private shouldShowGoogleSearchHistoryLink_() {
     return isSignedIn(this.syncStatus_) && this.isGoogleDse_;
   }
+
+  private getMyActivityLinkCssClass_() {
+    if (!this.isGoogleDse_) {
+      return 'middle-link-row';
+    }
+    return 'last-link-row';
+  }
+
+  private getPasswordsLinkCssClass_() {
+    if (this.isGoogleDse_ && !isSignedIn(this.syncStatus_)) {
+      return 'only-link-row';
+    }
+    return 'first-link-row';
+  }
 }
 
 declare global {
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_util.cc b/chrome/browser/safe_browsing/download_protection/download_protection_util.cc
index 0e6bfa6..add03bb 100644
--- a/chrome/browser/safe_browsing/download_protection/download_protection_util.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_protection_util.cc
@@ -18,6 +18,7 @@
 #include "components/enterprise/connectors/core/reporting_utils.h"
 #include "components/safe_browsing/buildflags.h"
 #include "components/safe_browsing/content/common/file_type_policies.h"
+#include "components/safe_browsing/core/common/proto/csd.pb.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #include "components/sessions/content/session_tab_helper.h"
 #include "content/public/browser/download_item_utils.h"
@@ -160,6 +161,8 @@
         DANGEROUS_DOWNLOAD_AUTO_DELETED:
     case safe_browsing::ClientSafeBrowsingReportRequest::
         DANGEROUS_DOWNLOAD_PROFILE_CLOSED:
+    case safe_browsing::ClientSafeBrowsingReportRequest::
+        DANGEROUS_DOWNLOAD_WARNING_ANDROID:
       return true;
     default:
       NOTREACHED();
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_util_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_protection_util_unittest.cc
index be09181..e065d35 100644
--- a/chrome/browser/safe_browsing/download_protection/download_protection_util_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_protection_util_unittest.cc
@@ -502,6 +502,49 @@
         &download_item,
         ClientSafeBrowsingReportRequest::DANGEROUS_DOWNLOAD_WARNING));
   }
+  // Report type for Android is gated by ESB (non-Incognito).
+  {
+    TestingProfile profile;
+    NiceMock<download::MockDownloadItem> download_item;
+    setup(&profile, &download_item);
+    SetSafeBrowsingState(profile.GetPrefs(),
+                         SafeBrowsingState::NO_SAFE_BROWSING);
+    EXPECT_FALSE(ShouldSendDangerousDownloadReport(
+        &download_item,
+        ClientSafeBrowsingReportRequest::DANGEROUS_DOWNLOAD_WARNING_ANDROID));
+  }
+  {
+    TestingProfile profile;
+    NiceMock<download::MockDownloadItem> download_item;
+    setup(&profile, &download_item);
+    SetSafeBrowsingState(profile.GetPrefs(),
+                         SafeBrowsingState::STANDARD_PROTECTION);
+    EXPECT_FALSE(ShouldSendDangerousDownloadReport(
+        &download_item,
+        ClientSafeBrowsingReportRequest::DANGEROUS_DOWNLOAD_WARNING_ANDROID));
+  }
+  {
+    TestingProfile profile;
+    NiceMock<download::MockDownloadItem> download_item;
+    setup(&profile, &download_item);
+    SetSafeBrowsingState(profile.GetPrefs(),
+                         SafeBrowsingState::ENHANCED_PROTECTION);
+    EXPECT_TRUE(ShouldSendDangerousDownloadReport(
+        &download_item,
+        ClientSafeBrowsingReportRequest::DANGEROUS_DOWNLOAD_WARNING_ANDROID));
+  }
+  {
+    TestingProfile profile;
+    TestingProfile::Builder profile_builder;
+    TestingProfile* otr_profile = profile_builder.BuildIncognito(&profile);
+    NiceMock<download::MockDownloadItem> download_item;
+    setup(otr_profile, &download_item);
+    SetSafeBrowsingState(otr_profile->GetPrefs(),
+                         SafeBrowsingState::ENHANCED_PROTECTION);
+    EXPECT_FALSE(ShouldSendDangerousDownloadReport(
+        &download_item,
+        ClientSafeBrowsingReportRequest::DANGEROUS_DOWNLOAD_WARNING_ANDROID));
+  }
 }
 #endif
 
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/DisplayableProfileData.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/DisplayableProfileData.java
index c177fa4..8788bb08 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/DisplayableProfileData.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/DisplayableProfileData.java
@@ -72,6 +72,16 @@
     }
 
     /**
+     * @return The email of the user if it is displayable, the full name otherwise.
+     */
+    public @Nullable String getEmailOrFullName() {
+        if (mHasDisplayableEmailAddress) {
+            return mAccountEmail;
+        }
+        return mFullName;
+    }
+
+    /**
      * Returns the given name of the user if it is available or the full name or email otherwise.
      */
     public String getGivenNameOrFullNameOrEmail() {
diff --git a/chrome/browser/supervised_user/BUILD.gn b/chrome/browser/supervised_user/BUILD.gn
index 7649086..ddb00559 100644
--- a/chrome/browser/supervised_user/BUILD.gn
+++ b/chrome/browser/supervised_user/BUILD.gn
@@ -134,6 +134,22 @@
     sources = [ "android/java/src/org/chromium/chrome/browser/supervised_user/SupervisedUserServicePlatformDelegate.java" ]
   }
 
+  generate_jni("supervised_user_service_bridge_jni_headers") {
+    sources = [ "android/java/src/org/chromium/chrome/browser/supervised_user/SupervisedUserServiceBridge.java" ]
+  }
+
+  android_library("supervised_user_service_bridge_java") {
+    srcjar_deps = [ ":supervised_user_service_bridge_jni_headers" ]
+    sources = [ "android/java/src/org/chromium/chrome/browser/supervised_user/SupervisedUserServiceBridge.java" ]
+    deps = [
+      "//base:base_java",
+      "//build/android:build_java",
+      "//chrome/browser/profiles/android:java",
+      "//third_party/androidx:androidx_annotation_annotation_java",
+      "//third_party/jni_zero:jni_zero_java",
+    ]
+  }
+
   generate_jni("test_support_jni_headers") {
     testonly = true
     sources = [
diff --git a/chrome/browser/supervised_user/android/java/src/org/chromium/chrome/browser/supervised_user/SupervisedUserServiceBridge.java b/chrome/browser/supervised_user/android/java/src/org/chromium/chrome/browser/supervised_user/SupervisedUserServiceBridge.java
new file mode 100644
index 0000000..541f09de
--- /dev/null
+++ b/chrome/browser/supervised_user/android/java/src/org/chromium/chrome/browser/supervised_user/SupervisedUserServiceBridge.java
@@ -0,0 +1,35 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.supervised_user;
+
+import org.jni_zero.JNINamespace;
+import org.jni_zero.JniType;
+import org.jni_zero.NativeMethods;
+
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.chrome.browser.profiles.Profile;
+
+/**
+ * Bridges the SupervisedUserService functionality to Java. The service is keyed by the profile, so
+ * the bridge offers static methods with the profile argument too. See the SupervisedUserService
+ * header file for more details and docs on the individual methods.
+ * TODO(crbug.com/427239583): Replace bridge with a service mirror.
+ */
+@NullMarked
+@JNINamespace("supervised_user")
+public class SupervisedUserServiceBridge {
+
+    /** Returns true if the user has any of the content filters settings enabled. */
+    public static boolean isSupervisedLocally(Profile profile) {
+        return SupervisedUserServiceBridgeJni.get().isSupervisedLocally(profile);
+    }
+
+    private SupervisedUserServiceBridge() {}
+
+    @NativeMethods
+    interface Natives {
+        boolean isSupervisedLocally(@JniType("Profile*") Profile profile);
+    }
+}
diff --git a/chrome/browser/supervised_user/android/supervised_user_service_bridge.cc b/chrome/browser/supervised_user/android/supervised_user_service_bridge.cc
new file mode 100644
index 0000000..29ff06a
--- /dev/null
+++ b/chrome/browser/supervised_user/android/supervised_user_service_bridge.cc
@@ -0,0 +1,20 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_android.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
+#include "components/supervised_user/core/browser/supervised_user_service.h"
+
+// Include last. Requires declarations from includes above.
+#include "chrome/browser/supervised_user/supervised_user_service_bridge_jni_headers/SupervisedUserServiceBridge_jni.h"
+
+namespace supervised_user {
+jboolean JNI_SupervisedUserServiceBridge_IsSupervisedLocally(
+    JNIEnv* env,
+    Profile* profile) {
+  return SupervisedUserServiceFactory::GetForProfile(profile)
+      ->IsSupervisedLocally();
+}
+}  // namespace supervised_user
diff --git a/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/ui/BatchUploadDialogCoordinator.java b/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/ui/BatchUploadDialogCoordinator.java
index d3ae5a0..db409ac 100644
--- a/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/ui/BatchUploadDialogCoordinator.java
+++ b/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/ui/BatchUploadDialogCoordinator.java
@@ -18,9 +18,9 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
+import org.chromium.chrome.browser.signin.services.DisplayableProfileData;
 import org.chromium.chrome.browser.sync.R;
 import org.chromium.components.browser_ui.widget.MaterialSwitchWithTitleAndSummary;
-import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.sync.DataType;
 import org.chromium.components.sync.LocalDataDescription;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
@@ -59,11 +59,11 @@
             Context context,
             HashMap<Integer, LocalDataDescription> localDataDescriptionsMap,
             ModalDialogManager dialogManager,
-            CoreAccountInfo accountInfo,
+            DisplayableProfileData displayableProfileData,
             Listener listener) {
         ThreadUtils.assertOnUiThread();
         new BatchUploadDialogCoordinator(
-                context, localDataDescriptionsMap, dialogManager, accountInfo, listener);
+                context, localDataDescriptionsMap, dialogManager, displayableProfileData, listener);
     }
 
     @VisibleForTesting
@@ -72,25 +72,28 @@
             Context context,
             HashMap<Integer, LocalDataDescription> localDataDescriptionsMap,
             ModalDialogManager dialogManager,
-            CoreAccountInfo accountInfo,
+            DisplayableProfileData displayableProfileData,
             Listener listener) {
         mContext = context;
         mDialogManager = dialogManager;
 
         final View view = inflateView(context);
+        @Nullable String displayableEmailOrName = displayableProfileData.getEmailOrFullName();
 
         mModel =
                 new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
                         .with(
                                 ModalDialogProperties.TITLE,
                                 mContext.getString(R.string.batch_upload_dialog_title))
-                        // TODO(crbug.com/354922852): Handle accounts with non-displayable email
-                        // address.
                         .with(
                                 ModalDialogProperties.MESSAGE_PARAGRAPH_1,
-                                mContext.getString(
-                                        R.string.batch_upload_dialog_description,
-                                        accountInfo.getEmail()))
+                                displayableEmailOrName != null
+                                        ? mContext.getString(
+                                                R.string.batch_upload_dialog_description,
+                                                displayableEmailOrName)
+                                        : mContext.getString(
+                                                R.string
+                                                        .batch_upload_dialog_description_non_displayable_profile_data))
                         .with(
                                 ModalDialogProperties.POSITIVE_BUTTON_TEXT,
                                 mContext.getString(R.string.batch_upload_dialog_save_button))
diff --git a/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/ui/batch_upload_card/BatchUploadCardMediator.java b/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/ui/batch_upload_card/BatchUploadCardMediator.java
index f95694e6..e85d276 100644
--- a/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/ui/batch_upload_card/BatchUploadCardMediator.java
+++ b/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/ui/batch_upload_card/BatchUploadCardMediator.java
@@ -23,6 +23,7 @@
 import org.chromium.chrome.browser.device_reauth.ReauthenticatorBridge;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.signin.services.IdentityServicesProvider;
+import org.chromium.chrome.browser.signin.services.ProfileDataCache;
 import org.chromium.chrome.browser.sync.R;
 import org.chromium.chrome.browser.sync.SyncServiceFactory;
 import org.chromium.chrome.browser.sync.ui.BatchUploadDialogCoordinator;
@@ -67,6 +68,7 @@
     private final Runnable mBatchUploadCardChangeAction;
     private final @EntryPoint int mEntryPoint;
 
+    private final ProfileDataCache mProfileDataCache;
     private final @Nullable SyncService mSyncService;
     private @MonotonicNonNull HashMap<Integer, LocalDataDescription> mLocalDataDescriptionsMap;
     private boolean mShouldBeVisible;
@@ -96,6 +98,7 @@
         mSnackbarManagerSupplier = snackbarManagerSupplier;
         mBatchUploadCardChangeAction = batchUploadCardChangeAction;
         mEntryPoint = entryPoint;
+        mProfileDataCache = ProfileDataCache.createWithDefaultImageSizeAndNoBadge(mContext);
         mSyncService = SyncServiceFactory.getForProfile(mProfile);
         if (mSyncService != null) {
             mSyncService.addSyncStateChangedListener(this);
@@ -251,7 +254,12 @@
                 BatchUploadCardProperties.ON_CLICK_LISTENER,
                 v -> {
                     BatchUploadDialogCoordinator.show(
-                            mContext, mLocalDataDescriptionsMap, mDialogManager, accountInfo, this);
+                            mContext,
+                            mLocalDataDescriptionsMap,
+                            mDialogManager,
+                            /* displayableProfileData= */ mProfileDataCache.getProfileDataOrDefault(
+                                    accountInfo.getEmail()),
+                            this);
                 });
 
         int entryPointDataType =
diff --git a/chrome/browser/tab_group_suggestion/BUILD.gn b/chrome/browser/tab_group_suggestion/BUILD.gn
index dbc33e2..b2dd8ed 100644
--- a/chrome/browser/tab_group_suggestion/BUILD.gn
+++ b/chrome/browser/tab_group_suggestion/BUILD.gn
@@ -16,7 +16,6 @@
       "android/java/src/org/chromium/chrome/browser/tab_group_suggestion/GroupSuggestionsPromotionProperties.java",
       "android/java/src/org/chromium/chrome/browser/tab_group_suggestion/GroupSuggestionsServiceFactory.java",
       "android/java/src/org/chromium/chrome/browser/tab_group_suggestion/SuggestionEventObserver.java",
-      "android/java/src/org/chromium/chrome/browser/tab_group_suggestion/toolbar/GroupSuggestionsButtonController.java",
     ]
 
     deps = [
@@ -27,8 +26,6 @@
       "//chrome/browser/profiles/android:java",
       "//chrome/browser/tab:java",
       "//chrome/browser/tabmodel:java",
-      "//chrome/browser/ui/android/toolbar:java",
-      "//chrome/browser/user_education:java",
       "//components/browser_ui/bottomsheet/android:java",
       "//components/embedder_support/android:util_java",
       "//components/visited_url_ranking/public:public_java",
@@ -41,6 +38,22 @@
     resources_package = "org.chromium.chrome.browser.tab_group_suggestion"
   }
 
+  android_library("toolbar_java") {
+    sources = [ "android/java/src/org/chromium/chrome/browser/tab_group_suggestion/toolbar/GroupSuggestionsButtonController.java" ]
+
+    deps = [
+      ":java",
+      "//base:base_java",
+      "//build/android:build_java",
+      "//chrome/browser/tab:java",
+      "//chrome/browser/ui/android/toolbar:java",
+      "//chrome/browser/user_education:java",
+      "//ui/android:ui_java",
+    ]
+    resources_package =
+        "org.chromium.chrome.browser.tab_group_suggestion.toolbar"
+  }
+
   android_resources("java_resources") {
     sources = [
       "android/java/res/layout/group_suggestions_bottom_sheet_container.xml",
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index aeddc326..fa6f6060 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -313,6 +313,7 @@
     "//chrome/browser:font_pref",
     "//chrome/browser:global_features",
     "//chrome/browser/affiliations",
+    "//chrome/browser/autocomplete",
     "//chrome/browser/autofill",
     "//chrome/browser/bitmap_fetcher",
     "//chrome/browser/breadcrumbs",
diff --git a/chrome/browser/ui/actions/OWNERS b/chrome/browser/ui/actions/OWNERS
new file mode 100644
index 0000000..a06b229
--- /dev/null
+++ b/chrome/browser/ui/actions/OWNERS
@@ -0,0 +1,2 @@
+kylixrd@chromium.org
+elainechien@chromium.org
diff --git a/chrome/browser/ui/android/multiwindow/BUILD.gn b/chrome/browser/ui/android/multiwindow/BUILD.gn
index 85918d6..9e11478 100644
--- a/chrome/browser/ui/android/multiwindow/BUILD.gn
+++ b/chrome/browser/ui/android/multiwindow/BUILD.gn
@@ -71,6 +71,7 @@
     "java/res/layout/instance_switcher_item_v2.xml",
     "java/res/layout/instance_switcher_list.xml",
     "java/res/layout/target_selector_dialog.xml",
+    "java/res/layout/target_selector_dialog_v2.xml",
     "java/res/values/colors.xml",
     "java/res/values/dimens.xml",
     "java/res/values/styles.xml",
diff --git a/chrome/browser/ui/android/multiwindow/java/res/layout/target_selector_dialog_v2.xml b/chrome/browser/ui/android/multiwindow/java/res/layout/target_selector_dialog_v2.xml
new file mode 100644
index 0000000..6fa2491c
--- /dev/null
+++ b/chrome/browser/ui/android/multiwindow/java/res/layout/target_selector_dialog_v2.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2025 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingHorizontal="@dimen/instance_switcher_dialog_content_padding"
+    android:paddingTop="@dimen/instance_switcher_dialog_content_padding">
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/targets_list"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:divider="@null"/>
+</FrameLayout>
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorCoordinator.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorCoordinator.java
index 7907f15..e4b817d 100644
--- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorCoordinator.java
+++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorCoordinator.java
@@ -13,9 +13,14 @@
 import android.view.View;
 import android.widget.ListView;
 
+import androidx.annotation.StringRes;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
 import org.chromium.base.Callback;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
+import org.chromium.components.browser_ui.util.TimeTextResolver;
 import org.chromium.components.favicon.LargeIconBridge;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
 import org.chromium.ui.modaldialog.ModalDialogManager;
@@ -25,6 +30,7 @@
 import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
 import org.chromium.ui.modelutil.ModelListAdapter;
 import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter;
 
 import java.util.Iterator;
 import java.util.List;
@@ -53,6 +59,7 @@
 
     /**
      * Show 'move window' modal dialog UI.
+     *
      * @param context Context to use to build the dialog.
      * @param modalDialogManager {@link ModalDialogManager} object.
      * @param iconBridge An object that fetches favicons from local DB.
@@ -64,9 +71,10 @@
             ModalDialogManager modalDialogManager,
             LargeIconBridge iconBridge,
             Callback<InstanceInfo> moveCallback,
-            List<InstanceInfo> instanceInfo) {
+            List<InstanceInfo> instanceInfo,
+            @StringRes int titleId) {
         new TargetSelectorCoordinator(context, modalDialogManager, iconBridge, moveCallback)
-                .showDialog(instanceInfo);
+                .showDialog(instanceInfo, titleId);
     }
 
     private TargetSelectorCoordinator(
@@ -79,32 +87,63 @@
         mMoveCallback = moveCallback;
         mUiUtils = new UiUtils(mContext, iconBridge);
 
-        ModelListAdapter adapter = new ModelListAdapter(mModelList);
-        adapter.registerType(
-                TYPE_ENTRY,
-                parentView ->
-                        LayoutInflater.from(mContext)
-                                .inflate(R.layout.instance_switcher_item, null),
-                TargetSelectorItemViewBinder::bind);
-        mDialogView = LayoutInflater.from(context).inflate(R.layout.target_selector_dialog, null);
-        ((ListView) mDialogView.findViewById(R.id.list_view)).setAdapter(adapter);
+        if (UiUtils.isInstanceSwitcherV2Enabled()) {
+
+            var adapter = new SimpleRecyclerViewAdapter(mModelList);
+
+            adapter.registerType(
+                    TYPE_ENTRY,
+                    parentView ->
+                            LayoutInflater.from(mContext)
+                                    .inflate(R.layout.instance_switcher_item_v2, null),
+                    TargetSelectorItemViewBinder::bind);
+
+            mDialogView =
+                    LayoutInflater.from(context).inflate(R.layout.target_selector_dialog_v2, null);
+
+            int itemVerticalSpacing =
+                    mContext.getResources()
+                            .getDimensionPixelSize(
+                                    R.dimen.instance_switcher_dialog_list_item_padding);
+            var itemDecoration = new DialogListItemDecoration(itemVerticalSpacing);
+
+            RecyclerView availableTargetsList = mDialogView.findViewById(R.id.targets_list);
+            availableTargetsList.setLayoutManager(
+                    new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false));
+            availableTargetsList.setAdapter(adapter);
+            availableTargetsList.addItemDecoration(itemDecoration);
+        } else {
+            ModelListAdapter adapter = new ModelListAdapter(mModelList);
+            adapter.registerType(
+                    TYPE_ENTRY,
+                    parentView ->
+                            LayoutInflater.from(mContext)
+                                    .inflate(R.layout.instance_switcher_item, null),
+                    TargetSelectorItemViewBinder::bind);
+            mDialogView =
+                    LayoutInflater.from(context).inflate(R.layout.target_selector_dialog, null);
+            ((ListView) mDialogView.findViewById(R.id.list_view)).setAdapter(adapter);
+        }
     }
 
-    private void showDialog(List<InstanceInfo> items) {
+    private void showDialog(List<InstanceInfo> items, @StringRes int titleId) {
         UiUtils.closeOpenDialogs();
         sPrevInstance = this;
-        mDialog = createDialog(items);
+        mDialog = createDialog(items, titleId);
         mModalDialogManager.showDialog(mDialog, ModalDialogType.APP);
     }
 
-    private PropertyModel createDialog(List<InstanceInfo> items) {
+    private PropertyModel createDialog(List<InstanceInfo> items, @StringRes int titleId) {
         for (InstanceInfo info : items) {
             if (info.type == InstanceInfo.Type.CURRENT) {
                 mSelectedItem = info;
                 mCurrentId = info.instanceId;
             }
-            PropertyModel itemModel = generateListItem(info);
-            mModelList.add(new ModelListAdapter.ListItem(0, itemModel));
+            if ((UiUtils.isInstanceSwitcherV2Enabled() && info.type != InstanceInfo.Type.CURRENT)
+                    || !UiUtils.isInstanceSwitcherV2Enabled()) {
+                PropertyModel itemModel = generateListItem(info);
+                mModelList.add(new ModelListAdapter.ListItem(0, itemModel));
+            }
         }
         ModalDialogProperties.Controller controller =
                 new ModalDialogProperties.Controller() {
@@ -130,7 +169,7 @@
                     }
                 };
         Resources resources = mContext.getResources();
-        String title = mContext.getString(R.string.menu_move_to_other_window);
+        String title = mContext.getString(titleId);
         return new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
                 .with(ModalDialogProperties.CONTROLLER, controller)
                 .with(ModalDialogProperties.CANCEL_ON_TOUCH_OUTSIDE, true)
@@ -143,7 +182,9 @@
                 .with(
                         ModalDialogProperties.POSITIVE_BUTTON_TEXT,
                         resources,
-                        R.string.target_selector_move)
+                        UiUtils.isInstanceSwitcherV2Enabled()
+                                ? R.string.move
+                                : R.string.target_selector_move)
                 .with(ModalDialogProperties.NEGATIVE_BUTTON_TEXT, resources, R.string.cancel)
                 .with(
                         ModalDialogProperties.DIALOG_STYLES,
@@ -158,18 +199,27 @@
     private PropertyModel generateListItem(InstanceInfo item) {
         String title = mUiUtils.getItemTitle(item);
         String desc = mUiUtils.getItemDesc(item);
-        PropertyModel model =
+        PropertyModel.Builder builder =
                 new PropertyModel.Builder(TargetSelectorItemProperties.ALL_KEYS)
                         .with(TargetSelectorItemProperties.TITLE, title)
                         .with(TargetSelectorItemProperties.DESC, desc)
                         .with(TargetSelectorItemProperties.INSTANCE_ID, item.instanceId)
                         .with(
-                                TargetSelectorItemProperties.CHECK_TARGET,
-                                item.type == InstanceInfo.Type.CURRENT)
-                        .with(
                                 TargetSelectorItemProperties.CLICK_LISTENER,
-                                (view) -> selectInstance(item))
-                        .build();
+                                (view) -> selectInstance(item));
+
+        if (UiUtils.isInstanceSwitcherV2Enabled()) {
+            String lastAccessedString =
+                    TimeTextResolver.resolveTimeAgoText(
+                            mContext.getResources(), item.lastAccessedTime);
+            builder.with(TargetSelectorItemProperties.LAST_ACCESSED, lastAccessedString);
+            builder.with(TargetSelectorItemProperties.IS_SELECTED, false);
+        } else {
+            builder.with(
+                    TargetSelectorItemProperties.CHECK_TARGET,
+                    item.type == InstanceInfo.Type.CURRENT);
+        }
+        PropertyModel model = builder.build();
         mUiUtils.setFavicon(model, TargetSelectorItemProperties.FAVICON, item);
         return model;
     }
@@ -185,10 +235,15 @@
         while (it.hasNext()) {
             ListItem li = it.next();
             int id = li.model.get(TargetSelectorItemProperties.INSTANCE_ID);
-            if (id == mSelectedItem.instanceId) {
-                li.model.set(TargetSelectorItemProperties.CHECK_TARGET, false);
-            } else if (id == instanceId) {
-                li.model.set(TargetSelectorItemProperties.CHECK_TARGET, true);
+            if (UiUtils.isInstanceSwitcherV2Enabled()) {
+                li.model.set(TargetSelectorItemProperties.IS_SELECTED, id == instanceId);
+                mDialog.set(ModalDialogProperties.POSITIVE_BUTTON_DISABLED, false);
+            } else {
+                if (id == mSelectedItem.instanceId) {
+                    li.model.set(TargetSelectorItemProperties.CHECK_TARGET, false);
+                } else if (id == instanceId) {
+                    li.model.set(TargetSelectorItemProperties.CHECK_TARGET, true);
+                }
             }
         }
         mSelectedItem = clickedItem;
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorCoordinatorTest.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorCoordinatorTest.java
index 0b20dc0..fdbb83b 100644
--- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorCoordinatorTest.java
+++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorCoordinatorTest.java
@@ -7,10 +7,15 @@
 import static androidx.test.espresso.Espresso.onData;
 import static androidx.test.espresso.Espresso.onView;
 import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition;
 import static androidx.test.espresso.matcher.RootMatchers.isDialog;
+import static androidx.test.espresso.matcher.ViewMatchers.isEnabled;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
 import static androidx.test.espresso.matcher.ViewMatchers.withText;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
 
 import static org.hamcrest.Matchers.anything;
+import static org.hamcrest.Matchers.not;
 
 import androidx.test.filters.SmallTest;
 
@@ -25,6 +30,7 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Features.DisableFeatures;
+import org.chromium.base.test.util.Features.EnableFeatures;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
@@ -95,7 +101,8 @@
                             mModalDialogManager,
                             mIconBridge,
                             moveCallback,
-                            Arrays.asList(instances));
+                            Arrays.asList(instances),
+                            R.string.menu_move_to_other_window);
                 });
 
         // Choose a target window.
@@ -110,4 +117,45 @@
         onView(withText(moveTab)).perform(click());
         itemClickCallbackHelper.waitForCallback(itemClickCount);
     }
+
+    @Test
+    @SmallTest
+    @EnableFeatures(ChromeFeatureList.INSTANCE_SWITCHER_V2)
+    public void testTargetSelectorCoordinatorTest_moveWindow_V2() throws Exception {
+        InstanceInfo[] instances =
+                new InstanceInfo[] {
+                    new InstanceInfo(
+                            0, 57, InstanceInfo.Type.CURRENT, "url0", "title0", 1, 0, false, 0),
+                    new InstanceInfo(
+                            1, 58, InstanceInfo.Type.OTHER, "ur11", "title1", 2, 0, false, 0),
+                    new InstanceInfo(
+                            2, 59, InstanceInfo.Type.OTHER, "url2", "title2", 1, 1, false, 0)
+                };
+        final CallbackHelper itemClickCallbackHelper = new CallbackHelper();
+        final int itemClickCount = itemClickCallbackHelper.getCallCount();
+        Callback<InstanceInfo> moveCallback = (item) -> itemClickCallbackHelper.notifyCalled();
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    TargetSelectorCoordinator.showDialog(
+                            mActivityTestRule.getActivity(),
+                            mModalDialogManager,
+                            mIconBridge,
+                            moveCallback,
+                            Arrays.asList(instances),
+                            R.string.menu_move_tab_to_other_window);
+                });
+
+        // Verify "Move" button is disabled before a selection is made.
+        onView(withText(R.string.move)).inRoot(isDialog()).check(matches(not(isEnabled())));
+
+        // Select the first item.
+        onView(withId(R.id.targets_list))
+                .inRoot(isDialog())
+                .perform(actionOnItemAtPosition(0, click()));
+
+        // Click 'move'.
+        String moveTab = mActivityTestRule.getActivity().getResources().getString(R.string.move);
+        onView(withText(moveTab)).perform(click());
+        itemClickCallbackHelper.waitForCallback(itemClickCount);
+    }
 }
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemProperties.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemProperties.java
index ce434d9..2c46a6a 100644
--- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemProperties.java
+++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemProperties.java
@@ -32,6 +32,21 @@
     public static final PropertyModel.WritableBooleanPropertyKey CHECK_TARGET =
             new PropertyModel.WritableBooleanPropertyKey();
 
+    public static final PropertyModel.WritableObjectPropertyKey<String> LAST_ACCESSED =
+            new PropertyModel.WritableObjectPropertyKey<>();
+
+    public static final PropertyModel.WritableBooleanPropertyKey IS_SELECTED =
+            new PropertyModel.WritableBooleanPropertyKey();
+
     public static final PropertyKey[] ALL_KEYS =
-            new PropertyKey[] {FAVICON, TITLE, DESC, INSTANCE_ID, CLICK_LISTENER, CHECK_TARGET};
+            new PropertyKey[] {
+                FAVICON,
+                TITLE,
+                DESC,
+                INSTANCE_ID,
+                CLICK_LISTENER,
+                CHECK_TARGET,
+                LAST_ACCESSED,
+                IS_SELECTED
+            };
 }
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemViewBinder.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemViewBinder.java
index 998a668..e2b5657 100644
--- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemViewBinder.java
+++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemViewBinder.java
@@ -6,8 +6,10 @@
 
 import android.view.View;
 import android.widget.ImageView;
+import android.widget.RelativeLayout;
 import android.widget.TextView;
 
+import androidx.core.content.ContextCompat;
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
@@ -18,6 +20,20 @@
         if (TargetSelectorItemProperties.FAVICON == propertyKey) {
             ((ImageView) view.findViewById(R.id.favicon))
                     .setImageDrawable(model.get(TargetSelectorItemProperties.FAVICON));
+        } else if (TargetSelectorItemProperties.IS_SELECTED == propertyKey) {
+            ImageView faviconView = view.findViewById(R.id.favicon);
+            boolean isSelected = model.get(TargetSelectorItemProperties.IS_SELECTED);
+
+            // Show check mark if selected, otherwise fallback to favicon.
+            if (isSelected) {
+                faviconView.setImageDrawable(
+                        ContextCompat.getDrawable(
+                                view.getContext(), R.drawable.checkmark_circle_24dp));
+                view.setSelected(true);
+            } else {
+                faviconView.setImageDrawable(model.get(TargetSelectorItemProperties.FAVICON));
+                view.setSelected(false);
+            }
 
         } else if (TargetSelectorItemProperties.TITLE == propertyKey) {
             ((TextView) view.findViewById(R.id.title))
@@ -35,6 +51,15 @@
             boolean visible = model.get(TargetSelectorItemProperties.CHECK_TARGET);
             ImageView checkmark = view.findViewById(R.id.check_mark);
             checkmark.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
+        } else if (TargetSelectorItemProperties.LAST_ACCESSED == propertyKey) {
+            TextView lastAccessedView = view.findViewById(R.id.last_accessed);
+            String text = model.get(TargetSelectorItemProperties.LAST_ACCESSED);
+            lastAccessedView.setText(text);
+            RelativeLayout.LayoutParams params =
+                    (RelativeLayout.LayoutParams) lastAccessedView.getLayoutParams();
+            params.addRule(RelativeLayout.ALIGN_PARENT_END);
+            ImageView closeButton = view.findViewById(R.id.close_button);
+            closeButton.setVisibility(View.GONE);
         }
     }
 }
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index fde3029..0d899c8 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -2734,6 +2734,9 @@
       <message name="IDS_BATCH_UPLOAD_DIALOG_DESCRIPTION" desc="The text appears as a note in a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome. This note explains where the user can go to view and manage individual items. like individual bookmarks or passwords.">
         You can choose what data to save in your Google Account, <ph name="ACCOUNT_EMAIL">%1$s<ex>elisa.g.beckett@gmail.com</ex></ph>.\nYou can also view and manage these items in your bookmarks, reading list, or password manager.
       </message>
+      <message name="IDS_BATCH_UPLOAD_DIALOG_DESCRIPTION_NON_DISPLAYABLE_PROFILE_DATA" desc="The text appears as a note in a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome. This note explains where the user can go to view and manage individual items. like individual bookmarks or passwords.">
+        You can choose what data to save in your Google Account.\nYou can also view and manage these items in your bookmarks, reading list, or password manager.
+      </message>
       <message name="IDS_BATCH_UPLOAD_DIALOG_BOOKMARKS" desc="One of the data types that we allow uploading through a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome.">
         {ITEMS_COUNT, plural,
           =1 {1 bookmark}
@@ -4393,6 +4396,12 @@
       <message name="IDS_MENU_MOVE_TO_OTHER_WINDOW" desc="Menu item for moving the current tab into the other window. [CHAR_LIMIT=27]">
         Move to other window
       </message>
+      <message name="IDS_MENU_MOVE_TAB_TO_OTHER_WINDOW" desc="Menu item for moving the current tab into another window. [CHAR_LIMIT=27]">
+        Move tab to another window
+      </message>
+      <message name="IDS_MENU_MOVE_GROUP_TO_OTHER_WINDOW" desc="Menu item for moving the current tab group into another window. [CHAR_LIMIT=27]">
+        Move group to another window
+      </message>
       <message name="IDS_MENU_MANAGE_ALL_WINDOWS" desc="Menu item for bringing up instance switcher UI. [CHAR_LIMIT=27]">
         Manage windows (<ph name="INSTANCE_COUNTS">%1$d<ex>3</ex></ph>)
       </message>
@@ -4539,6 +4548,9 @@
       <message name="IDS_MENU_PIN_TAB" desc="Menu item for pinning a tab.">
         Pin tab
       </message>
+      <message name="IDS_MENU_ITEM_CONTENT_FILTER_HELP_CENTER_LINK" desc="Menu item to explain that the content filter is on and to direct the user to the help center article about content filters. Only available when the content filter is on.">
+        Content filter is on
+      </message>
 
       <!-- Bookmarks strings -->
       <message name="IDS_BOOKMARKS" desc="Title of the bookmarks page, which shows a list of the user's bookmarks. [CHAR_LIMIT=18]">
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_BATCH_UPLOAD_DIALOG_DESCRIPTION_NON_DISPLAYABLE_PROFILE_DATA.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_BATCH_UPLOAD_DIALOG_DESCRIPTION_NON_DISPLAYABLE_PROFILE_DATA.png.sha1
new file mode 100644
index 0000000..b5a95d9
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_BATCH_UPLOAD_DIALOG_DESCRIPTION_NON_DISPLAYABLE_PROFILE_DATA.png.sha1
@@ -0,0 +1 @@
+c00eda8c7431dd292d1d8e5281ac0129e8d1d2c9
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_CONTENT_FILTER_HELP_CENTER_LINK.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_CONTENT_FILTER_HELP_CENTER_LINK.png.sha1
new file mode 100644
index 0000000..9c9b039e
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ITEM_CONTENT_FILTER_HELP_CENTER_LINK.png.sha1
@@ -0,0 +1 @@
+b2977f925ed4618a42865d03dad9ec5695bdc57d
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_MOVE_GROUP_TO_OTHER_WINDOW.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_MOVE_GROUP_TO_OTHER_WINDOW.png.sha1
new file mode 100644
index 0000000..3bbedb72
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_MOVE_GROUP_TO_OTHER_WINDOW.png.sha1
@@ -0,0 +1 @@
+69b6ef29bf638d795a376c1eae09d8d4814d9c20
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_MOVE_TAB_TO_OTHER_WINDOW.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_MOVE_TAB_TO_OTHER_WINDOW.png.sha1
new file mode 100644
index 0000000..b94c408
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_MOVE_TAB_TO_OTHER_WINDOW.png.sha1
@@ -0,0 +1 @@
+2da975aac7c11c4f6c0007963ce28b19cc3b7b2d
\ No newline at end of file
diff --git a/chrome/browser/ui/android/toolbar/java/res/values/ids.xml b/chrome/browser/ui/android/toolbar/java/res/values/ids.xml
index f4499bf..98022067 100644
--- a/chrome/browser/ui/android/toolbar/java/res/values/ids.xml
+++ b/chrome/browser/ui/android/toolbar/java/res/values/ids.xml
@@ -26,6 +26,7 @@
     <item type="id" name="add_to_bookmarks" />
     <item type="id" name="remove_from_tab_group" />
     <item type="id" name="share_tab" />
+    <item type="id" name="pin_tab" />
 
     <!-- Presentation is the same as delete_tab_group, but helps handler impl. -->
     <item type="id" name="delete_shared_group" />
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java
index 7ce0b82..1e18871 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBar.java
@@ -25,6 +25,7 @@
 import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.theme.SurfaceColorUpdateUtils;
 import org.chromium.chrome.browser.theme.ThemeUtils;
 import org.chromium.components.browser_ui.styles.SemanticColorUtils;
 import org.chromium.components.browser_ui.widget.ClipDrawableProgressBar;
@@ -363,7 +364,7 @@
         if (mThemeColor != 0) {
             setThemeColor(mThemeColor, false);
         } else {
-            setForegroundColor(getForegroundColor());
+            setThemeColor(SurfaceColorUpdateUtils.getDefaultThemeColor(getContext(), false), false);
         }
     }
 
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java
index de0f629..8bb3d8c5 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java
@@ -320,20 +320,15 @@
     @Feature({"Android-Progress-Bar"})
     public void testProgressBarColors_TransparentTheme() {
         mProgressBar.setThemeColor(Color.TRANSPARENT, /* isIncognito = */ false);
-        int foregroundColor = mProgressBar.getForegroundColor();
-        int backgroundColor = mProgressBar.getBackgroundColor();
         mProgressBar.setAnimatingView(mProgressBarAnimatingView);
 
         assertEquals(
-                "Foreground color does not match color.",
-                foregroundColor,
+                "Foreground color does not match expected color.",
+                SemanticColorUtils.getProgressBarForeground(mActivity),
                 mProgressBar.getForegroundColor());
-        assertEquals(
-                "Background color does not match color.",
-                backgroundColor,
-                mProgressBar.getBackgroundColor());
     }
 
+
     @Test
     @Feature({"Android-Progress-Bar"})
     public void testProgressBarColors_nonDefaultTheme() {
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/optional_button/OptionalButtonCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/optional_button/OptionalButtonCoordinator.java
index 4f8bd8a..631b1343 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/optional_button/OptionalButtonCoordinator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/optional_button/OptionalButtonCoordinator.java
@@ -48,6 +48,7 @@
     private final Supplier<Tracker> mFeatureEngagementTrackerSupplier;
     private @Nullable Callback<Integer> mTransitionFinishedCallback;
     private @Nullable IphCommandBuilder mIphCommandBuilder;
+    private boolean mAlwaysShowActionChip;
 
     @IntDef({
         TransitionType.SWAPPING,
@@ -150,6 +151,15 @@
     }
 
     /**
+     * Set the flag that always enables chip animiation of contextual page action.
+     *
+     * @param show Whether the animation should be always enabled.
+     */
+    public void setAlwaysShowActionChip(boolean show) {
+        mAlwaysShowActionChip = show;
+    }
+
+    /**
      * Updates the button to replace the current action with a new one. If animations are allowed
      * (according to the BooleanSupplier set with setIsAnimationAllowedPredicate) then this update
      * will be animated. Otherwise it'll instantly switch to the new icon.
@@ -180,11 +190,12 @@
             // And if feature engagement allows it.
             Tracker featureEngagementTracker = mFeatureEngagementTrackerSupplier.get();
             boolean shouldShowActionChip =
-                    isActionChipVariant
-                            && featureEngagementTracker != null
-                            && featureEngagementTracker.isInitialized()
-                            && featureEngagementTracker.shouldTriggerHelpUi(
-                                    FeatureConstants.CONTEXTUAL_PAGE_ACTIONS_ACTION_CHIP);
+                    mAlwaysShowActionChip
+                            || (isActionChipVariant
+                                    && featureEngagementTracker != null
+                                    && featureEngagementTracker.isInitialized()
+                                    && featureEngagementTracker.shouldTriggerHelpUi(
+                                            FeatureConstants.CONTEXTUAL_PAGE_ACTIONS_ACTION_CHIP));
 
             if (!shouldShowActionChip) {
                 ((ButtonDataImpl) buttonData).updateActionChipResourceId(Resources.ID_NULL);
diff --git a/chrome/browser/ui/android/webid/BUILD.gn b/chrome/browser/ui/android/webid/BUILD.gn
index 1da8ebe..a6684d9 100644
--- a/chrome/browser/ui/android/webid/BUILD.gn
+++ b/chrome/browser/ui/android/webid/BUILD.gn
@@ -46,5 +46,8 @@
 }
 
 java_cpp_enum("java_enums_srcjar") {
-  sources = [ "//content/public/browser/identity_request_dialog_controller.h" ]
+  sources = [
+    "//content/public/browser/identity_request_account.h",
+    "//content/public/browser/identity_request_dialog_controller.h",
+  ]
 }
diff --git a/chrome/browser/ui/android/webid/account_selection_view_android.cc b/chrome/browser/ui/android/webid/account_selection_view_android.cc
index e40f02d..61b150b 100644
--- a/chrome/browser/ui/android/webid/account_selection_view_android.cc
+++ b/chrome/browser/ui/android/webid/account_selection_view_android.cc
@@ -47,6 +47,16 @@
 // from badging.
 constexpr int kCircleCroppedBadgedAvatarSize = 40;
 
+inline ScopedJavaLocalRef<jintArray> ConvertFieldsToJavaArray(
+    JNIEnv* env,
+    const std::vector<content::IdentityRequestDialogDisclosureField>& fields) {
+  std::vector<int> int_array;
+  for (auto field : fields) {
+    int_array.push_back(static_cast<int>(field));
+  }
+  return base::android::ToJavaIntArray(env, int_array);
+}
+
 ScopedJavaLocalRef<jobject> ConvertToJavaAccount(
     JNIEnv* env,
     content::IdentityRequestAccount* account,
@@ -80,7 +90,8 @@
       decoded_picture, circle_cropped_badged_picture,
       account->login_state == Account::LoginState::kSignIn,
       account->browser_trusted_login_state == Account::LoginState::kSignIn,
-      account->is_filtered_out, identity_provider);
+      account->is_filtered_out, ConvertFieldsToJavaArray(env, account->fields),
+      identity_provider);
 }
 
 ScopedJavaLocalRef<jobject> ConvertToJavaIdentityProviderMetadata(
@@ -147,16 +158,6 @@
   return array;
 }
 
-inline ScopedJavaLocalRef<jintArray> ConvertFieldsToJavaArray(
-    JNIEnv* env,
-    const std::vector<content::IdentityRequestDialogDisclosureField>& fields) {
-  std::vector<int> int_array;
-  for (auto field : fields) {
-    int_array.push_back(static_cast<int>(field));
-  }
-  return base::android::ToJavaIntArray(env, int_array);
-}
-
 ScopedJavaLocalRef<jobject> ConvertToJavaIdentityProviderData(
     JNIEnv* env,
     content::IdentityProviderData* idp_data,
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionButtonModeControllerTest.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionButtonModeControllerTest.java
index 4986f1a..d73d5e7 100644
--- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionButtonModeControllerTest.java
+++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionButtonModeControllerTest.java
@@ -188,7 +188,7 @@
                 mTestEtldPlusOne,
                 Arrays.asList(),
                 Arrays.asList(mIdpData),
-                mNewAccountsSingleNewAccount);
+                Arrays.asList(mNewUserAccountWithoutFields));
 
         // Account chooser dialog is shown for a single newly signed-in new account where request
         // permission is false. Since this is a new account and request permission is false, we need
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionButtonModeIntegrationTest.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionButtonModeIntegrationTest.java
index 0815b04..5ab8ef7 100644
--- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionButtonModeIntegrationTest.java
+++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionButtonModeIntegrationTest.java
@@ -205,6 +205,7 @@
                         /* isSignIn= */ true,
                         /* isBrowserTrustedSignIn= */ false,
                         /* isFilteredOut= */ false,
+                        new int[0],
                         mIdpDataWithAddAccount);
 
         runOnUiThreadBlocking(
@@ -496,7 +497,7 @@
                 () -> {
                     mAccountSelection.showAccounts(
                             EXAMPLE_ETLD_PLUS_ONE,
-                            Arrays.asList(mNewBobWithAddAccount),
+                            Arrays.asList(mReturningAnaWithAddAccount),
                             Arrays.asList(mIdpDataWithAddAccount),
                             /* newAccounts= */ Collections.EMPTY_LIST);
                     mAccountSelection.getMediator().setComponentShowTime(-1000);
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionControllerTest.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionControllerTest.java
index 4a8a2c7..5ad8c467 100644
--- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionControllerTest.java
+++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionControllerTest.java
@@ -443,7 +443,7 @@
         mIdpData.setDisclosureFields(new int[0]);
         mMediator.showAccounts(
                 mTestEtldPlusOne,
-                Arrays.asList(mNewUserAccount),
+                Arrays.asList(mNewUserAccountWithoutFields),
                 Arrays.asList(mIdpData),
                 /* newAccounts= */ Collections.EMPTY_LIST);
         // Because disclosureFields are empty, we expect header + account + continue btn, and drag
@@ -460,11 +460,11 @@
         mIdpData.setDisclosureFields(new int[0]);
         mMediator.showAccounts(
                 mTestEtldPlusOne,
-                Arrays.asList(mNewUserAccount, mBobAccount),
+                Arrays.asList(mNewUserAccountWithoutFields, mBobAccount),
                 Arrays.asList(mIdpData),
                 /* newAccounts= */ Collections.EMPTY_LIST);
-        mMediator.onAccountSelected(new ButtonData(mNewUserAccount, /* idpMetadata= */ null));
-        verify(mMockDelegate).onAccountSelected(mNewUserAccount);
+        mMediator.onAccountSelected(new ButtonData(mNewUserAccountWithoutFields, /* idpMetadata= */ null));
+        verify(mMockDelegate).onAccountSelected(mNewUserAccountWithoutFields);
         assertFalse(mMediator.wasDismissed());
         mMediator.close();
         assertTrue(mMediator.wasDismissed());
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionIntegrationTestBase.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionIntegrationTestBase.java
index 85c70a5..ee6c29f 100644
--- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionIntegrationTestBase.java
+++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionIntegrationTestBase.java
@@ -136,6 +136,7 @@
                         /* isSignIn= */ true,
                         /* isBrowserTrustedSignIn= */ true,
                         /* isFilteredOut= */ false,
+                        /* fields= */ new int[0],
                         mIdpData);
         mNewBob =
                 new Account(
@@ -149,6 +150,7 @@
                         /* isSignIn= */ false,
                         /* isBrowserTrustedSignIn= */ false,
                         /* isFilteredOut= */ false,
+                        DEFAULT_DISCLOSURE_FIELDS,
                         mIdpData);
 
         mReturningAnaWithAddAccount =
@@ -163,6 +165,7 @@
                         /* isSignIn= */ true,
                         /* isBrowserTrustedSignIn= */ true,
                         /* isFilteredOut= */ false,
+                        /* fields= */ new int[0],
                         mIdpDataWithAddAccount);
         mNewBobWithAddAccount =
                 new Account(
@@ -176,6 +179,7 @@
                         /* isSignIn= */ false,
                         /* isBrowserTrustedSignIn= */ false,
                         /* isFilteredOut= */ false,
+                        DEFAULT_DISCLOSURE_FIELDS,
                         mIdpDataWithAddAccount);
 
         mNewAccountsReturningAna = Arrays.asList(mReturningAna);
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionJUnitTestBase.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionJUnitTestBase.java
index 4ec5f46..e3eb202 100644
--- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionJUnitTestBase.java
+++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionJUnitTestBase.java
@@ -152,6 +152,7 @@
     Account mBobAccount;
     Account mCarlAccount;
     Account mNewUserAccount;
+    Account mNewUserAccountWithoutFields;
     Account mNoOneAccount;
     Account mFilteredOutAccount;
     Account mFilteredOutAccountWithUseDifferentAccount;
@@ -269,6 +270,7 @@
                         /* isSignIn= */ true,
                         /* isBrowserTrustedSignIn= */ true,
                         /* isFilteredOut= */ false,
+                        /* fields= */ new int[0],
                         mIdpData);
         mAnaAccountWithUseDifferentAccount =
                 new Account(
@@ -283,6 +285,7 @@
                         /* isSignIn= */ true,
                         /* isBrowserTrustedSignIn= */ true,
                         /* isFilteredOut= */ false,
+                        /* fields= */ new int[0],
                         mIdpDataWithUseDifferentAccount);
         mAnaAccountWithoutBrandIcons =
                 new Account(
@@ -297,6 +300,7 @@
                         /* isSignIn= */ true,
                         /* isBrowserTrustedSignIn= */ true,
                         /* isFilteredOut= */ false,
+                        /* fields= */ new int[0],
                         mIdpDataWithoutIcons);
         mBobAccount =
                 new Account(
@@ -310,6 +314,7 @@
                         /* isSignIn= */ true,
                         /* isBrowserTrustedSignIn= */ true,
                         /* isFilteredOut= */ false,
+                        /* fields= */ new int[0],
                         mIdpData);
         mCarlAccount =
                 new Account(
@@ -323,6 +328,7 @@
                         /* isSignIn= */ true,
                         /* isBrowserTrustedSignIn= */ true,
                         /* isFilteredOut= */ false,
+                        /* fields= */ new int[0],
                         mIdpData);
         mNewUserAccount =
                 new Account(
@@ -337,7 +343,25 @@
                         /* isSignIn= */ false,
                         /* isBrowserTrustedSignIn= */ false,
                         /* isFilteredOut= */ false,
+                        DEFAULT_DISCLOSURE_FIELDS,
                         mIdpData);
+
+         mNewUserAccountWithoutFields =
+                new Account(
+                        "602214076",
+                        "goto@email.example",
+                        "Sam E. Goto",
+                        "Sam",
+                        /* secondaryDescription= */ "email.example",
+                        /* pictureBitmap= */ null,
+                        /* circledBadgedPictureBitmap= */ Bitmap.createBitmap(
+                                100, 100, Bitmap.Config.ARGB_4444),
+                        /* isSignIn= */ false,
+                        /* isBrowserTrustedSignIn= */ false,
+                        /* isFilteredOut= */ false,
+                        /* fields= */ new int[0],
+                        mIdpData);
+
         mNoOneAccount =
                 new Account(
                         "",
@@ -350,6 +374,7 @@
                         /* isSignIn= */ true,
                         /* isBrowserTrustedSignIn= */ true,
                         /* isFilteredOut= */ false,
+                        /* fields= */ new int[0],
                         mIdpData);
         mFilteredOutAccount =
                 new Account(
@@ -363,6 +388,7 @@
                         /* isSignIn= */ true,
                         /* isBrowserTrustedSignIn= */ true,
                         /* isFilteredOut= */ true,
+                        /* fields= */ new int[0],
                         mIdpData);
         mFilteredOutAccountWithUseDifferentAccount =
                 new Account(
@@ -376,6 +402,7 @@
                         /* isSignIn= */ true,
                         /* isBrowserTrustedSignIn= */ true,
                         /* isFilteredOut= */ true,
+                        /* fields= */ new int[0],
                         mIdpDataWithUseDifferentAccount);
         mNicolasAccount =
                 new Account(
@@ -389,6 +416,7 @@
                         /* isSignIn= */ true,
                         /* isBrowserTrustedSignIn= */ true,
                         /* isFilteredOut= */ false,
+                        /* fields= */ new int[0],
                         mIdpData);
 
         mSingleIdentifierAccount =
@@ -403,6 +431,7 @@
                         /* isSignIn= */ false,
                         /* isBrowserTrustedSignIn= */ false,
                         /* isFilteredOut= */ false,
+                        DEFAULT_DISCLOSURE_FIELDS,
                         mIdpData);
 
         mSingleIdentifierAccountFilteredOut =
@@ -417,6 +446,7 @@
                         /* isSignIn= */ true,
                         /* isBrowserTrustedSignIn= */ true,
                         /* isFilteredOut= */ true,
+                        /* fields= */ new int[0],
                         mIdpData);
 
         mNewAccountsSingleReturningAccount = Arrays.asList(mAnaAccount);
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionMediator.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionMediator.java
index 2c3509e4..081dd2c 100644
--- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionMediator.java
+++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionMediator.java
@@ -822,16 +822,10 @@
                 return showVerifySheet(mSelectedAccount);
             }
 
-            // The IDP claimed login state controls whether we show disclosure text,
-            // if we do not skip the next dialog. Also skip when request_permission
-            // is false (controlled by the fields API).
-            boolean shouldShowRequestPermissionDialog =
-                    !newlySignedInAccount.isSignIn()
-                            && newlySignedInAccount
-                                            .getIdentityProviderData()
-                                            .getDisclosureFields()
-                                            .length
-                                    > 0;
+            // We should show the permission dialog / disclosure text if fields
+            // is not empty. This is affected by the login status as well as
+            // the requested fields.
+            boolean shouldShowRequestPermissionDialog = newlySignedInAccount.getFields().length > 0;
             if (shouldShowRequestPermissionDialog) {
                 return showRequestPermissionModalSheet(mSelectedAccount);
             }
@@ -852,15 +846,12 @@
         }
 
         // We want the accounts to be clickable if there is no preselected account or if we're not
-        // going to show the disclosure text, which happens when the account is a signIn or when
-        // fields is empty.
+        // going to show the disclosure text, which happens when fields is empty.
         if (!updateSheet(
                 mSelectedAccount != null ? Arrays.asList(mSelectedAccount) : mAccounts,
                 mSelectedAccount != null ? Collections.emptyList() : mIdpDataListForShowAccounts,
                 /* areAccountsClickable= */ mSelectedAccount == null
-                        || mSelectedAccount.isSignIn()
-                        || mSelectedAccount.getIdentityProviderData().getDisclosureFields().length
-                                == 0)) {
+                        || mSelectedAccount.getFields().length == 0)) {
             return false;
         }
         updateBackPressBehavior();
@@ -938,15 +929,7 @@
         boolean isDataSharingConsentVisible = false;
         Callback<ButtonData> continueButtonCallback = null;
         if (mHeaderType == HeaderType.SIGN_IN && mSelectedAccount != null) {
-            // Only show the user data sharing consent text for sign up and only
-            // if we're asked to request permission.
-            isDataSharingConsentVisible =
-                    !mSelectedAccount.isSignIn()
-                            && mSelectedAccount
-                                            .getIdentityProviderData()
-                                            .getDisclosureFields()
-                                            .length
-                                    > 0;
+            isDataSharingConsentVisible = mSelectedAccount.getFields().length > 0;
             continueButtonCallback = this::onClickAccountSelected;
         }
 
@@ -989,9 +972,7 @@
                             ? createDataSharingConsentItem(
                                     mIdpForDisplay,
                                     mSelectedAccount.getIdentityProviderData().getClientMetadata(),
-                                    mSelectedAccount
-                                            .getIdentityProviderData()
-                                            .getDisclosureFields())
+                                    mSelectedAccount.getFields())
                             : null);
         }
         mModel.set(
@@ -1017,9 +998,7 @@
                             ? createDataSharingConsentItem(
                                     mIdpForDisplay,
                                     mSelectedAccount.getIdentityProviderData().getClientMetadata(),
-                                    mSelectedAccount
-                                            .getIdentityProviderData()
-                                            .getDisclosureFields())
+                                    mSelectedAccount.getFields())
                             : null);
         }
         mModel.set(
@@ -1204,14 +1183,12 @@
         Account oldSelectedAccount = mSelectedAccount;
         mSelectedAccount = buttonData.mAccount;
 
-        // If the account is a returning user or if the account is selected from UI which shows the
-        // disclosure text or if the browser doesn't need to request permission because the IDP
-        // prefers asking for permission by themselves, skip the disclosure UI and proceed to the
-        // verifying sheet.
+        // If the account is selected from UI which shows the disclosure text or
+        // if the browser doesn't need to request permission, skip the
+        // disclosure UI and proceed to the verifying sheet.
         if ((mRpMode == RpMode.PASSIVE && oldSelectedAccount != null)
-                || mSelectedAccount.isSignIn()
                 || mHeaderType == HeaderType.REQUEST_PERMISSION_MODAL
-                || mSelectedAccount.getIdentityProviderData().getDisclosureFields().length == 0) {
+                || mSelectedAccount.getFields().length == 0) {
             mDelegate.onAccountSelected(mSelectedAccount);
             showVerifySheet(mSelectedAccount);
             return;
diff --git a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/Account.java b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/Account.java
index 7d72ccb..4a59900 100644
--- a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/Account.java
+++ b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/Account.java
@@ -11,6 +11,7 @@
 
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
+import org.chromium.content.webid.IdentityRequestDialogDisclosureField;
 
 /**
  * This class holds the data used to represent a selectable account in the Account Selection sheet.
@@ -32,6 +33,7 @@
     private final boolean mIsSignIn;
     private final boolean mIsBrowserTrustedSignIn;
     private final boolean mIsFilteredOut;
+    private final @IdentityRequestDialogDisclosureField int[] mFields;
     private final IdentityProviderData mIdentityProviderData;
 
     /**
@@ -67,6 +69,7 @@
             boolean isSignIn,
             boolean isBrowserTrustedSignIn,
             boolean isFilteredOut,
+            @IdentityRequestDialogDisclosureField int[] fields,
             IdentityProviderData identityProviderData) {
         mId = id;
         mDisplayIdentifier = displayIdentifier;
@@ -78,6 +81,7 @@
         mIsSignIn = isSignIn;
         mIsBrowserTrustedSignIn = isBrowserTrustedSignIn;
         mIsFilteredOut = isFilteredOut;
+        mFields = fields;
         mIdentityProviderData = identityProviderData;
     }
 
@@ -121,6 +125,10 @@
         return mIsFilteredOut;
     }
 
+    public @IdentityRequestDialogDisclosureField int[] getFields() {
+        return mFields;
+    }
+
     public IdentityProviderData getIdentityProviderData() {
         return mIdentityProviderData;
     }
diff --git a/chrome/browser/ui/browser_window/browser_window_features.cc b/chrome/browser/ui/browser_window/browser_window_features.cc
index 7851ddc..57ce6469 100644
--- a/chrome/browser/ui/browser_window/browser_window_features.cc
+++ b/chrome/browser/ui/browser_window/browser_window_features.cc
@@ -472,6 +472,8 @@
 #if BUILDFLAG(IS_WIN)
   windows_taskbar_icon_updater_.reset();
 #endif
+
+  exclusive_access_manager_.reset();
 }
 
 SidePanelUI* BrowserWindowFeatures::side_panel_ui() {
diff --git a/chrome/browser/ui/extensions/extensions_overrides/simple_overrides_unittest.cc b/chrome/browser/ui/extensions/extensions_overrides/simple_overrides_unittest.cc
index 9e84c692..29d433672 100644
--- a/chrome/browser/ui/extensions/extensions_overrides/simple_overrides_unittest.cc
+++ b/chrome/browser/ui/extensions/extensions_overrides/simple_overrides_unittest.cc
@@ -73,7 +73,6 @@
     extensions::manifest_keys::kLinkedAppIcons,
     extensions::manifest_keys::kMIMETypes,
     extensions::manifest_keys::kMimeTypesHandler,
-    extensions::manifest_keys::kNaClModules,
     extensions::manifest_keys::kNativelyConnectable,
     extensions::manifest_keys::kOptionalHostPermissions,
     extensions::manifest_keys::kOptionalPermissions,
@@ -126,6 +125,7 @@
     // and thus not exposed in a .h).
     "chrome_url_overrides.activationmessage",
     "chrome_url_overrides.keyboard",
+    "nacl_modules",
     "oauth2.auto_approve",
     "platforms",
     "sandbox",
diff --git a/chrome/browser/ui/lens/BUILD.gn b/chrome/browser/ui/lens/BUILD.gn
index fb4bc70..dfdfdb51 100644
--- a/chrome/browser/ui/lens/BUILD.gn
+++ b/chrome/browser/ui/lens/BUILD.gn
@@ -31,7 +31,6 @@
     "lens_overlay_languages_controller.h",
     "lens_overlay_proto_converter.h",
     "lens_overlay_query_controller.h",
-    "lens_overlay_request_id_generator.h",
     "lens_overlay_side_panel_coordinator.h",
     "lens_overlay_side_panel_web_view.h",
     "lens_overlay_theme_utils.h",
@@ -91,7 +90,6 @@
     "lens_overlay_languages_controller.cc",
     "lens_overlay_proto_converter.cc",
     "lens_overlay_query_controller.cc",
-    "lens_overlay_request_id_generator.cc",
     "lens_overlay_side_panel_coordinator.cc",
     "lens_overlay_side_panel_navigation_throttle.cc",
     "lens_overlay_side_panel_web_view.cc",
@@ -323,7 +321,6 @@
     "lens_overlay_languages_controller_unittest.cc",
     "lens_overlay_proto_converter_unittest.cc",
     "lens_overlay_query_controller_unittest.cc",
-    "lens_overlay_request_id_generator_unittest.cc",
     "lens_overlay_side_panel_navigation_throttle_unittest.cc",
     "lens_overlay_url_builder_unittest.cc",
     "lens_url_matcher_unittest.cc",
diff --git a/chrome/browser/ui/lens/lens_overlay_query_controller.h b/chrome/browser/ui/lens/lens_overlay_query_controller.h
index 8d82550f..525d570 100644
--- a/chrome/browser/ui/lens/lens_overlay_query_controller.h
+++ b/chrome/browser/ui/lens/lens_overlay_query_controller.h
@@ -17,12 +17,12 @@
 #include "chrome/browser/lens/core/mojom/overlay_object.mojom.h"
 #include "chrome/browser/lens/core/mojom/text.mojom.h"
 #include "chrome/browser/ui/lens/lens_overlay_gen204_controller.h"
-#include "chrome/browser/ui/lens/lens_overlay_request_id_generator.h"
 #include "chrome/browser/ui/lens/lens_overlay_url_builder.h"
 #include "chrome/browser/ui/lens/ref_counted_lens_overlay_client_logs.h"
 #include "components/endpoint_fetcher/endpoint_fetcher.h"
 #include "components/lens/lens_overlay_invocation_source.h"
 #include "components/lens/lens_overlay_mime_type.h"
+#include "components/lens/lens_overlay_request_id_generator.h"
 #include "components/lens/proto/server/lens_overlay_response.pb.h"
 #include "services/network/public/cpp/simple_url_loader.h"
 #include "third_party/lens_server_proto/lens_overlay_client_context.pb.h"
diff --git a/chrome/browser/ui/omnibox/BUILD.gn b/chrome/browser/ui/omnibox/BUILD.gn
index ccefd5f..16e335f2 100644
--- a/chrome/browser/ui/omnibox/BUILD.gn
+++ b/chrome/browser/ui/omnibox/BUILD.gn
@@ -78,6 +78,7 @@
       "//chrome/app:command_ids",
       "//chrome/browser:browser_process",
       "//chrome/browser:primitives",
+      "//chrome/browser/autocomplete",
       "//chrome/browser/bitmap_fetcher",
       "//chrome/browser/extensions/api/omnibox",
       "//chrome/browser/favicon",
@@ -162,6 +163,7 @@
     deps = [
       ":omnibox",
       "//base/test:test_support",
+      "//chrome/browser/autocomplete",
       "//chrome/browser/profiles:profile",
       "//chrome/browser/search_engines",
       "//chrome/browser/ui/search",
@@ -193,6 +195,7 @@
       sources = [ "omnibox_metrics_browsertest.cc" ]
       deps = [
         "//base/test:test_support",
+        "//chrome/browser/autocomplete",
         "//chrome/browser/profiles:profile",
         "//chrome/browser/search_engines",
         "//chrome/browser/ui/search",
diff --git a/chrome/browser/ui/tabs/features.cc b/chrome/browser/ui/tabs/features.cc
index 221adc86..5d8e62db 100644
--- a/chrome/browser/ui/tabs/features.cc
+++ b/chrome/browser/ui/tabs/features.cc
@@ -10,6 +10,12 @@
 
 namespace tabs {
 
+// Enables the debug UI used to visualize the tab strip model.
+// chrome://tab-strip-internals
+BASE_FEATURE(kDebugUITabStrip,
+             "DebugUITabStrip",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // Splits pinned and unpinned tabs into separate TabStrips.
 // https://crbug.com/1346019
 BASE_FEATURE(kSplitTabStrip,
diff --git a/chrome/browser/ui/tabs/features.h b/chrome/browser/ui/tabs/features.h
index 475a46a..e843eb9 100644
--- a/chrome/browser/ui/tabs/features.h
+++ b/chrome/browser/ui/tabs/features.h
@@ -9,7 +9,9 @@
 
 namespace tabs {
 
-// TODO(346837232) move all flags to this file.
+// TODO(crbug.com/346837232): move all flags to this file.
+
+BASE_DECLARE_FEATURE(kDebugUITabStrip);
 
 BASE_DECLARE_FEATURE(kSplitTabStrip);
 
diff --git a/chrome/browser/ui/toolbar/chrome_labs/OWNERS b/chrome/browser/ui/toolbar/chrome_labs/OWNERS
new file mode 100644
index 0000000..a4a027a6
--- /dev/null
+++ b/chrome/browser/ui/toolbar/chrome_labs/OWNERS
@@ -0,0 +1 @@
+elainechien@chromium.org
diff --git a/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc b/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc
index 5ec5e407..633183ca 100644
--- a/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc
+++ b/chrome/browser/ui/views/accessibility/caption_bubble_controller_views_browsertest.cc
@@ -5,11 +5,14 @@
 #include "components/live_caption/views/caption_bubble_controller_views.h"
 
 #include <memory>
+#include <string>
+#include <vector>
 
 #include "base/functional/callback_forward.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/bind.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/scoped_mock_time_message_loop_task_runner.h"
 #include "build/build_config.h"
@@ -39,6 +42,8 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/events/keycodes/keyboard_codes.h"
+#include "ui/gfx/font.h"
+#include "ui/gfx/font_list.h"
 #include "ui/views/accessibility/ax_virtual_view.h"
 #include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/controls/button/image_button.h"
@@ -174,6 +179,12 @@
                        : nullptr;
   }
 
+  void SetNewFontListGetter(
+      CaptionBubble::NewFontListGetter new_font_list_getter) {
+    GetController()->caption_bubble_->SetNewFontListGetterForTesting(
+        std::move(new_font_list_getter));
+  }
+
   views::Label* GetTitle() {
     return controller_ ? controller_->caption_bubble_->title_.get() : nullptr;
   }
@@ -837,6 +848,29 @@
 }
 
 IN_PROC_BROWSER_TEST_P(CaptionBubbleControllerViewsTest,
+                       FontFamilyArabicFallback) {
+#if BUILDFLAG(IS_CHROMEOS)
+  constexpr size_t kExpectedSize = 4;
+#else
+  constexpr size_t kExpectedSize = 3;
+#endif
+  std::vector<std::string> fonts;
+  SetNewFontListGetter(base::BindLambdaForTesting(
+      [&fonts](const std::vector<std::string>& font_names, int font_style,
+               int font_size, gfx::Font::Weight font_weight) -> gfx::FontList {
+        fonts = font_names;
+        return gfx::FontList(font_names, font_style, font_size, font_weight);
+      }));
+  ui::CaptionStyle caption_style;
+  caption_style.font_family = "";
+  GetController()->UpdateCaptionStyle(caption_style);
+  ASSERT_EQ(kExpectedSize, fonts.size());
+#if BUILDFLAG(IS_CHROMEOS)
+  EXPECT_EQ("Noto Sans Arabic UI", fonts[3]);
+#endif
+}
+
+IN_PROC_BROWSER_TEST_P(CaptionBubbleControllerViewsTest,
                        UpdateCaptionStyleTextColor) {
   browser()->profile()->GetPrefs()->SetBoolean(prefs::kLiveTranslateEnabled,
                                                true);
diff --git a/chrome/browser/ui/views/autofill/payments/filled_card_information_bubble_views_interactive_uitest.cc b/chrome/browser/ui/views/autofill/payments/filled_card_information_bubble_views_interactive_uitest.cc
index 8f15b08b..97b185df 100644
--- a/chrome/browser/ui/views/autofill/payments/filled_card_information_bubble_views_interactive_uitest.cc
+++ b/chrome/browser/ui/views/autofill/payments/filled_card_information_bubble_views_interactive_uitest.cc
@@ -68,8 +68,7 @@
  private:
   // views::ViewObserver:
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override {
+                               views::View* starting_view) override {
     if (expected_visible_ == observed_view->GetVisible()) {
       run_loop_.Quit();
     }
diff --git a/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller.cc b/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller.cc
index c81cd4c..7342830 100644
--- a/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller.cc
+++ b/chrome/browser/ui/views/download/bubble/download_toolbar_ui_controller.cc
@@ -796,8 +796,8 @@
 // browser becomes active, so that clicking outside the bubble will deactivate
 // and close it.
 void DownloadToolbarUIController::OnBrowserSetLastActive(Browser* browser) {
-  if (browser == browser_view_->browser() && bubble_delegate_ &&
-      !bubble_delegate_->GetWidget()->IsClosed()) {
+  if (browser_view_ && browser == browser_view_->browser() &&
+      bubble_delegate_ && !bubble_delegate_->GetWidget()->IsClosed()) {
     // We need to defer activating the download bubble when the browser window
     // is being activated, otherwise this is ineffective on macOS.
     content::GetUIThreadTaskRunner()->PostTask(
diff --git a/chrome/browser/ui/views/frame/browser_frame.cc b/chrome/browser/ui/views/frame/browser_frame.cc
index 0228bd9f..9e8be2b2 100644
--- a/chrome/browser/ui/views/frame/browser_frame.cc
+++ b/chrome/browser/ui/views/frame/browser_frame.cc
@@ -63,6 +63,16 @@
 #endif
 
 namespace {
+#if BUILDFLAG(IS_MAC)
+// Keep in sync with web_app_frame_toolbar_browsertest.cc
+constexpr double kTitlePaddingWidthFraction = 0.1;
+#endif
+
+#if BUILDFLAG(IS_LINUX)
+// These values are used for Linux/GTK.
+constexpr int kIconTitleSpacing = 4;
+constexpr int kCaptionSpacing = 5;
+#endif
 
 // Helper to track whether a ThemeChange event has been received by the widget.
 class ThemeChangedObserver : public views::WidgetObserver {
@@ -222,11 +232,63 @@
 void BrowserFrame::LayoutWebAppWindowTitle(
     const gfx::Rect& available_space,
     views::Label& window_title_label) const {
-  // This can be invoked before |browser_frame_view_| has been set.
-  if (browser_frame_view_) {
-    browser_frame_view_->LayoutWebAppWindowTitle(available_space,
-                                                 window_title_label);
+  if (!browser_frame_view_) {
+    return;
   }
+
+  if (browser_frame_view_->browser_view() &&
+      browser_frame_view_->browser_view()->GetIsPictureInPictureType()) {
+    // Do nothing for picture in picture browsers.
+    return;
+  }
+
+#if BUILDFLAG(IS_CHROMEOS)
+  // No window titles on Chrome OS, so just hide the window title.
+  window_title_label.SetVisible(false);
+#elif BUILDFLAG(IS_MAC)
+  gfx::Rect toolbar_bounds(0, 0, browser_frame_view_->width(),
+                           available_space.height());
+  gfx::Rect title_bounds = available_space;
+
+  const int title_padding = base::ClampRound(browser_frame_view_->width() *
+                                             kTitlePaddingWidthFraction);
+  title_bounds.Inset(gfx::Insets::VH(0, title_padding));
+
+  // Center in the container and make it fit in the available space.
+  int preferred_title_width =
+      window_title_label
+          .GetPreferredSize(views::SizeBounds(window_title_label.width(), {}))
+          .width();
+  toolbar_bounds.ClampToCenteredSize(
+      gfx::Size(preferred_title_width, toolbar_bounds.height()));
+  toolbar_bounds.AdjustToFit(title_bounds);
+
+  window_title_label.SetBoundsRect(toolbar_bounds);
+  // The background of the title area is always opaquely drawn, but when in
+  // immersive fullscreen, it is drawn in a way that isn't detected by the
+  // DCHECK in Label. As such, disable the DCHECK.
+  window_title_label.SetSkipSubpixelRenderingOpacityCheck(
+      browser_view_->IsImmersiveModeEnabled());
+#elif BUILDFLAG(IS_WIN)
+  gfx::Rect bounds = available_space;
+  // If nothing has been added to the left, match native Windows 10 UWP apps
+  // that don't have window icons.
+  // TODO(crbug.com/40890502): Avoid hardcoding sizes like this.
+  constexpr int kMinimumTitleLeftBorderMargin = 11;
+  if (bounds.x() < kMinimumTitleLeftBorderMargin) {
+    bounds.SetHorizontalBounds(kMinimumTitleLeftBorderMargin, bounds.right());
+  }
+  window_title_label.SetSubpixelRenderingEnabled(false);
+  window_title_label.SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  window_title_label.SetAutoColorReadabilityEnabled(false);
+  window_title_label.SetBoundsRect(bounds);
+#else
+  gfx::Rect bounds = available_space;
+  bounds.Inset(gfx::Insets::TLBR(0, kIconTitleSpacing, 0, kCaptionSpacing));
+  window_title_label.SetSubpixelRenderingEnabled(false);
+  window_title_label.SetHorizontalAlignment(gfx::ALIGN_LEFT);
+  window_title_label.SetBoundsRect(bounds);
+#endif
 }
 
 int BrowserFrame::GetTopInset() const {
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_win.cc b/chrome/browser/ui/views/frame/browser_frame_view_win.cc
index 152ca20..6acfbf0 100644
--- a/chrome/browser/ui/views/frame/browser_frame_view_win.cc
+++ b/chrome/browser/ui/views/frame/browser_frame_view_win.cc
@@ -177,23 +177,6 @@
                    caption_button_container_->size().height());
 }
 
-void BrowserFrameViewWin::LayoutWebAppWindowTitle(
-    const gfx::Rect& available_space,
-    views::Label& window_title_label) const {
-  gfx::Rect bounds = available_space;
-  // If nothing has been added to the left, match native Windows 10 UWP apps
-  // that don't have window icons.
-  // TODO(crbug.com/40890502): Avoid hardcoding sizes like this.
-  constexpr int kMinimumTitleLeftBorderMargin = 11;
-  if (bounds.x() < kMinimumTitleLeftBorderMargin) {
-    bounds.SetHorizontalBounds(kMinimumTitleLeftBorderMargin, bounds.right());
-  }
-  window_title_label.SetSubpixelRenderingEnabled(false);
-  window_title_label.SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  window_title_label.SetAutoColorReadabilityEnabled(false);
-  window_title_label.SetBoundsRect(bounds);
-}
-
 int BrowserFrameViewWin::GetTopInset(bool restored) const {
   if (browser_view()->GetTabStripVisible() || IsWebUITabStrip()) {
     return TopAreaHeight(restored);
@@ -807,7 +790,7 @@
   if (show_title && window_title_) {
     window_title_->SetText(browser_view()->GetWindowTitle());
     const int max_text_width = std::max(0, next_trailing_x - next_leading_x);
-    LayoutWebAppWindowTitle(
+    frame()->LayoutWebAppWindowTitle(
         gfx::Rect(next_leading_x, window_icon_bounds.y(), max_text_width,
                   window_icon_bounds.height()),
         *window_title_);
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_win.h b/chrome/browser/ui/views/frame/browser_frame_view_win.h
index 5752dd337..51b86ba 100644
--- a/chrome/browser/ui/views/frame/browser_frame_view_win.h
+++ b/chrome/browser/ui/views/frame/browser_frame_view_win.h
@@ -36,8 +36,6 @@
       const gfx::Size& tabstrip_minimum_size) const override;
   gfx::Rect GetBoundsForWebAppFrameToolbar(
       const gfx::Size& toolbar_preferred_size) const override;
-  void LayoutWebAppWindowTitle(const gfx::Rect& available_space,
-                               views::Label& window_title_label) const override;
   int GetTopInset(bool restored) const override;
   bool HasVisibleBackgroundTabShapes(
       BrowserFrameActiveState active_state) const override;
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view.h
index 09a9110..f4657d5 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view.h
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view.h
@@ -78,13 +78,6 @@
   virtual gfx::Rect GetBoundsForWebAppFrameToolbar(
       const gfx::Size& toolbar_preferred_size) const = 0;
 
-  // Lays out the window title for a web app within the given available space.
-  // This method doesn't just return bounds; it may also modify properties of
-  // the label itself, such as text alignment, based on the implementation.
-  virtual void LayoutWebAppWindowTitle(
-      const gfx::Rect& available_space,
-      views::Label& window_title_label) const = 0;
-
   // Returns the inset from the top of the window to the top of the client
   // view. For a tabbed browser, this is the space occupied by the tab strip.
   // For popup windows, this is the toolbar. For app windows, this is the
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc
index 3e2247ec..6ff30014 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.cc
@@ -280,13 +280,6 @@
   return gfx::Rect(x, 0, std::max(0, available_width), painted_height);
 }
 
-void BrowserNonClientFrameViewChromeOS::LayoutWebAppWindowTitle(
-    const gfx::Rect& available_space,
-    views::Label& window_title_label) const {
-  // No window titles on Chrome OS, so just hide the window title.
-  window_title_label.SetVisible(false);
-}
-
 int BrowserNonClientFrameViewChromeOS::GetTopInset(bool restored) const {
   // TODO(estade): why do callsites in this class hardcode false for |restored|?
 
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.h
index 9893271..c56c625a 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.h
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_chromeos.h
@@ -62,8 +62,6 @@
       const gfx::Size& tabstrip_minimum_size) const override;
   gfx::Rect GetBoundsForWebAppFrameToolbar(
       const gfx::Size& toolbar_preferred_size) const override;
-  void LayoutWebAppWindowTitle(const gfx::Rect& available_space,
-                               views::Label& window_title_label) const override;
   int GetTopInset(bool restored) const override;
   void UpdateThrobber(bool running) override;
   bool CanUserExitFullscreen() const override;
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.h
index 263261b..bd75700 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.h
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.h
@@ -20,10 +20,6 @@
 class OneShotTimer;
 }
 
-namespace views {
-class Label;
-}
-
 namespace remote_cocoa::mojom {
 enum class ToolbarVisibilityStyle;
 }
@@ -51,8 +47,6 @@
       const gfx::Size& tabstrip_minimum_size) const override;
   gfx::Rect GetBoundsForWebAppFrameToolbar(
       const gfx::Size& toolbar_preferred_size) const override;
-  void LayoutWebAppWindowTitle(const gfx::Rect& available_space,
-                               views::Label& window_title_label) const override;
   int GetTopInset(bool restored) const override;
   void UpdateFullscreenTopUI() override;
   bool ShouldHideTopUIForFullscreen() const override;
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.mm b/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.mm
index f69dd8c..be55f60 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.mm
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_mac.mm
@@ -47,9 +47,6 @@
 
 namespace {
 
-// Keep in sync with web_app_frame_toolbar_browsertest.cc
-constexpr double kTitlePaddingWidthFraction = 0.1;
-
 // Empirical measurements of the traffic lights.
 constexpr int kCaptionButtonsWidth = 52;
 constexpr int kCaptionButtonsLeadingPadding = 20;
@@ -204,26 +201,6 @@
   return bounds;
 }
 
-void BrowserNonClientFrameViewMac::LayoutWebAppWindowTitle(
-    const gfx::Rect& available_space,
-    views::Label& window_title_label) const {
-  gfx::Rect toolbar_bounds(0, 0, width(), available_space.height());
-  gfx::Rect title_bounds = available_space;
-  const int title_padding =
-      base::ClampRound(width() * kTitlePaddingWidthFraction);
-  title_bounds.Inset(gfx::Insets::VH(0, title_padding));
-  window_title_label.SetBoundsRect(GetCenteredTitleBounds(
-      toolbar_bounds, title_bounds,
-      window_title_label
-          .GetPreferredSize(views::SizeBounds(window_title_label.width(), {}))
-          .width()));
-  // The background of the title area is always opaquely drawn, but when in
-  // immersive fullscreen, it is drawn in a way that isn't detected by the
-  // DCHECK in Label. As such, disable the DCHECK.
-  window_title_label.SetSkipSubpixelRenderingOpacityCheck(
-      browser_view()->IsImmersiveModeEnabled());
-}
-
 int BrowserNonClientFrameViewMac::GetTopInset(bool restored) const {
   return 0;
 }
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index deda6e0..8f809545 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -780,13 +780,6 @@
     return gfx::ToEnclosingRect(bounds_f);
   }
 
-  void LayoutWebAppWindowTitle(
-      const gfx::Rect& available_space,
-      views::Label& window_title_label) const override {
-    browser_view_->frame()->LayoutWebAppWindowTitle(available_space,
-                                                    window_title_label);
-  }
-
   int GetTopInsetInBrowserView() const override {
     // BrowserView should fill the full window when window controls overlay
     // is enabled or when immersive fullscreen with tabs is enabled.
diff --git a/chrome/browser/ui/views/frame/browser_view_layout.cc b/chrome/browser/ui/views/frame/browser_view_layout.cc
index 2201ff3..fb2d7b8 100644
--- a/chrome/browser/ui/views/frame/browser_view_layout.cc
+++ b/chrome/browser/ui/views/frame/browser_view_layout.cc
@@ -494,8 +494,8 @@
     if (delegate_->ShouldDrawTabStrip()) {
       web_app_window_title_->SetVisible(false);
     } else {
-      delegate_->LayoutWebAppWindowTitle(window_title_bounds,
-                                         *web_app_window_title_);
+      browser_view_->frame()->LayoutWebAppWindowTitle(window_title_bounds,
+                                                      *web_app_window_title_);
     }
   }
 
diff --git a/chrome/browser/ui/views/frame/browser_view_layout_delegate.h b/chrome/browser/ui/views/frame/browser_view_layout_delegate.h
index fcd9e8285..aa1d3a7 100644
--- a/chrome/browser/ui/views/frame/browser_view_layout_delegate.h
+++ b/chrome/browser/ui/views/frame/browser_view_layout_delegate.h
@@ -24,9 +24,6 @@
   virtual bool GetBorderlessModeEnabled() const = 0;
   virtual gfx::Rect GetBoundsForTabStripRegionInBrowserView() const = 0;
   virtual gfx::Rect GetBoundsForWebAppFrameToolbarInBrowserView() const = 0;
-  virtual void LayoutWebAppWindowTitle(
-      const gfx::Rect& available_space,
-      views::Label& window_title_label) const = 0;
   virtual int GetTopInsetInBrowserView() const = 0;
   virtual bool IsToolbarVisible() const = 0;
   virtual bool IsBookmarkBarVisible() const = 0;
diff --git a/chrome/browser/ui/views/frame/browser_view_layout_unittest.cc b/chrome/browser/ui/views/frame/browser_view_layout_unittest.cc
index 5a7167e..a4ae7249 100644
--- a/chrome/browser/ui/views/frame/browser_view_layout_unittest.cc
+++ b/chrome/browser/ui/views/frame/browser_view_layout_unittest.cc
@@ -65,9 +65,6 @@
   gfx::Rect GetBoundsForWebAppFrameToolbarInBrowserView() const override {
     return gfx::Rect();
   }
-  void LayoutWebAppWindowTitle(
-      const gfx::Rect& available_space,
-      views::Label& window_title_label) const override {}
   int GetTopInsetInBrowserView() const override { return 0; }
   bool IsToolbarVisible() const override { return toolbar_visible_; }
   bool IsBookmarkBarVisible() const override { return bookmark_bar_visible_; }
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
index 623caeb0..3e64d5d 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
@@ -252,12 +252,6 @@
   return layout_->GetBoundsForWebAppFrameToolbar(toolbar_preferred_size);
 }
 
-void OpaqueBrowserFrameView::LayoutWebAppWindowTitle(
-    const gfx::Rect& available_space,
-    views::Label& window_title_label) const {
-  layout_->LayoutWebAppWindowTitle(available_space, window_title_label);
-}
-
 int OpaqueBrowserFrameView::GetTopInset(bool restored) const {
   return layout_->NonClientTopHeight(restored);
 }
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.h b/chrome/browser/ui/views/frame/opaque_browser_frame_view.h
index daec983..397f635 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.h
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.h
@@ -62,8 +62,6 @@
       const gfx::Size& tabstrip_minimum_size) const override;
   gfx::Rect GetBoundsForWebAppFrameToolbar(
       const gfx::Size& toolbar_preferred_size) const override;
-  void LayoutWebAppWindowTitle(const gfx::Rect& available_space,
-                               views::Label& window_title_label) const override;
   int GetTopInset(bool restored) const override;
   void UpdateThrobber(bool running) override;
   void WindowControlsOverlayEnabledChanged() override;
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc
index b934102..1da1480 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc
@@ -100,16 +100,6 @@
                        kContentEdgeShadowThickness);
 }
 
-void OpaqueBrowserFrameViewLayout::LayoutWebAppWindowTitle(
-    const gfx::Rect& available_space,
-    views::Label& window_title_label) const {
-  gfx::Rect bounds = available_space;
-  bounds.Inset(gfx::Insets::TLBR(0, kIconTitleSpacing, 0, kCaptionSpacing));
-  window_title_label.SetSubpixelRenderingEnabled(false);
-  window_title_label.SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  window_title_label.SetBoundsRect(bounds);
-}
-
 gfx::Size OpaqueBrowserFrameViewLayout::GetMinimumSize(
     const views::View* host) const {
   // Ensure that we can fit the main browser view.
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h
index a280652..2eb1af0f 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.h
@@ -67,8 +67,6 @@
                                        int total_width) const;
   gfx::Rect GetBoundsForWebAppFrameToolbar(
       const gfx::Size& toolbar_preferred_size) const;
-  void LayoutWebAppWindowTitle(const gfx::Rect& available_space,
-                               views::Label& window_title_label) const;
 
   // Returns the bounds of the window required to display the content area at
   // the specified bounds.
diff --git a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc
index 07e57aa..11b9de59 100644
--- a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc
+++ b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc
@@ -634,10 +634,6 @@
   return gfx::Rect();
 }
 
-void PictureInPictureBrowserFrameView::LayoutWebAppWindowTitle(
-    const gfx::Rect& available_space,
-    views::Label& window_title_label) const {}
-
 int PictureInPictureBrowserFrameView::GetTopInset(bool restored) const {
   return GetTopAreaHeight();
 }
@@ -863,6 +859,20 @@
   GetWidget()->SetColorModeOverride(ui::ColorProviderKey::ColorMode::kDark,
                                     /*background_color=*/std::nullopt);
 
+// Fade in animation is disabled for Document and Video Picture-in-Picture on
+// Windows. On Windows, resizable windows can not be translucent. See
+// crbug.com/425711450.
+#if !BUILDFLAG(IS_WIN)
+  if (base::FeatureList::IsEnabled(
+          media::kPictureInPictureShowWindowAnimation)) {
+    if (!fade_animator_) {
+      fade_animator_ = std::make_unique<PictureInPictureWidgetFadeAnimator>();
+    }
+    fade_animator_->AnimateShowWindow(
+        GetWidget(), PictureInPictureWidgetFadeAnimator::WidgetShowType::kNone);
+  }
+#endif
+
   // If the AutoPiP setting overlay is set, then post a task to show it.  Don't
   // do this here, since not all observers might have found out about the new
   // widget yet.  Specifically, on cros, the BrowserViewAsh immediately does a
@@ -899,6 +909,10 @@
     auto_pip_setting_overlay_ = nullptr;
   }
 
+  if (fade_animator_) {
+    fade_animator_->CancelAndReset();
+  }
+
   PictureInPictureWindowManager::GetInstance()->OnPictureInPictureWindowHidden(
       this);
   tucker_.reset();
@@ -1449,6 +1463,11 @@
   return window_title_;
 }
 
+PictureInPictureWidgetFadeAnimator*
+PictureInPictureBrowserFrameView::GetFadeAnimatorForTesting() {
+  return fade_animator_.get();
+}
+
 void PictureInPictureBrowserFrameView::OnMouseEnteredOrExitedWindow(
     bool entered) {
   mouse_inside_window_ = entered;
diff --git a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.h b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.h
index b985ac4..c970616 100644
--- a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.h
+++ b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.h
@@ -14,6 +14,7 @@
 #include "base/scoped_observation.h"
 #include "base/timer/timer.h"
 #include "build/build_config.h"
+#include "chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator.h"
 #include "chrome/browser/picture_in_picture/picture_in_picture_window.h"
 #include "chrome/browser/ui/content_settings/content_setting_image_model_states.h"
 #include "chrome/browser/ui/toolbar/chrome_location_bar_model_delegate.h"
@@ -70,8 +71,6 @@
       const gfx::Size& tabstrip_minimum_size) const override;
   gfx::Rect GetBoundsForWebAppFrameToolbar(
       const gfx::Size& toolbar_preferred_size) const override;
-  void LayoutWebAppWindowTitle(const gfx::Rect& available_space,
-                               views::Label& window_title_label) const override;
   int GetTopInset(bool restored) const override;
   void OnBrowserViewInitViewsComplete() override;
   void UpdateThrobber(bool running) override {}
@@ -187,6 +186,7 @@
   views::View* GetBackToTabButtonForTesting();
   views::View* GetCloseButtonForTesting();
   views::Label* GetWindowTitleForTesting();
+  PictureInPictureWidgetFadeAnimator* GetFadeAnimatorForTesting();
 
   // These values are persisted to logs. Entries should not be renumbered and
   // numeric values should never be reused.
@@ -390,6 +390,9 @@
   std::unique_ptr<PictureInPictureBoundsChangeAnimation>
       bounds_change_animation_;
 
+  // Used to animate the Picture-in-Picture window creation.
+  std::unique_ptr<PictureInPictureWidgetFadeAnimator> fade_animator_;
+
   // Used to tuck/untuck this widget into the side of the screen.
   std::unique_ptr<PictureInPictureTucker> tucker_;
   bool is_tucking_forced_ = false;
diff --git a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view_interactive_uitest.cc b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view_interactive_uitest.cc
index bdd75cd..6f0b0b53 100644
--- a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view_interactive_uitest.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/media/webrtc/webrtc_browsertest_base.h"
 #include "chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper.h"
 #include "chrome/browser/picture_in_picture/picture_in_picture_occlusion_tracker.h"
+#include "chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator.h"
 #include "chrome/browser/picture_in_picture/picture_in_picture_window_manager.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_window.h"
@@ -33,6 +34,7 @@
 #include "ui/compositor/layer.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/gfx/animation/animation_test_api.h"
+#include "ui/views/animation/widget_fade_animator.h"
 #include "ui/views/widget/widget_utils.h"
 
 #if BUILDFLAG(IS_LINUX)
@@ -152,7 +154,8 @@
   void SetUp() override {
     scoped_feature_list_.InitWithFeatures(
         /*enabled_features=*/{blink::features::kDocumentPictureInPictureAPI,
-                              media::kPictureInPictureOcclusionTracking},
+                              media::kPictureInPictureOcclusionTracking,
+                              media::kPictureInPictureShowWindowAnimation},
         /*disabled_features=*/{});
     InProcessBrowserTest::SetUp();
   }
@@ -743,6 +746,20 @@
   EXPECT_NE(nullptr, pip_frame_view()->GetBackToTabButtonForTesting());
 }
 
+#if !BUILDFLAG(IS_WIN)
+IN_PROC_BROWSER_TEST_F(PictureInPictureBrowserFrameViewTest,
+                       FadeInAnimationIsUsedOnWindowShow) {
+  // Set up document PiP.
+  ASSERT_NO_FATAL_FAILURE(SetUpDocumentPIP());
+
+  // Get the PiP fade animator and verify the expected fade in calls count.
+  PictureInPictureWidgetFadeAnimator* pip_fade_animator =
+      pip_frame_view()->GetFadeAnimatorForTesting();
+  EXPECT_NE(nullptr, pip_fade_animator);
+  EXPECT_EQ(1, pip_fade_animator->GetFadeInCallsCountForTesting());
+}
+#endif
+
 IN_PROC_BROWSER_TEST_P(PictureInPictureBrowserFrameViewTest,
                        TestAnimationTiming) {
   const AnimationTimingTestCase& test_case = GetParam();
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_view_controller.cc b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_view_controller.cc
index 0ba3a6b..8e58576 100644
--- a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_view_controller.cc
+++ b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_bubble_view_controller.cc
@@ -272,8 +272,13 @@
 }
 
 void CookieControlsBubbleViewController::OnReloadingUiTimeout() {
-  base::RecordAction(
-      base::UserMetricsAction("CookieControls.Bubble.ReloadingTimeout"));
+  if (privacy_sandbox::IsTrackingProtectionsUi(controls_state_)) {
+    base::RecordAction(
+        base::UserMetricsAction("TrackingProtections.Bubble.ReloadingTimeout"));
+  } else {
+    base::RecordAction(
+        base::UserMetricsAction("CookieControls.Bubble.ReloadingTimeout"));
+  }
   CloseBubble();
 }
 
@@ -291,26 +296,26 @@
       bubble_view_->RegisterOnUserTriggeredReloadingActionCallback(
           base::BindRepeating(&CookieControlsBubbleViewController::
                                   OnUserTriggeredReloadingAction,
-                              base::Unretained(this)));
+                              weak_factory_.GetWeakPtr()));
 
   toggle_button_callback_ =
       bubble_view_->GetContentView()->RegisterToggleButtonPressedCallback(
           base::BindRepeating(
               &CookieControlsBubbleViewController::OnToggleButtonPressed,
-              base::Unretained(this)));
+              weak_factory_.GetWeakPtr()));
 
   tracking_protections_button_callback_ =
       bubble_view_->GetContentView()
           ->RegisterTrackingProtectionsButtonPressedCallback(
               base::BindRepeating(&CookieControlsBubbleViewController::
                                       OnTrackingProtectionsButtonPressed,
-                                  base::Unretained(this)));
+                                  weak_factory_.GetWeakPtr()));
 
   feedback_button_callback_ =
       bubble_view_->GetContentView()->RegisterFeedbackButtonPressedCallback(
           base::BindRepeating(
               &CookieControlsBubbleViewController::OnFeedbackButtonPressed,
-              base::Unretained(this)));
+              weak_factory_.GetWeakPtr()));
 }
 
 void CookieControlsBubbleViewController::OnToggleButtonPressed(
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_interactive_uitest.cc b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_interactive_uitest.cc
index 6004d6b..a7bb29a 100644
--- a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_interactive_uitest.cc
+++ b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_interactive_uitest.cc
@@ -60,6 +60,8 @@
 const char kUMABubbleReloadingShown[] = "CookieControls.Bubble.ReloadingShown";
 const char kUMABubbleReloadingTimeout[] =
     "CookieControls.Bubble.ReloadingTimeout";
+const char kUMATrackingProtectionsBubbleReloadingTimeout[] =
+    "TrackingProtections.Bubble.ReloadingTimeout";
 }  // namespace
 
 class CookieControlsInteractiveTestBase : public InteractiveFeaturePromoTest {
@@ -563,6 +565,9 @@
   EXPECT_EQ(user_actions_.GetActionCount(kUMABubbleAllowThirdPartyCookies), 1);
   EXPECT_EQ(user_actions_.GetActionCount(kUMABubbleBlockThirdPartyCookies), 0);
   EXPECT_EQ(user_actions_.GetActionCount(kUMABubbleReloadingTimeout), 1);
+  EXPECT_EQ(user_actions_.GetActionCount(
+                kUMATrackingProtectionsBubbleReloadingTimeout),
+            0);
   EXPECT_EQ(user_actions_.GetActionCount(kUMABubbleReloadingShown), 1);
 }
 
@@ -899,6 +904,9 @@
             WaitForHide(CookieControlsBubbleView::kCookieControlsBubble))));
   // Ensure that the reloading timeout doesn't execute when page reloads faster
   // than the timeout window.
+  EXPECT_EQ(user_actions_.GetActionCount(
+                kUMATrackingProtectionsBubbleReloadingTimeout),
+            0);
   EXPECT_EQ(user_actions_.GetActionCount(kUMABubbleReloadingTimeout), 0);
 }
 
@@ -925,6 +933,9 @@
             WaitForHide(CookieControlsBubbleView::kCookieControlsBubble))));
   // Ensure that the reloading timeout doesn't execute when page reloads faster
   // than the timeout window.
+  EXPECT_EQ(user_actions_.GetActionCount(
+                kUMATrackingProtectionsBubbleReloadingTimeout),
+            0);
   EXPECT_EQ(user_actions_.GetActionCount(kUMABubbleReloadingTimeout), 0);
 }
 
@@ -954,5 +965,8 @@
             PressButton(CookieControlsContentView::kTrackingProtectionsButton),
             EnsureNotPresent(CookieControlsBubbleView::kReloadingView),
             WaitForHide(CookieControlsBubbleView::kCookieControlsBubble))));
-  EXPECT_EQ(user_actions_.GetActionCount(kUMABubbleReloadingTimeout), 1);
+  EXPECT_EQ(user_actions_.GetActionCount(
+                kUMATrackingProtectionsBubbleReloadingTimeout),
+            1);
+  EXPECT_EQ(user_actions_.GetActionCount(kUMABubbleReloadingTimeout), 0);
 }
diff --git a/chrome/browser/ui/views/location_bar/lens_overlay_homework_page_action_icon_view_interactive_uitest.cc b/chrome/browser/ui/views/location_bar/lens_overlay_homework_page_action_icon_view_interactive_uitest.cc
index ee1d6395..ff036ba 100644
--- a/chrome/browser/ui/views/location_bar/lens_overlay_homework_page_action_icon_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/location_bar/lens_overlay_homework_page_action_icon_view_interactive_uitest.cc
@@ -61,8 +61,7 @@
  private:
   // views::ViewObserver:
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override {
+                               views::View* starting_view) override {
     if (expected_visible_ == observed_view->GetVisible()) {
       run_loop_.Quit();
     }
diff --git a/chrome/browser/ui/views/media_preview/mic_preview/audio_stream_coordinator_unittest.cc b/chrome/browser/ui/views/media_preview/mic_preview/audio_stream_coordinator_browsertest.cc
similarity index 68%
rename from chrome/browser/ui/views/media_preview/mic_preview/audio_stream_coordinator_unittest.cc
rename to chrome/browser/ui/views/media_preview/mic_preview/audio_stream_coordinator_browsertest.cc
index 61b0d30..ad79cb0 100644
--- a/chrome/browser/ui/views/media_preview/mic_preview/audio_stream_coordinator_unittest.cc
+++ b/chrome/browser/ui/views/media_preview/mic_preview/audio_stream_coordinator_browsertest.cc
@@ -6,16 +6,22 @@
 
 #include <memory>
 
+#include "base/functional/callback_forward.h"
 #include "base/functional/callback_helpers.h"
 #include "base/run_loop.h"
+#include "base/task/current_thread.h"
+#include "base/test/bind.h"
 #include "base/test/mock_callback.h"
-#include "chrome/browser/ui/views/frame/test_with_browser_view.h"
 #include "chrome/browser/ui/views/media_preview/media_preview_metrics.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/test/browser_test.h"
 #include "media/base/audio_glitch_info.h"
 #include "media/base/audio_parameters.h"
+#include "media/mojo/mojom/audio_data_pipe.mojom.h"
 #include "services/audio/public/cpp/fake_stream_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/views/view.h"
 
 class MockStreamFactory : public audio::FakeStreamFactory {
  public:
@@ -30,22 +36,21 @@
       bool enable_agc,
       media::mojom::AudioProcessingConfigPtr processing_config,
       CreateInputStreamCallback callback) override {
-    last_created_callback_ = std::move(callback);
-    run_loop_.Quit();
+    std::move(callback).Run(media::mojom::ReadWriteAudioDataPipePtr(), false,
+                            std::nullopt);
+    run_loop.Quit();
   }
 
-  void RunLoop() { run_loop_.Run(); }
+  void WaitToCreateInputStream() { run_loop.Run(); }
 
  private:
-  base::RunLoop run_loop_;
-  // Keeps the `last_created_callback_` alive during test.
-  CreateInputStreamCallback last_created_callback_;
+  base::RunLoop run_loop;
 };
 
-class AudioStreamCoordinatorTest : public TestWithBrowserView {
+class AudioStreamCoordinatorTest : public InProcessBrowserTest {
  protected:
-  void SetUp() override {
-    TestWithBrowserView::SetUp();
+  void SetUpOnMainThread() override {
+    InProcessBrowserTest::SetUpOnMainThread();
     parent_view_ = std::make_unique<views::View>();
     coordinator_ = std::make_unique<AudioStreamCoordinator>(
         *parent_view_, media_preview_metrics::Context(
@@ -53,30 +58,33 @@
                            media_preview_metrics::PreviewType::kMic,
                            media_preview_metrics::PromptType::kSingle,
                            /*request=*/nullptr));
+    fake_stream_factory_ = std::make_unique<MockStreamFactory>();
   }
 
-  void TearDown() override {
+  void TearDownOnMainThread() override {
     coordinator_.reset();
     parent_view_.reset();
-    TestWithBrowserView::TearDown();
+    fake_stream_factory_.reset();
+    InProcessBrowserTest::TearDownOnMainThread();
   }
 
   std::unique_ptr<views::View> parent_view_;
   std::unique_ptr<AudioStreamCoordinator> coordinator_;
-
-  MockStreamFactory fake_stream_factory_;
+  std::unique_ptr<MockStreamFactory> fake_stream_factory_;
 };
 
-TEST_F(AudioStreamCoordinatorTest, ConnectToAudioCapturerAndReceiveBuses) {
+IN_PROC_BROWSER_TEST_F(AudioStreamCoordinatorTest,
+                       ConnectToAudioCapturerAndReceiveBuses) {
   constexpr uint32_t kAudioBusesNumber = 9;  // some arbitrary number
+
   base::MockCallback<base::RepeatingClosure> callback;
   EXPECT_CALL(callback, Run()).Times(kAudioBusesNumber);
   coordinator_->SetAudioBusReceivedCallbackForTest(callback.Get());
 
   const uint32_t kSampleRate = 33000;
-  coordinator_->ConnectToDevice(fake_stream_factory_.MakeRemote(), "device_id",
+  coordinator_->ConnectToDevice(fake_stream_factory_->MakeRemote(), "device_id",
                                 kSampleRate);
-  fake_stream_factory_.RunLoop();
+  fake_stream_factory_->WaitToCreateInputStream();
 
   std::unique_ptr<::media::AudioBus> audio_bus = media::AudioBus::Create(
       {media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
@@ -90,5 +98,7 @@
         /*glitch_info=*/{},
         /*volume=*/1.0);
   }
-  base::RunLoop().RunUntilIdle();
+
+  EXPECT_TRUE(base::test::RunUntil(
+      [&]() { return testing::Mock::VerifyAndClear(&callback); }));
 }
diff --git a/chrome/browser/ui/views/overlay/video_overlay_window_views.cc b/chrome/browser/ui/views/overlay/video_overlay_window_views.cc
index 49366af2..5147f66 100644
--- a/chrome/browser/ui/views/overlay/video_overlay_window_views.cc
+++ b/chrome/browser/ui/views/overlay/video_overlay_window_views.cc
@@ -393,6 +393,16 @@
   params.layer_type = ui::LAYER_NOT_DRAWN;
   params.delegate = new OverlayWindowWidgetDelegate();
 
+// Fade in animation is disabled for Document and Video Picture-in-Picture on
+// Windows. On Windows, resizable windows can not be translucent. See
+// crbug.com/425711450.
+#if !BUILDFLAG(IS_WIN)
+  if (base::FeatureList::IsEnabled(
+          media::kPictureInPictureShowWindowAnimation)) {
+    params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
+  }
+#endif
+
 #if BUILDFLAG(IS_MAC)
   // On Mac, we override the default native widget with our own subclass, which
   // allows us to get the default window styling (e.g. corner radius) even
@@ -818,8 +828,7 @@
 
 void VideoOverlayWindowViews::OnViewVisibilityChanged(
     views::View* observed_view,
-    views::View* starting_view,
-    bool visible) {
+    views::View* starting_view) {
   // If the visibility is changing due to a parent view/widget, then we don't
   // care about it.
   if (starting_view != overlay_view_) {
@@ -1934,12 +1943,33 @@
 void VideoOverlayWindowViews::Close() {
   views::Widget::Close();
   MaybeUnregisterFrameSinkHierarchy();
+  if (fade_animator_) {
+    fade_animator_->CancelAndReset();
+  }
   PictureInPictureWindowManager::GetInstance()->OnPictureInPictureWindowHidden(
       this);
 }
 
 void VideoOverlayWindowViews::ShowInactive() {
+// Fade in animation is disabled for Document and Video Picture-in-Picture on
+// Windows. On Windows, resizable windows can not be translucent. See
+// crbug.com/425711450.
+#if BUILDFLAG(IS_WIN)
   views::Widget::ShowInactive();
+#else
+  if (base::FeatureList::IsEnabled(
+          media::kPictureInPictureShowWindowAnimation)) {
+    if (!fade_animator_) {
+      fade_animator_ = std::make_unique<PictureInPictureWidgetFadeAnimator>();
+    }
+    fade_animator_->AnimateShowWindow(
+        this,
+        PictureInPictureWidgetFadeAnimator::WidgetShowType::kShowInactive);
+  } else {
+    views::Widget::ShowInactive();
+  }
+#endif
+
   views::Widget::SetVisibleOnAllWorkspaces(true);
 #if BUILDFLAG(IS_CHROMEOS)
   non_client_view()->frame_view()->UpdateWindowRoundedCorners();
@@ -1984,6 +2014,9 @@
   // If there is an existing overlay view, remove it now.
   RemoveOverlayViewIfExists();
   views::Widget::Hide();
+  if (fade_animator_) {
+    fade_animator_->CancelAndReset();
+  }
   MaybeUnregisterFrameSinkHierarchy();
   PictureInPictureWindowManager::GetInstance()->OnPictureInPictureWindowHidden(
       this);
diff --git a/chrome/browser/ui/views/overlay/video_overlay_window_views.h b/chrome/browser/ui/views/overlay/video_overlay_window_views.h
index d26bd1a0..9f11fb5 100644
--- a/chrome/browser/ui/views/overlay/video_overlay_window_views.h
+++ b/chrome/browser/ui/views/overlay/video_overlay_window_views.h
@@ -11,6 +11,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/timer/timer.h"
 #include "chrome/browser/picture_in_picture/auto_pip_setting_overlay_view.h"
+#include "chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator.h"
 #include "chrome/browser/picture_in_picture/picture_in_picture_window.h"
 #include "components/global_media_controls/public/views/media_progress_view.h"
 #include "content/public/browser/overlay_window.h"
@@ -121,8 +122,7 @@
 
   // views::ViewObserver:
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override;
+                               views::View* starting_view) override;
 
   // PictureInPictureWindow:
   void SetForcedTucking(bool tuck) override;
@@ -224,6 +224,10 @@
     return overlay_view_;
   }
 
+  PictureInPictureWidgetFadeAnimator* get_fade_animator_for_testing() {
+    return fade_animator_.get();
+  }
+
   // Determines whether a layout of the window controls has been scheduled but
   // is not done yet.
   bool IsLayoutPendingForTesting() const;
@@ -476,6 +480,9 @@
   // provide alternate implementations.
   GetOverlayViewCb get_overlay_view_cb_;
 
+  // Used to animate the Picture-in-Picture window creation.
+  std::unique_ptr<PictureInPictureWidgetFadeAnimator> fade_animator_;
+
   base::WeakPtrFactory<VideoOverlayWindowViews> weak_factory_{this};
 };
 
diff --git a/chrome/browser/ui/views/overlay/video_overlay_window_views_unittest.cc b/chrome/browser/ui/views/overlay/video_overlay_window_views_unittest.cc
index ddab2a7..4d82f92 100644
--- a/chrome/browser/ui/views/overlay/video_overlay_window_views_unittest.cc
+++ b/chrome/browser/ui/views/overlay/video_overlay_window_views_unittest.cc
@@ -14,6 +14,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/picture_in_picture/auto_pip_setting_overlay_view.h"
 #include "chrome/browser/picture_in_picture/picture_in_picture_occlusion_tracker.h"
+#include "chrome/browser/picture_in_picture/picture_in_picture_widget_fade_animator.h"
 #include "chrome/browser/picture_in_picture/picture_in_picture_window_manager.h"
 #include "chrome/browser/picture_in_picture/scoped_tuck_picture_in_picture.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
@@ -49,6 +50,7 @@
 #include "ui/events/test/event_generator.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/vector2d.h"
+#include "ui/views/animation/widget_fade_animator.h"
 #include "ui/views/controls/button/label_button.h"
 #include "ui/views/controls/button/toggle_button.h"
 #include "ui/views/controls/image_view.h"
@@ -1359,3 +1361,95 @@
   EXPECT_TRUE(live_translate_toggle_button->GetEnabled());
   EXPECT_FALSE(live_translate_toggle_button->GetIsOn());
 }
+
+class VideoOverlayWindowWithShowAnimationTest
+    : public VideoOverlayWindowViewsTest {
+ public:
+  void SetUp() override {
+    AddEnabledFeature(media::kPictureInPictureShowWindowAnimation);
+    VideoOverlayWindowViewsTest::SetUp();
+#if BUILDFLAG(IS_WIN)
+    GTEST_SKIP() << "Fade in animation is disabled on Windows.";
+#endif
+  }
+};
+
+TEST_F(VideoOverlayWindowWithShowAnimationTest,
+       FadeInAnimationIsUsedOnWindowShow) {
+  // ShowInactive should trigger the fade-in animation.
+  overlay_window().ShowInactive();
+
+  // Get the PiP fade animator.
+  PictureInPictureWidgetFadeAnimator* pip_fade_animator =
+      overlay_window().get_fade_animator_for_testing();
+  EXPECT_NE(nullptr, pip_fade_animator);
+
+  // Get the widget fade animator and verify that it is fading in.
+  views::WidgetFadeAnimator* widget_fade_animator =
+      pip_fade_animator->GetWidgetFadeAnimatorForTesting();
+  EXPECT_NE(nullptr, widget_fade_animator);
+  EXPECT_TRUE(widget_fade_animator->IsFadingIn());
+}
+
+TEST_F(VideoOverlayWindowWithShowAnimationTest,
+       FadeInAnimationIsCancelledOnHide) {
+  overlay_window().ShowInactive();
+
+  // Get the PiP fade animator.
+  PictureInPictureWidgetFadeAnimator* pip_fade_animator =
+      overlay_window().get_fade_animator_for_testing();
+  EXPECT_NE(nullptr, pip_fade_animator);
+
+  // Get the widget fade animator and verify that it is fading in.
+  views::WidgetFadeAnimator* widget_fade_animator =
+      pip_fade_animator->GetWidgetFadeAnimatorForTesting();
+  EXPECT_NE(nullptr, widget_fade_animator);
+  EXPECT_TRUE(widget_fade_animator->IsFadingIn());
+
+  // Hiding the window should cancel the animation.
+  overlay_window().Hide();
+  EXPECT_EQ(nullptr, overlay_window()
+                         .get_fade_animator_for_testing()
+                         ->GetWidgetFadeAnimatorForTesting());
+}
+
+TEST_F(VideoOverlayWindowWithShowAnimationTest,
+       FadeInAnimationIsCancelledOnClose) {
+  overlay_window().ShowInactive();
+
+  // Get the PiP fade animator.
+  PictureInPictureWidgetFadeAnimator* pip_fade_animator =
+      overlay_window().get_fade_animator_for_testing();
+  EXPECT_NE(nullptr, pip_fade_animator);
+
+  // Get the widget fade animator and verify that it is fading in.
+  views::WidgetFadeAnimator* widget_fade_animator =
+      pip_fade_animator->GetWidgetFadeAnimatorForTesting();
+  EXPECT_NE(nullptr, widget_fade_animator);
+  EXPECT_TRUE(widget_fade_animator->IsFadingIn());
+
+  // Closing the window should cancel the animation.
+  overlay_window().Close();
+  EXPECT_EQ(nullptr, overlay_window()
+                         .get_fade_animator_for_testing()
+                         ->GetWidgetFadeAnimatorForTesting());
+}
+
+TEST_F(VideoOverlayWindowWithShowAnimationTest,
+       AnimatorIsResetWhenWidgetIsDestroyedDuringAnimation) {
+  overlay_window().ShowInactive();
+
+  // Get the PiP fade animator.
+  PictureInPictureWidgetFadeAnimator* pip_fade_animator =
+      overlay_window().get_fade_animator_for_testing();
+  EXPECT_NE(nullptr, pip_fade_animator);
+
+  // Get the widget fade animator and verify that it is fading in.
+  views::WidgetFadeAnimator* widget_fade_animator =
+      pip_fade_animator->GetWidgetFadeAnimatorForTesting();
+  EXPECT_NE(nullptr, widget_fade_animator);
+  EXPECT_TRUE(widget_fade_animator->IsFadingIn());
+
+  // Destroying the widget during the animation should not crash.
+  DestroyOverlayWindow();
+}
diff --git a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble_unittest.cc b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble_unittest.cc
index 7eb720f..ace12e2 100644
--- a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble_unittest.cc
+++ b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble_unittest.cc
@@ -49,8 +49,7 @@
   void Wait() { run_loop_.Run(); }
 
   void OnViewVisibilityChanged(views::View* view,
-                               views::View* starting_view,
-                               bool visible) override {
+                               views::View* starting_view) override {
     run_loop_.Quit();
   }
 
diff --git a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_toolbar_bubble_controller.cc b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_toolbar_bubble_controller.cc
index 1c1e4608..322acc9 100644
--- a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_toolbar_bubble_controller.cc
+++ b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_toolbar_bubble_controller.cc
@@ -15,6 +15,10 @@
     Browser* browser)
     : browser_(browser) {}
 
+SendTabToSelfToolbarBubbleController::~SendTabToSelfToolbarBubbleController() {
+  HideBubble();
+}
+
 void SendTabToSelfToolbarBubbleController::ShowBubble(
     const SendTabToSelfEntry& entry,
     views::View* anchor_view) {
@@ -33,7 +37,7 @@
   if (!IsBubbleShowing()) {
     return;
   }
-  bubble_tracker_.view()->GetWidget()->Close();
+  bubble_tracker_.view()->GetWidget()->CloseNow();
 }
 
 bool SendTabToSelfToolbarBubbleController::IsBubbleShowing() const {
diff --git a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_toolbar_bubble_controller.h b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_toolbar_bubble_controller.h
index fd594dd5..193baba 100644
--- a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_toolbar_bubble_controller.h
+++ b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_toolbar_bubble_controller.h
@@ -18,6 +18,7 @@
 class SendTabToSelfToolbarBubbleController {
  public:
   explicit SendTabToSelfToolbarBubbleController(Browser* browser);
+  ~SendTabToSelfToolbarBubbleController();
 
   void ShowBubble(const SendTabToSelfEntry& entry, views::View* anchor_view);
   void HideBubble();
diff --git a/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc b/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
index e9855d8..3c9d2cc 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
+++ b/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
@@ -1051,8 +1051,7 @@
 }
 
 void SidePanelCoordinator::OnViewVisibilityChanged(views::View* observed_view,
-                                                   views::View* starting_from,
-                                                   bool visible) {
+                                                   views::View* starting_from) {
   // This method is called in 3 situations:
   //   (1) The SidePanel was previously invisible, and Show() is called. This is
   //   independent of the /*suppress_animations*/ parameter, and is re-entrant.
diff --git a/chrome/browser/ui/views/side_panel/side_panel_coordinator.h b/chrome/browser/ui/views/side_panel/side_panel_coordinator.h
index 62b1935..917f8ba 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_coordinator.h
+++ b/chrome/browser/ui/views/side_panel/side_panel_coordinator.h
@@ -190,8 +190,7 @@
 
   // views::ViewObserver:
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_from,
-                               bool visible) override;
+                               views::View* starting_from) override;
 
   // PinnedToolbarActionsModel::Observer:
   void OnActionsChanged() override;
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc b/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc
index 86c9faa..5e15a858 100644
--- a/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc
+++ b/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc
@@ -482,15 +482,21 @@
   }
 }
 
-void TabHoverCardController::OnViewVisibilityChanged(views::View* observed_view,
-                                                     views::View* starting_view,
-                                                     bool visible) {
+void TabHoverCardController::OnViewVisibilityChanged(
+    views::View* observed_view,
+    views::View* starting_view) {
   // Only care about target tab becoming invisible.
   if (observed_view != target_tab_) {
     return;
   }
-  // If visibility anywhere in the hierarchy changed to false, then the target
-  // view is not visible, so treat it as if it is going away.
+  // Visibility comes from `starting_view` or the widget, if no starting view;
+  // see documentation for ViewObserver::OnViewVisibilityChanged().
+  const bool visible = starting_view
+                           ? starting_view->GetVisible()
+                           : (observed_view->GetWidget() &&
+                              observed_view->GetWidget()->IsVisible());
+  // If visibility changed to false, treat it as if the target tab had gone
+  // away.
   if (!visible) {
     OnViewIsDeleting(observed_view);
   }
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_controller.h b/chrome/browser/ui/views/tabs/tab_hover_card_controller.h
index 8e956a8..9213fdb 100644
--- a/chrome/browser/ui/views/tabs/tab_hover_card_controller.h
+++ b/chrome/browser/ui/views/tabs/tab_hover_card_controller.h
@@ -93,8 +93,7 @@
   // views::ViewObserver:
   void OnViewIsDeleting(views::View* observed_view) override;
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override;
+                               views::View* starting_view) override;
 
   // TabResourceUsageCollector::Observer:
   void OnTabResourceMetricsRefreshed() override;
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_controller.cc b/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_controller.cc
index 75b9a63..bf139834 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_controller.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_controller.cc
@@ -385,14 +385,19 @@
 
 void ToolbarActionHoverCardController::OnViewVisibilityChanged(
     views::View* observed_view,
-    views::View* starting_view,
-    bool visible) {
+    views::View* starting_view) {
   // Only care about target action view becoming invisible.
   if (observed_view != target_action_view_) {
     return;
   }
-  // If visibility anywhere in the hierarchy changed to false, then the target
-  // view is not visible, so treat it as if it is going away.
+  // Visibility comes from `starting_view` or the widget, if no starting view;
+  // see documentation for ViewObserver::OnViewVisibilityChanged().
+  const bool visible = starting_view
+                           ? starting_view->GetVisible()
+                           : (observed_view->GetWidget() &&
+                              observed_view->GetWidget()->IsVisible());
+  // If visibility changed to false, treat it as if the target action view had
+  // gone away.
   if (!visible) {
     OnViewIsDeleting(observed_view);
   }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_controller.h b/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_controller.h
index d1184bc..c4fb5a2 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_controller.h
+++ b/chrome/browser/ui/views/toolbar/toolbar_action_hover_card_controller.h
@@ -70,8 +70,7 @@
   // views::ViewObserver:
   void OnViewIsDeleting(views::View* observed_view) override;
   void OnViewVisibilityChanged(views::View* observed_view,
-                               views::View* starting_view,
-                               bool visible) override;
+                               views::View* starting_view) override;
 
   // Timestamp of the last time the hover card is hidden by the mouse leaving
   // the tab strip. This is used for reshowing the hover card without delay if
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc
index 5aeb2f6..5da9d58b 100644
--- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc
+++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc
@@ -2470,8 +2470,7 @@
 
   // views::ViewObserver:
   void OnViewVisibilityChanged(views::View* view_or_ancestor,
-                               views::View* starting_view,
-                               bool visible) override {
+                               views::View* starting_view) override {
     log_.push_back(origin_text_->GetVisible() ? VisibilityChange::kAppear
                                               : VisibilityChange::kDisappear);
     if (origin_text_->GetVisible() && observed_text_.empty()) {
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
index 5d3b6ed..97be022 100644
--- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -153,7 +153,6 @@
 #include "extensions/browser/extension_dialog_auto_confirm.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
-#include "services/network/public/cpp/ip_address_space_overrides_test_utils.h"
 #include "services/network/public/cpp/network_switches.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -4788,8 +4787,6 @@
 
 void WebAppIntegrationTest::SetUpCommandLine(base::CommandLine* command_line) {
   ASSERT_TRUE(embedded_test_server()->Start());
-  network::AddPublicIpAddressSpaceOverrideToCommandLine(*embedded_test_server(),
-                                                        *command_line);
 }
 
 Browser* WebAppIntegrationTest::CreateBrowser(Profile* profile) {
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
index e2b4cbe..cfa5b5c 100644
--- a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
+++ b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
@@ -577,15 +577,13 @@
   views::MdTextButton* button_ptr = button.get();
   row->AddChildView(std::move(button));
 
-  // Do not add disclosure text if this is a sign in or if we were requested
-  // to skip it.
-  if (account->login_state == Account::LoginState::kSignIn ||
-      idp_data.disclosure_fields.empty()) {
+  // Do not add disclosure text if fields is empty.
+  if (account->fields.empty()) {
     return std::make_pair(std::move(row), button_ptr);
   }
 
   // Add disclosure text.
-  row->AddChildView(CreateDisclosureLabel(idp_data));
+  row->AddChildView(CreateDisclosureLabel(account));
   return std::make_pair(std::move(row), button_ptr);
 }
 
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc b/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc
index 80d888e..3656a974 100644
--- a/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc
+++ b/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc
@@ -158,6 +158,9 @@
         /*labels=*/std::vector<std::string>(),
         /*login_state=*/idp_claimed_login_state,
         /*browser_trusted_login_state=*/browser_trusted_login_state);
+    if (idp_claimed_login_state == LoginState::kSignUp) {
+      account->fields = idp->disclosure_fields;
+    }
     account->identity_provider = std::move(idp);
     return account;
   }
diff --git a/chrome/browser/ui/views/webid/account_selection_modal_view.cc b/chrome/browser/ui/views/webid/account_selection_modal_view.cc
index 555a1482c..6d1d134 100644
--- a/chrome/browser/ui/views/webid/account_selection_modal_view.cc
+++ b/chrome/browser/ui/views/webid/account_selection_modal_view.cc
@@ -657,7 +657,7 @@
   if (account->login_state == Account::LoginState::kSignUp) {
     // Add disclosure label.
     std::unique_ptr<views::StyledLabel> disclosure_label =
-        CreateDisclosureLabel(*account->identity_provider);
+        CreateDisclosureLabel(account);
     disclosure_label->SetDefaultTextStyle(views::style::STYLE_BODY_4);
     disclosure_label->SetBorder(views::CreateEmptyBorder(gfx::Insets::TLBR(
         /*top=*/kVerticalSpacing, /*left=*/0, /*bottom=*/0,
diff --git a/chrome/browser/ui/views/webid/account_selection_view_base.cc b/chrome/browser/ui/views/webid/account_selection_view_base.cc
index 8101039..e76ad35 100644
--- a/chrome/browser/ui/views/webid/account_selection_view_base.cc
+++ b/chrome/browser/ui/views/webid/account_selection_view_base.cc
@@ -477,7 +477,7 @@
 
 std::unique_ptr<views::StyledLabel>
 AccountSelectionViewBase::CreateDisclosureLabel(
-    const content::IdentityProviderData& idp_data) {
+    const IdentityRequestAccountPtr& account) {
   // It requires a StyledLabel so that we can add the links
   // to the privacy policy and terms of service URLs.
   std::unique_ptr<views::StyledLabel> disclosure_label =
@@ -491,6 +491,7 @@
       views::CreateEmptyBorder(gfx::Insets::TLBR(5, 0, 0, 0)));
   disclosure_label->SetDefaultTextStyle(views::style::STYLE_SECONDARY);
 
+  const content::IdentityProviderData& idp_data = *account->identity_provider;
   const content::ClientMetadata& client_metadata = idp_data.client_metadata;
   int disclosure_resource_id = SelectDisclosureTextResourceId(
       client_metadata.privacy_policy_url, client_metadata.terms_of_service_url);
@@ -510,7 +511,7 @@
   // Each link has both <ph name="BEGIN_LINK"> and <ph name="END_LINK">.
   std::vector<std::u16string> replacements = {
       base::UTF8ToUTF16(idp_data.idp_for_display),
-      GetPermissionFieldsString(idp_data.disclosure_fields)};
+      GetPermissionFieldsString(account->fields)};
   replacements.insert(replacements.end(), link_data.size() * 2,
                       std::u16string());
 
diff --git a/chrome/browser/ui/views/webid/account_selection_view_base.h b/chrome/browser/ui/views/webid/account_selection_view_base.h
index 4e00d0a..ee0bc917 100644
--- a/chrome/browser/ui/views/webid/account_selection_view_base.h
+++ b/chrome/browser/ui/views/webid/account_selection_view_base.h
@@ -224,7 +224,7 @@
   // Returns a StyledLabel containing a disclosure label. The label links to
   // privacy policy and terms of service URLs, if available.
   std::unique_ptr<views::StyledLabel> CreateDisclosureLabel(
-      const content::IdentityProviderData& idp_data);
+      const IdentityRequestAccountPtr& account);
 
   // Gets the summary and description string of the error.
   std::pair<std::u16string, std::u16string> GetErrorDialogText(
diff --git a/chrome/browser/ui/views/webid/account_selection_view_test_base.cc b/chrome/browser/ui/views/webid/account_selection_view_test_base.cc
index 6dba315..99ca6cb8 100644
--- a/chrome/browser/ui/views/webid/account_selection_view_test_base.cc
+++ b/chrome/browser/ui/views/webid/account_selection_view_test_base.cc
@@ -75,6 +75,9 @@
           /*browser_trusted_login_state=*/
           content::IdentityRequestAccount::LoginState::kSignUp,
           last_used_timestamp);
+  if (login_state == content::IdentityRequestAccount::LoginState::kSignUp) {
+    account->fields = idp->disclosure_fields;
+  }
   account->identity_provider = std::move(idp);
   return account;
 }
diff --git a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc
index 0833f2a..d348e0e 100644
--- a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc
+++ b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc
@@ -218,12 +218,8 @@
           new_accounts_[0]->browser_trusted_login_state ==
               Account::LoginState::kSignIn &&
           state_ != State::LOADING;
-      // The IDP claimed login state controls whether we show disclosure text,
-      // if we do not skip the next dialog. Also skip when
-      // `disclosure_fields` is empty (controlled by the fields API).
       bool should_show_request_permission_dialog =
-          new_accounts_[0]->login_state != Account::LoginState::kSignIn &&
-          !new_idp_data.disclosure_fields.empty();
+          !new_accounts_[0]->fields.empty();
 
       if (should_show_verifying_sheet) {
         state_ = State::VERIFYING;
@@ -562,15 +558,12 @@
   }
 
   const content::IdentityProviderData& idp_data = *account->identity_provider;
-  // If the account is a returning user or if the account is selected from UI
-  // which shows the disclosure text or if the dialog doesn't need to ask for
-  // the user's permission to share their id/email/name/picture, show the
-  // verifying sheet.
-  if (account->login_state != Account::LoginState::kSignUp ||
-      state_ == State::REQUEST_PERMISSION ||
+  // If the account dialog doesn't need to ask for the user's permission to
+  // share their id/email/name/picture or if the account is selected from UI
+  // which shows the disclosure text, show the verifying sheet.
+  if (account->fields.empty() || state_ == State::REQUEST_PERMISSION ||
       (state_ == State::SINGLE_ACCOUNT_PICKER &&
-       dialog_type_ == DialogType::BUBBLE) ||
-      idp_data.disclosure_fields.empty()) {
+       dialog_type_ == DialogType::BUBBLE)) {
     state_ = State::VERIFYING;
     if (!NotifyDelegateOfAccountSelection(*account, idp_data)) {
       // `this` was deleted.
diff --git a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop_unittest.cc b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop_unittest.cc
index eae0e7c..650ae61 100644
--- a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop_unittest.cc
+++ b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop_unittest.cc
@@ -331,6 +331,9 @@
         /*labels=*/std::vector<std::string>(),
         /*login_state=*/idp_claimed_login_state,
         /*browser_trusted_login_state=*/browser_trusted_login_state);
+    if (idp_claimed_login_state == LoginState::kSignUp) {
+      account->fields = idp->disclosure_fields;
+    }
     account->identity_provider = std::move(idp);
     return account;
   }
@@ -347,6 +350,9 @@
           /*labels=*/std::vector<std::string>(),
           /*login_state=*/account_info.second,
           /*browser_trusted_login_state=*/account_info.second));
+      if (account_info.second == LoginState::kSignUp) {
+        accounts.back()->fields = idp_data->disclosure_fields;
+      }
       accounts.back()->identity_provider = idp_data;
     }
     return accounts;
@@ -2276,6 +2282,12 @@
 TEST_F(FedCmAccountSelectionViewDesktopTest,
        RequestPermissionFalseAndNewIdpDataDisclosureText) {
   idp_data_->disclosure_fields = {};
+  for (auto& account : accounts_) {
+    account->fields = {};
+  }
+  for (auto& account : new_accounts_) {
+    account->fields = {};
+  }
   std::unique_ptr<TestFedCmAccountSelectionView> controller =
       CreateAndShowAccountsModalThroughPopupWindow(accounts_, new_accounts_);
 
diff --git a/chrome/browser/ui/web_applications/pwa_install_page_action_browsertest.cc b/chrome/browser/ui/web_applications/pwa_install_page_action_browsertest.cc
index 6b13939..6e1610d 100644
--- a/chrome/browser/ui/web_applications/pwa_install_page_action_browsertest.cc
+++ b/chrome/browser/ui/web_applications/pwa_install_page_action_browsertest.cc
@@ -133,8 +133,7 @@
 
   // ViewObserver
   void OnViewVisibilityChanged(views::View* observation_view,
-                               views::View* starting_view,
-                               bool visible) override {
+                               views::View* starting_view) override {
     run_loop_.Quit();
   }
 
diff --git a/chrome/browser/ui/webui/ash/settings/pages/about/about_section.cc b/chrome/browser/ui/webui/ash/settings/pages/about/about_section.cc
index 76c6d26a..851e3ef5 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/about/about_section.cc
+++ b/chrome/browser/ui/webui/ash/settings/pages/about/about_section.cc
@@ -255,6 +255,8 @@
       {"aboutDiagnostics", IDS_SETTINGS_ABOUT_PAGE_DIAGNOSTICS},
       {"aboutDiagnosticseDescription", IDS_OS_SETTINGS_DIAGNOSTICS_DESCRIPTION},
       {"aboutFirmwareUpdates", IDS_SETTINGS_ABOUT_PAGE_FIRMWARE_UPDATES},
+      {"aboutFirmwareUpdatesDisabledDescription",
+       IDS_OS_SETTINGS_FIRMWARE_DISABLED_DESCRIPTION},
       {"aboutFirmwareUpToDateDescription",
        IDS_OS_SETTINGS_FIRMWARE_UP_TO_DATE_DESCRIPTION},
       {"aboutFirmwareUpdateAvailableDescription",
diff --git a/chrome/browser/ui/webui/new_tab_footer/new_tab_footer_handler_unittest.cc b/chrome/browser/ui/webui/new_tab_footer/new_tab_footer_handler_unittest.cc
index 2de423e5..daeeef4d 100644
--- a/chrome/browser/ui/webui/new_tab_footer/new_tab_footer_handler_unittest.cc
+++ b/chrome/browser/ui/webui/new_tab_footer/new_tab_footer_handler_unittest.cc
@@ -357,6 +357,8 @@
         mock_ntp_custom_background_service_.get(), web_contents_.get());
     ASSERT_EQ(handler_.get(), ntp_custom_background_service_observer_);
     handler_->SetThemeProviderForTesting(&mock_theme_provider_);
+
+    document_.FlushForTesting();
     testing::Mock::VerifyAndClearExpectations(&document_);
   }
 
diff --git a/chrome/browser/ui/webui/searchbox/BUILD.gn b/chrome/browser/ui/webui/searchbox/BUILD.gn
index 4c60d3c..efc9d57 100644
--- a/chrome/browser/ui/webui/searchbox/BUILD.gn
+++ b/chrome/browser/ui/webui/searchbox/BUILD.gn
@@ -34,6 +34,7 @@
     "//chrome/app:generated_resources",
     "//chrome/app:generated_resources_grit",
     "//chrome/browser:browser_process",
+    "//chrome/browser/autocomplete",
     "//chrome/browser/omnibox",
     "//chrome/browser/preloading/search_preload",
     "//chrome/browser/profiles:profile",
diff --git a/chrome/browser/ui/webui/settings/about_handler.cc b/chrome/browser/ui/webui/settings/about_handler.cc
index 39feb9f..31f5e203 100644
--- a/chrome/browser/ui/webui/settings/about_handler.cc
+++ b/chrome/browser/ui/webui/settings/about_handler.cc
@@ -71,6 +71,7 @@
 #include "chrome/browser/ui/webui/ash/extended_updates/extended_updates_dialog.h"
 #include "chrome/browser/ui/webui/help/help_utils_chromeos.h"
 #include "chrome/browser/ui/webui/help/version_updater_chromeos.h"
+#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
 #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h"
 #include "chromeos/ash/components/fwupd/firmware_update_manager.h"
 #include "chromeos/ash/components/network/network_state.h"
@@ -125,6 +126,25 @@
               : IDS_UPGRADE_NETWORK_LIST_CELLULAR_ALLOWED);
 }
 
+// Returns true if current user can change firmware, false otherwise.
+bool CanChangeFirmware(Profile* profile) {
+  if (policy::ManagementServiceFactory::GetForPlatform()->IsManaged()) {
+    bool value = true;
+    // On a managed machine we allow firmware changes only if enabled by policy
+    if (!ash::CrosSettings::Get()->GetBoolean(
+            ash::kDeviceUserInitiatedFirmwareUpdatesEnabled, &value)) {
+      // This can occur if the lookup for the policy's value fails,
+      // for example if the policy is not present on the current version.
+      // In this case, default to true to allow.
+      LOG(ERROR) << "Failed to get device setting.";
+      return true;
+    }
+    return value;
+  }
+  // On unmanaged machines, always allow.
+  return true;
+}
+
 // Returns true if current user can change channel, false otherwise.
 bool CanChangeChannel(Profile* profile) {
   if (policy::ManagementServiceFactory::GetForPlatform()->IsManaged()) {
@@ -339,6 +359,10 @@
       "getChannelInfo", base::BindRepeating(&AboutHandler::HandleGetChannelInfo,
                                             base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
+      "canChangeFirmware",
+      base::BindRepeating(&AboutHandler::HandleCanChangeFirmware,
+                          base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
       "canChangeChannel",
       base::BindRepeating(&AboutHandler::HandleCanChangeChannel,
                           base::Unretained(this)));
@@ -618,6 +642,13 @@
                      weak_factory_.GetWeakPtr(), callback_id));
 }
 
+void AboutHandler::HandleCanChangeFirmware(const base::Value::List& args) {
+  CHECK_EQ(1U, args.size());
+  const std::string& callback_id = args[0].GetString();
+  ResolveJavascriptCallback(base::Value(callback_id),
+                            base::Value(CanChangeFirmware(profile_)));
+}
+
 void AboutHandler::HandleCanChangeChannel(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
   const std::string& callback_id = args[0].GetString();
diff --git a/chrome/browser/ui/webui/settings/about_handler.h b/chrome/browser/ui/webui/settings/about_handler.h
index 81cb41d..d06d042 100644
--- a/chrome/browser/ui/webui/settings/about_handler.h
+++ b/chrome/browser/ui/webui/settings/about_handler.h
@@ -109,6 +109,9 @@
   // Retrieves channel info.
   void HandleGetChannelInfo(const base::Value::List& args);
 
+  // Checks whether we can update the firmware.
+  void HandleCanChangeFirmware(const base::Value::List& args);
+
   // Checks whether we can change the current channel.
   void HandleCanChangeChannel(const base::Value::List& args);
 
diff --git a/chrome/browser/vr/webxr_vr_runtimeless_browser_test.cc b/chrome/browser/vr/webxr_vr_runtimeless_browser_test.cc
index 34fd2101..f4bf7f68 100644
--- a/chrome/browser/vr/webxr_vr_runtimeless_browser_test.cc
+++ b/chrome/browser/vr/webxr_vr_runtimeless_browser_test.cc
@@ -9,15 +9,8 @@
 
 // Tests that WebXR does not return any devices if all runtime support is
 // disabled.
-#if BUILDFLAG(IS_LINUX)
-// TODO(crbug.com/424430986): Re-enable this once the hang is fixed on Linux
-#define MAYBE_TestWebXrNoDevicesWithoutRuntime \
-  DISABLED_TestWebXrNoDevicesWithoutRuntime
-#else
-#define MAYBE_TestWebXrNoDevicesWithoutRuntime TestWebXrNoDevicesWithoutRuntime
-#endif
 IN_PROC_BROWSER_TEST_F(WebXrVrRuntimelessBrowserTest,
-                       MAYBE_TestWebXrNoDevicesWithoutRuntime) {
+                       TestWebXrNoDevicesWithoutRuntime) {
   LoadFileAndAwaitInitialization("test_webxr_does_not_return_device");
   WaitOnJavaScriptStep();
   EndTest();
diff --git a/chrome/browser/web_applications/commands/web_install_from_url_command_browsertest.cc b/chrome/browser/web_applications/commands/web_install_from_url_command_browsertest.cc
index 350463c8..1c1d586 100644
--- a/chrome/browser/web_applications/commands/web_install_from_url_command_browsertest.cc
+++ b/chrome/browser/web_applications/commands/web_install_from_url_command_browsertest.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/web_applications/commands/web_install_from_url_command.h"
 
+#include <string>
+
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/path_service.h"
@@ -18,6 +20,7 @@
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/web_app_browsertest_base.h"
 #include "chrome/browser/ui/web_applications/web_app_dialogs.h"
+#include "chrome/browser/web_applications/mojom/user_display_mode.mojom-shared.h"
 #include "chrome/browser/web_applications/test/command_metrics_test_helper.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/browser/web_applications/test/web_app_test_utils.h"
@@ -63,7 +66,18 @@
 
 namespace web_app {
 
-class WebInstallFromUrlCommandBrowserTest : public WebAppBrowserTestBase {
+// Used to test variations of the `WebAppFilter::LaunchableFromInstallApi()`
+// where this command is essentially being used to reinstall an app that doesn't
+// meet the launch criteria specified via the filter.
+enum class NotLaunchableFromInstallApi {
+  // By default,
+  kNoOSIntegration,
+  kDisplayModeBrowser,
+};
+
+class WebInstallFromUrlCommandBrowserTest
+    : public WebAppBrowserTestBase,
+      public ::testing::WithParamInterface<NotLaunchableFromInstallApi> {
  public:
   WebInstallFromUrlCommandBrowserTest() {
     scoped_feature_list_.InitAndEnableFeature(
@@ -82,10 +96,11 @@
 
   // Tests start on an about:blank page. We need to navigate to any valid URL
   // before we can execute `navigator.install()`
-  void NavigateToValidUrl() {
+  void NavigateToValidUrl(Browser* app_browser = nullptr) {
     VLOG(0) << https_server()->GetURL("/simple.html").spec();
-    ASSERT_TRUE(ui_test_utils::NavigateToURL(
-        browser(), https_server()->GetURL("/simple.html")));
+    ASSERT_TRUE(
+        ui_test_utils::NavigateToURL(app_browser ? app_browser : browser(),
+                                     https_server()->GetURL("/simple.html")));
   }
 
   // When the permission prompt shows, it must be granted or denied.
@@ -103,7 +118,9 @@
   }
 
   // 2 param navigator.install(install_url, manifest_id)
-  bool TryInstallApp(std::string install_url, std::string manifest_id) {
+  bool TryInstallApp(std::string install_url,
+                     std::string manifest_id,
+                     content::WebContents* contents = nullptr) {
     std::string script = "navigator.install('" + install_url + "', '" +
                          manifest_id +
                          "').then(result => {"
@@ -111,7 +128,7 @@
                          "}).catch(error => {"
                          "  webInstallError = error;"
                          "});";
-    return ExecJs(web_contents(), script);
+    return ExecJs(contents ? contents : web_contents(), script);
   }
 
   // 1 param navigator.install(install_url)
@@ -235,6 +252,49 @@
                       webapps::WebappInstallSource::WEB_INSTALL, 1))));
 }
 
+IN_PROC_BROWSER_TEST_F(WebInstallFromUrlCommandBrowserTest,
+                       InstallApp_FromPWAWindow) {
+  // Install setup
+  auto auto_accept_pwa_install_confirmation =
+      SetAutoAcceptPWAInstallConfirmationForTesting();
+  ui_test_utils::BrowserChangeObserver wait_for_web_app(
+      nullptr, ui_test_utils::BrowserChangeObserver::ChangeType::kAdded);
+  base::HistogramTester histograms;
+
+  // Install the pwa to use to call `navigator.install()` from within.
+  webapps::AppId app_id = InstallWebAppFromPage(
+      browser(), https_server()->GetURL("/banners/manifest_test_page.html"));
+  Browser* app_browser = wait_for_web_app.Wait();
+  content::WebContents* app_web_contents =
+      app_browser->tab_strip_model()->GetActiveWebContents();
+  histograms.ExpectBucketCount("WebApp.LaunchSource",
+                               apps::LaunchSource::kFromReparenting, 1);
+
+  // app to install with `navigator.install()`.
+  const GURL install_url =
+      https_server()->GetURL("/banners/manifest_with_id_test_page.html");
+  const std::string manifest_id =
+      GenerateManifestId("some_id", install_url).spec();
+
+  base::AutoReset<bool> auto_accept =
+      SetAutoAcceptPWAInstallConfirmationForTesting();
+  // NavigateToValidUrl(app_browser);
+  SetPermissionResponse(/*permission_granted=*/true, app_web_contents);
+  // !Important! Because the 2 apps share a scope, we need to pass manifest_id
+  // here to ensure an accurate app lookup. If we don't, we'll end up matching
+  // the app installed first and launching it. See web_install_service_impl.cc
+  // `IsAppInstalled` for more details.
+  ASSERT_TRUE(TryInstallApp(install_url.spec(), manifest_id, app_web_contents));
+
+  EXPECT_TRUE(ResultExists(app_web_contents));
+  EXPECT_FALSE(ErrorExists(app_web_contents));
+  EXPECT_EQ(GetManifestIdResult(app_web_contents), manifest_id);
+
+  // Another app should've launched.
+  histograms.ExpectBucketCount("WebApp.LaunchSource",
+                               apps::LaunchSource::kFromReparenting, 1);
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 // Permissions handling
 ///////////////////////////////////////////////////////////////////////////////
@@ -352,6 +412,9 @@
   EXPECT_EQ(GetErrorName(), kAbortError);
 }
 
+// Collection of tests for calling `navigator.install(already_installed_url)`.
+// In these cases we show the `WebAppLaunchDialog` to allow the user to launch
+// or not.
 using WebInstallBackgroundAppAlreadyInstalledBrowserTest =
     WebInstallFromUrlCommandBrowserTest;
 
@@ -387,6 +450,37 @@
 }
 
 IN_PROC_BROWSER_TEST_F(WebInstallBackgroundAppAlreadyInstalledBrowserTest,
+                       UserAcceptsLaunchDialog_WithManifestId) {
+  NavigateToValidUrl();
+  base::HistogramTester histograms;
+
+  // Install a background document.
+  const GURL background_doc_install_url =
+      https_server()->GetURL("/banners/manifest_with_id_test_page.html");
+  const std::string manifest_id =
+      GenerateManifestId("some_id", background_doc_install_url).spec();
+
+  webapps::AppId app_id = web_app::InstallWebAppFromPageAndCloseAppBrowser(
+      browser(), background_doc_install_url);
+  // Verify that the app was installed and launched.
+  histograms.ExpectBucketCount("WebApp.LaunchSource",
+                               apps::LaunchSource::kFromReparenting, 1);
+
+  // Initiate another install request for the same background document.
+  base::AutoReset<bool> auto_accept =
+      SetAutoAcceptWebInstallLaunchDialogForTesting();
+  // Because we didn't install via web install, we'll be prompted to allow
+  // permission before the launch.
+  SetPermissionResponse(/*permission_granted=*/true);
+  ASSERT_TRUE(TryInstallApp(background_doc_install_url.spec(), manifest_id));
+  EXPECT_TRUE(ResultExists());
+  EXPECT_FALSE(ErrorExists());
+  EXPECT_EQ(GetManifestIdResult(), manifest_id);
+  histograms.ExpectBucketCount("WebApp.LaunchSource",
+                               apps::LaunchSource::kFromWebInstallApi, 1);
+}
+
+IN_PROC_BROWSER_TEST_F(WebInstallBackgroundAppAlreadyInstalledBrowserTest,
                        UserCancelsLaunchDialog) {
   NavigateToValidUrl();
   base::HistogramTester histograms;
@@ -530,102 +624,101 @@
                                apps::LaunchSource::kFromWebInstallApi, 1);
 }
 
-IN_PROC_BROWSER_TEST_F(WebInstallBackgroundAppAlreadyInstalledBrowserTest,
-                       LaunchApp_WithoutOSIntegration_WithId) {
+// Parameterized test for calling `navigator.install()` on an already
+// installed app that does *not satisfy our launch requirements*. In these
+// cases we expect the web app *install* dialog is shown. If the user accepts,
+// then WebInstallFromUrlCommand will essentially reinstall the app with OS
+// integration and launch it in a standalone window.
+IN_PROC_BROWSER_TEST_P(WebInstallFromUrlCommandBrowserTest, LaunchApp) {
+  // Validates that calling `navigator.install()` on an already installed app
+  // that does not satisfy our launch requirements will essentially reinstall
+  // the app as a fully OS integrated, standalone-windowed app.
   const GURL install_url =
       https_server()->GetURL("/banners/manifest_with_id_test_page.html");
   const GURL manifest_url =
       https_server()->GetURL("/banners/manifest_with_id.json");
   const GURL manifest_id = GenerateManifestId("some_id", install_url);
+
   auto info_result =
       WebAppInstallInfo::Create(manifest_url, manifest_id, install_url);
   ASSERT_TRUE(info_result.has_value());
   std::unique_ptr<WebAppInstallInfo> info =
       std::make_unique<WebAppInstallInfo>(std::move(info_result.value()));
-  info->title = u"Test App";
-  info->user_display_mode = mojom::UserDisplayMode::kStandalone;
 
-  webapps::AppId app_id = test::InstallWebAppWithoutOsIntegration(
-      profile(), std::move(info),
-      /*overwrite_existing_manifest_fields=*/false,
-      webapps::WebappInstallSource::EXTERNAL_DEFAULT);
+  webapps::AppId app_id;
+  // Install a variety of apps that don't meet the launch requirements.
+  switch (GetParam()) {
+    case NotLaunchableFromInstallApi::kNoOSIntegration:
+      app_id = test::InstallWebAppWithoutOsIntegration(
+          profile(), std::move(info),
+          /*overwrite_existing_manifest_fields=*/false,
+          webapps::WebappInstallSource::EXTERNAL_DEFAULT);
+      break;
+    case NotLaunchableFromInstallApi::kDisplayModeBrowser:
+      // Simulate the user unchecking "Open in window" in chrome://apps.
+      info->user_display_mode = mojom::UserDisplayMode::kBrowser;
 
-  // Verify that the app has no OS integration.
+      app_id =
+          test::InstallWebApp(profile(), std::move(info),
+                              /*overwrite_existing_manifest_fields=*/false,
+                              webapps::WebappInstallSource::EXTERNAL_DEFAULT);
+      break;
+  }
+
+  // Check the app's OS integration status
   web_app::WebAppProvider* provider = WebAppProvider::GetForTest(profile());
+  auto& registrar = provider->registrar_unsafe();
   ASSERT_TRUE(provider);
-  web_app::WebAppRegistrar& registrar = provider->registrar_unsafe();
-  EXPECT_NE(registrar.GetAppById(app_id)->install_state(),
-            proto::InstallState::INSTALLED_WITH_OS_INTEGRATION);
+  switch (GetParam()) {
+    case NotLaunchableFromInstallApi::kNoOSIntegration:
+      EXPECT_NE(registrar.GetAppById(app_id)->install_state(),
+                proto::InstallState::INSTALLED_WITH_OS_INTEGRATION);
+      break;
+    case NotLaunchableFromInstallApi::kDisplayModeBrowser:
+      EXPECT_EQ(registrar.GetAppById(app_id)->install_state(),
+                proto::InstallState::INSTALLED_WITH_OS_INTEGRATION);
+      break;
+  }
 
   // Prepare to invoke navigator.install for the already installed app, which
-  // should initiate the launch dialog.
+  // should initiate the *install* dialog.
   base::HistogramTester histograms;
-  base::AutoReset<bool> auto_accept =
-      SetAutoAcceptWebInstallLaunchDialogForTesting();
+  auto auto_accept_pwa_install_confirmation =
+      SetAutoAcceptPWAInstallConfirmationForTesting();
   SetPermissionResponse(/*permission_granted=*/true);
-  ui_test_utils::BrowserChangeObserver wait_for_web_app(
-      nullptr, ui_test_utils::BrowserChangeObserver::ChangeType::kAdded);
 
   NavigateToValidUrl();
   ASSERT_TRUE(TryInstallApp(install_url.spec()));
 
-  // Verify that it launched as expected.
-  ui_test_utils::WaitForBrowserToOpen();
   EXPECT_TRUE(ResultExists());
   EXPECT_FALSE(ErrorExists());
   EXPECT_EQ(GetManifestIdResult(), manifest_id.spec());
-  histograms.ExpectBucketCount("WebApp.LaunchSource",
-                               apps::LaunchSource::kFromWebInstallApi, 1);
-  // It should also now have OS integration.
+
+  // Verify the app was reinstalled.
+  histograms.ExpectUniqueSample("WebApp.Install.Source.Success", kInstallSource,
+                                1);
+  histograms.ExpectUniqueSample("WebApp.LaunchSource", kLaunchSource, 1);
+  histograms.ExpectUniqueSample("WebApp.NewCraftedAppInstalled.ByUser",
+                                /*sample=*/true, 1);
+
+  // It should always have OS integration and launch in an app window.
   EXPECT_EQ(registrar.GetAppById(app_id)->install_state(),
             proto::InstallState::INSTALLED_WITH_OS_INTEGRATION);
+  // The app we're installing specifies display mode as `kFullscreen`, which is
+  // a type of standalone window.
+  EXPECT_EQ(registrar.GetAppById(app_id)->display_mode(),
+            blink::mojom::DisplayMode::kFullscreen);
+
+  // It should also indicate that it was installed via the web install API.
+  EXPECT_EQ(registrar.GetAppById(app_id)->latest_install_source(),
+            kInstallSource);
 }
 
-IN_PROC_BROWSER_TEST_F(WebInstallBackgroundAppAlreadyInstalledBrowserTest,
-                       LaunchApp_WithoutOSIntegration_WithoutId) {
-  const GURL install_url =
-      https_server()->GetURL("/banners/manifest_test_page.html");
-  const GURL manifest_id = GenerateManifestIdFromStartUrlOnly(install_url);
-  std::unique_ptr<WebAppInstallInfo> info =
-      WebAppInstallInfo::CreateWithStartUrlForTesting(install_url);
-  info->title = u"Test App";
-  info->user_display_mode = mojom::UserDisplayMode::kStandalone;
-
-  webapps::AppId app_id = test::InstallWebAppWithoutOsIntegration(
-      profile(), std::move(info),
-      /*overwrite_existing_manifest_fields=*/false,
-      webapps::WebappInstallSource::EXTERNAL_DEFAULT);
-
-  // Verify that the app has no OS integration.
-  web_app::WebAppProvider* provider = WebAppProvider::GetForTest(profile());
-  ASSERT_TRUE(provider);
-  web_app::WebAppRegistrar& registrar = provider->registrar_unsafe();
-  EXPECT_NE(registrar.GetAppById(app_id)->install_state(),
-            proto::InstallState::INSTALLED_WITH_OS_INTEGRATION);
-
-  // Prepare to invoke navigator.install for the already installed app, which
-  // should initiate the launch dialog.
-  base::HistogramTester histograms;
-  base::AutoReset<bool> auto_accept =
-      SetAutoAcceptWebInstallLaunchDialogForTesting();
-  SetPermissionResponse(/*permission_granted=*/true);
-  ui_test_utils::BrowserChangeObserver wait_for_web_app(
-      nullptr, ui_test_utils::BrowserChangeObserver::ChangeType::kAdded);
-
-  NavigateToValidUrl();
-  ASSERT_TRUE(TryInstallApp(install_url.spec()));
-
-  // Verify that it launched as expected.
-  ui_test_utils::WaitForBrowserToOpen();
-  EXPECT_TRUE(ResultExists());
-  EXPECT_FALSE(ErrorExists());
-  EXPECT_EQ(GetManifestIdResult(), manifest_id.spec());
-  histograms.ExpectBucketCount("WebApp.LaunchSource",
-                               apps::LaunchSource::kFromWebInstallApi, 1);
-  // It should also now have OS integration.
-  EXPECT_EQ(registrar.GetAppById(app_id)->install_state(),
-            proto::InstallState::INSTALLED_WITH_OS_INTEGRATION);
-}
+INSTANTIATE_TEST_SUITE_P(
+    ,
+    WebInstallFromUrlCommandBrowserTest,
+    testing::Values(NotLaunchableFromInstallApi::kNoOSIntegration,
+                    NotLaunchableFromInstallApi::kDisplayModeBrowser));
 
 ///////////////////////////////////////////////////////////////////////////////
 // Error cases - bad manifests, invalid URLs, etc
@@ -857,9 +950,9 @@
       views::test::AnyWidgetTestPasskey{}, "WebAppSimpleInstallDialog");
 
   // We don't actually care about the result of the install, and EvalJs blocks
-  // until the promise resolves, which only happens after the dialog is closed.
-  // Execute the install asynchronously so we can actually check the dialog
-  // contents without the promise timing out.
+  // until the promise resolves, which only happens after the dialog is
+  // closed. Execute the install asynchronously so we can actually check the
+  // dialog contents without the promise timing out.
   ExecuteScriptAsync(web_contents(),
                      "navigator.install('" + install_url.spec() + "');");
 
diff --git a/chrome/browser/web_applications/web_app_filter.cc b/chrome/browser/web_applications/web_app_filter.cc
index 1c9c528..85aeba66 100644
--- a/chrome/browser/web_applications/web_app_filter.cc
+++ b/chrome/browser/web_applications/web_app_filter.cc
@@ -91,4 +91,11 @@
   return filter;
 }
 
+// static
+WebAppFilter WebAppFilter::LaunchableFromInstallApi() {
+  WebAppFilter filter;
+  filter.launchable_from_install_api_ = true;
+  return filter;
+}
+
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_filter.h b/chrome/browser/web_applications/web_app_filter.h
index f277263..fd1ccc4 100644
--- a/chrome/browser/web_applications/web_app_filter.h
+++ b/chrome/browser/web_applications/web_app_filter.h
@@ -45,6 +45,10 @@
   // Only consider web apps that are DIY apps with OS shortcuts.
   static WebAppFilter IsDiyWithOsShortcut();
 
+  // Only consider web apps that open in a dedicated window (see above), or were
+  // installed by the user. Used by the Web Install API.
+  static WebAppFilter LaunchableFromInstallApi();
+
   WebAppFilter& operator=(const WebAppFilter&) = delete;
   ~WebAppFilter() = default;
 
@@ -70,6 +74,7 @@
   bool installed_in_chrome_ = false;
   bool installed_in_os_ = false;
   bool is_diy_with_os_shortcut_ = false;
+  bool launchable_from_install_api_ = false;
 };
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_registrar.cc b/chrome/browser/web_applications/web_app_registrar.cc
index 720b862d..c14279cf 100644
--- a/chrome/browser/web_applications/web_app_registrar.cc
+++ b/chrome/browser/web_applications/web_app_registrar.cc
@@ -977,6 +977,12 @@
     return install_state == proto::INSTALLED_WITH_OS_INTEGRATION;
   }
 
+  if (filter.launchable_from_install_api_) {
+    const WebApp* app = GetAppById(app_id);
+    return (app && app->WasInstalledByUser()) ||
+           GetAppEffectiveDisplayMode(app_id) != DisplayMode::kBrowser;
+  }
+
   return false;
 }
 
diff --git a/chrome/browser/web_applications/web_install_service_impl.cc b/chrome/browser/web_applications/web_install_service_impl.cc
index 62615eb..e373f6ab 100644
--- a/chrome/browser/web_applications/web_install_service_impl.cc
+++ b/chrome/browser/web_applications/web_install_service_impl.cc
@@ -62,8 +62,9 @@
   auto* provider = WebAppProvider::GetForWebApps(profile);
   CHECK(provider);
 
-  // TODO(crbug.com/426228062): Update WebAppFilter for background app launch.
-  WebAppFilter filter = WebAppFilter::InstalledInChrome();
+  // Only consider apps that launch in a standalone window, or were installed
+  // by the user.
+  WebAppFilter filter = WebAppFilter::LaunchableFromInstallApi();
 
   // If the developer provided a manifest ID, use it to look up the app. This
   // avoids issues with nested app scopes and `install_target` potentially
@@ -79,7 +80,8 @@
                      : std::nullopt;
   }
 
-  // No `manifest_id` was provided. Check for the app by `install_target`.
+  // No `manifest_id` was provided. Check for the app by `install_target`. This
+  // is less accurate and may result in another app being launched.
   return provider->registrar_unsafe().FindBestAppWithUrlInScope(install_target,
                                                                 filter);
 }
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 808657b..23d4fcf8 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1750687041-0a84c3133cf2f2f687f5ba691998b12d1e8aa7c4-0de46227742575c6a22ec2ac055ffd8b836c55f4.profdata
+chrome-android64-main-1750708841-d67e10ee443d115313c4c49c88b1a04dff080ac4-2b5f5b3f529f1009d287514ee9bee677bad0621b.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 25d2088..200b46a6 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1750679862-38a4fb4fb52c5eda950f83899d0c997cc2c3d7d7-9c39818cb32c6b56caef52d01f475ccf6b096049.profdata
+chrome-linux-main-1750701595-745334971010670a3e82f33a72c3a5533f44098e-61d94cb0d95a971c419c3d4bdd1ad7cd1fabb619.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index b6d7112..30bb708 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1750694361-d47cb6699f9e030a1879340e7a0effc1d58d0c51-ffcc2e66e686e30a0ea1b336263f2ac695f9b850.profdata
+chrome-mac-arm-main-1750708697-c3f5d8ed8e3885eaea5b6d3de990ca5852c9bce8-bcf6aae998dbd3768d85291f89726da6c3b73a9d.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 9caf95b..7fbeb85 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1750679862-a3aa5f6a45bc18ce822034e427bcf62c0b1f83fc-9c39818cb32c6b56caef52d01f475ccf6b096049.profdata
+chrome-mac-main-1750701595-4d0413f9740284bae5ba71783b03fc57be17e1c6-61d94cb0d95a971c419c3d4bdd1ad7cd1fabb619.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 9aa85ff..62af895 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1750647404-2c883b57dc47f46f1e1fd18e6c7167367d86bc59-c43c2a6c0aca762eb5229f7cd4cdc1669672e11c.profdata
+chrome-win32-main-1750690690-1fe71c81a8cbb5e7cfb2e4088b3066ae9cccceff-57b1a2b8f996c4bcd72dac1d3d697c41e035175c.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 535ceea..b914631 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1750635802-21c841cc9744448c18d7f13635e413c8d76d30a8-a4d9d8a51958ced830089b4a6ba1b4a8b236c7a1.profdata
+chrome-win64-main-1750669033-4d9dac9bcfff096ba8ed5c6f27a8c8b7c5aa6522-39f0919066ee7a8ee467e920d5fc8e88f9a10f54.profdata
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index c878c549..9d1502ce 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -667,6 +667,8 @@
     5};
 const base::FeatureParam<int> kGlicTabFocusDataMaxDebounces{
     &kGlicTabFocusDataDedupDebounce, "glic-tab-focus-data-max-debounces", 5};
+
+BASE_FEATURE(kGlicAssetsV2, "GlicAssetsV2", base::FEATURE_DISABLED_BY_DEFAULT);
 #endif  // BUILDFLAG(ENABLE_GLIC)
 
 // Force Privacy Guide to be available even if it would be unavailable
@@ -1171,11 +1173,6 @@
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS)
-// Skips requesting the Parent Access Code for reauth.
-BASE_FEATURE(kSkipParentAccessCodeForReauth,
-             "SkipParentAccessCodeForReauth",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Enable support for "Plugin VMs" on Chrome OS.
 BASE_FEATURE(kPluginVm, "PluginVm", base::FEATURE_DISABLED_BY_DEFAULT);
 #endif
@@ -1837,10 +1834,6 @@
 #endif  // BUILDFLAG(IS_WIN)
 
 #if BUILDFLAG(IS_CHROMEOS)
-bool IsParentAccessCodeForReauthEnabled() {
-  return !base::FeatureList::IsEnabled(kSkipParentAccessCodeForReauth);
-}
-
 // A feature to indicate whether setting wake time >24hours away is supported by
 // the platform's RTC.
 // TODO(b/187516317): Remove when the issue is resolved in FW.
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index dfc41a7..9cd580eb1 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -379,6 +379,9 @@
 extern const base::FeatureParam<int> kGlicTabFocusDataDebounceDelayMs;
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::FeatureParam<int> kGlicTabFocusDataMaxDebounces;
+
+COMPONENT_EXPORT(CHROME_FEATURES)
+BASE_DECLARE_FEATURE(kGlicAssetsV2);
 #endif  // BUILDFLAG(ENABLE_GLIC)
 
 COMPONENT_EXPORT(CHROME_FEATURES)
@@ -688,9 +691,6 @@
 
 #if BUILDFLAG(IS_CHROMEOS)
 COMPONENT_EXPORT(CHROME_FEATURES)
-BASE_DECLARE_FEATURE(kSkipParentAccessCodeForReauth);
-
-COMPONENT_EXPORT(CHROME_FEATURES)
 BASE_DECLARE_FEATURE(kPeriodicLogUploadMigration);
 
 COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kPluginVm);
@@ -1141,8 +1141,6 @@
 
 #if BUILDFLAG(IS_CHROMEOS)
 COMPONENT_EXPORT(CHROME_FEATURES)
-bool IsParentAccessCodeForReauthEnabled();
-COMPONENT_EXPORT(CHROME_FEATURES)
 BASE_DECLARE_FEATURE(kSupportsRtcWakeOver24Hours);
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json
index 66746c51..bfd2740 100644
--- a/chrome/common/extensions/api/_permission_features.json
+++ b/chrome/common/extensions/api/_permission_features.json
@@ -905,12 +905,14 @@
     "min_manifest_version": 3
   },
   "smartCardProviderPrivate": {
-    "channel": "dev",
+    "channel": "stable",
     "platforms": ["chromeos"],
     "extension_types": ["extension", "platform_app"],
     "allowlist": [
-      "EC3DE21E048B67319893889529354DFBFA96FD23"   // Smart Card Connector
-    ]
+      "EC3DE21E048B67319893889529354DFBFA96FD23", // Smart Card Connector
+      "A19608AC34215B127FF9D7C006D67F5C8ED8146D"  // Smart Card Connector - beta channel
+    ],
+    "feature_flag": "SmartCard"
   },
   "speechRecognitionPrivate": {
     "channel": "stable",
@@ -932,6 +934,7 @@
     "platforms": ["chromeos"],
     "allowlist": [
       "EC3DE21E048B67319893889529354DFBFA96FD23", // Smart Card Connector
+      "A19608AC34215B127FF9D7C006D67F5C8ED8146D", // Smart Card Connector - beta channel
       "6B748A5C005F21B7CBCF4170C2F883E435DEB511", // DriveLock Smart Card Middleware
       "075FF17D52ED6E3C2E5EC4D99F188E7A25AF47EA", // Beta DriveLock Smart Card Middleware
       "5C825E850034490380BCB756D43ABB2CF537AA91"  // b/359290130
diff --git a/chrome/enterprise_companion/installer_win.cc b/chrome/enterprise_companion/installer_win.cc
index 0a0cb44d..b964db7 100644
--- a/chrome/enterprise_companion/installer_win.cc
+++ b/chrome/enterprise_companion/installer_win.cc
@@ -65,10 +65,12 @@
       source_exe_path, install_directory->AppendUTF8(kExecutableName),
       temp_dir.GetPath(), WorkItem::ALWAYS);
 #if ENTERPRISE_COMPANION_USE_ICU_DATA_FILE
-  install_list->AddCopyTreeWorkItem(
-      source_exe_path.DirName().Append(kIcuDataFileName),
-      install_directory->Append(kIcuDataFileName), temp_dir.GetPath(),
-      WorkItem::ALWAYS);
+  if (base::PathExists(source_exe_path.DirName().Append(kIcuDataFileName))) {
+    install_list->AddCopyTreeWorkItem(
+        source_exe_path.DirName().Append(kIcuDataFileName),
+        install_directory->Append(kIcuDataFileName), temp_dir.GetPath(),
+        WorkItem::ALWAYS);
+  }
 #endif
   install_list->AddCreateRegKeyWorkItem(HKEY_LOCAL_MACHINE, kAppRegKey,
                                         KEY_WOW64_32KEY);
diff --git a/chrome/renderer/actor/tool_executor.cc b/chrome/renderer/actor/tool_executor.cc
index 7f46dfd..16fc4bc 100644
--- a/chrome/renderer/actor/tool_executor.cc
+++ b/chrome/renderer/actor/tool_executor.cc
@@ -115,8 +115,8 @@
 
   page_stability_monitor_->WaitForStable(
       *tool, request->task_id, *journal_,
-      base::BindOnce(&ToolExecutor::ToolFinished, base::Unretained(this),
-                     std::move(result)));
+      base::BindOnce(&ToolExecutor::ToolFinished,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(result)));
 }
 
 void ToolExecutor::ToolFinished(mojom::ActionResultPtr result) {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index a4f3dbfa..05c4ecf 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -566,6 +566,7 @@
     "//chrome:strings",
     "//chrome/browser:browser_process",
     "//chrome/browser:test_support",
+    "//chrome/browser/autocomplete",
     "//chrome/browser/media/webrtc",
     "//chrome/browser/profiles:profile_util",
     "//chrome/browser/safe_browsing",
@@ -803,7 +804,11 @@
       "//chrome/browser/ui/webui/signin:signin_utils",
       "//chrome/browser/ui/webui/top_chrome",
       "//components/constrained_window",
+      "//components/lookalikes/core",
+      "//components/lookalikes/core:safety_tips",
       "//components/segmentation_platform/public:public",
+      "//components/url_formatter/spoof_checks/top_domains:generate_top_domains_test_trie",
+      "//components/url_formatter/spoof_checks/top_domains:test_top_bucket_domains_header",
       "//components/webapps/isolated_web_apps:isolated_web_apps",
     ]
     if (!is_chromeos) {
@@ -817,6 +822,8 @@
       "../browser/banners/test_app_banner_manager_desktop.h",
       "../browser/download/download_browsertest_utils.cc",
       "../browser/download/download_browsertest_utils.h",
+      "../browser/lookalikes/lookalike_test_helper.cc",
+      "../browser/lookalikes/lookalike_test_helper.h",
       "../browser/net/profile_network_context_service_test_utils.cc",
       "../browser/net/profile_network_context_service_test_utils.h",
       "../browser/net/proxy_test_utils.cc",
@@ -1399,6 +1406,7 @@
     "//build:branding_buildflags",
     "//chrome/browser",
     "//chrome/browser:browser_process",
+    "//chrome/browser/autocomplete",
     "//chrome/browser/content_settings:content_settings_factory",
     "//chrome/browser/optimization_guide",
     "//chrome/browser/policy:test_support",
@@ -1568,8 +1576,10 @@
       "../browser/extensions/api/user_scripts/user_scripts_apitest.h",
       "../browser/extensions/api/web_accessible_resources_apitest.cc",
       "../browser/extensions/api/web_request/web_request_apitest.cc",
+      "../browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc",
       "../browser/extensions/api/webstore_private/webstore_private_apitest.cc",
       "../browser/extensions/background_script_executor_browsertest.cc",
+      "../browser/extensions/commands/command_service_browsertest.cc",
       "../browser/extensions/content_security_policy_apitest.cc",
       "../browser/extensions/content_verifier_browsertest.cc",
       "../browser/extensions/content_verifier_test_utils.cc",
@@ -2690,7 +2700,6 @@
       "//components/ukm/content",
       "//components/unexportable_keys",
       "//components/unified_consent",
-      "//components/url_formatter/spoof_checks/top_domains:generate_top_domains_test_trie",
       "//components/url_formatter/spoof_checks/top_domains:test_top_bucket_domains",
       "//components/url_formatter/spoof_checks/top_domains:test_top_bucket_domains_header",
       "//components/user_education/common",
@@ -3157,8 +3166,6 @@
       "../browser/loader/signed_exchange_policy_browsertest.cc",
       "../browser/locale_tests_browsertest.cc",
       "../browser/login_detection/login_detection_browsertest.cc",
-      "../browser/lookalikes/lookalike_test_helper.cc",
-      "../browser/lookalikes/lookalike_test_helper.h",
       "../browser/lookalikes/lookalike_url_navigation_throttle_browsertest.cc",
       "../browser/media/audio_ducker_browsertest.cc",
       "../browser/media/autoplay_metrics_browsertest.cc",
@@ -3826,6 +3833,10 @@
       ]
     }
 
+    if (is_win || is_mac || is_linux) {
+      sources += [ "../browser/ui/views/media_preview/mic_preview/audio_stream_coordinator_browsertest.cc" ]
+    }
+
     if (is_chrome_for_testing) {
       sources += [ "../browser/chrome_for_testing/chrome_for_testing_info_bar_browsertest.cc" ]
     }
@@ -3847,6 +3858,7 @@
     deps += [
       "//chrome/browser:flags",
       "//chrome/browser/apps/link_capturing:app_service_browser_tests",
+      "//chrome/browser/autocomplete",
       "//chrome/browser/contextual_cueing",
       "//chrome/browser/contextual_cueing:impl",
       "//chrome/browser/infobars:test_support",
@@ -4505,7 +4517,6 @@
         "../browser/extensions/api/web_navigation/web_navigation_apitest.cc",
         "../browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc",
         "../browser/extensions/api/webrtc_from_web_accessible_resource_browsertest.cc",
-        "../browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc",
         "../browser/extensions/api/webrtc_logging_private/webrtc_logging_private_browsertest.cc",
         "../browser/extensions/api_binding_perf_browsertest.cc",
         "../browser/extensions/app_background_page_apitest.cc",
@@ -4523,7 +4534,6 @@
         "../browser/extensions/chrome_app_api_browsertest.cc",
         "../browser/extensions/chrome_test_extension_loader_browsertest.cc",
         "../browser/extensions/chrome_theme_url_browsertest.cc",
-        "../browser/extensions/commands/command_service_browsertest.cc",
         "../browser/extensions/content_capabilities_browsertest.cc",
         "../browser/extensions/content_script_apitest.cc",
         "../browser/extensions/content_verifier_hash_fetch_behavior_browsertest.cc",
@@ -6752,6 +6762,7 @@
     "//chrome/browser/ai:unit_tests",
     "//chrome/browser/apps:icon_standardizer",
     "//chrome/browser/apps:user_type_filter",
+    "//chrome/browser/autocomplete",
     "//chrome/browser/autofill",
     "//chrome/browser/background:unit_tests",
     "//chrome/browser/battery",
@@ -10194,7 +10205,6 @@
         "../browser/ui/views/media_preview/media_preview_feature_unittest.cc",
         "../browser/ui/views/media_preview/media_preview_metrics_unittest.cc",
         "../browser/ui/views/media_preview/media_view_controller_base_unittest.cc",
-        "../browser/ui/views/media_preview/mic_preview/audio_stream_coordinator_unittest.cc",
         "../browser/ui/views/media_preview/mic_preview/mic_coordinator_unittest.cc",
         "../browser/ui/views/media_preview/page_info_previews_coordinator_unittest.cc",
         "../browser/ui/views/media_preview/permission_prompt_previews_coordinator_unittest.cc",
@@ -10828,7 +10838,6 @@
       "//google_apis",
       "//printing/buildflags",
       "//services/device/public/cpp:test_support",
-      "//services/network/public/cpp:ip_address_space_overrides_test_utils",
       "//skia",
       "//testing/gtest",
       "//third_party/libaddressinput",
@@ -11181,6 +11190,7 @@
       "//chrome/browser/apps/app_service/app_icon",
       "//chrome/browser/apps/link_capturing",
       "//chrome/browser/apps/link_capturing:test_support",
+      "//chrome/browser/autocomplete",
       "//chrome/browser/autofill",
       "//chrome/browser/autofill:interactive_ui_tests",
       "//chrome/browser/autofill:test_support_ui",
diff --git a/chrome/test/android/BUILD.gn b/chrome/test/android/BUILD.gn
index 7d39f2d2..42370c6 100644
--- a/chrome/test/android/BUILD.gn
+++ b/chrome/test/android/BUILD.gn
@@ -344,6 +344,7 @@
     "//content/public/test/android:content_java_test_support",
     "//content/public/test/android:content_transit_java",
     "//net/android:net_java_test_support",
+    "//third_party/android_deps:com_google_errorprone_error_prone_annotations_java",
     "//third_party/android_deps:espresso_java",
     "//third_party/android_deps:material_design_java",
     "//third_party/android_deps:org_mockito_mockito_core_java",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/ChromeTriggers.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/ChromeTriggers.java
index dfc2b70..3fd8f0fe 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/ChromeTriggers.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/ChromeTriggers.java
@@ -6,9 +6,13 @@
 
 import androidx.test.platform.app.InstrumentationRegistry;
 
+import com.google.errorprone.annotations.CheckReturnValue;
+
 import org.chromium.base.test.transit.Station;
 import org.chromium.base.test.transit.TripBuilder;
+import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.app.ChromeActivity;
+import org.chromium.chrome.browser.layouts.LayoutType;
 import org.chromium.chrome.test.util.MenuUtils;
 
 /** Collection of Chrome-specific Triggers to start Transitions. */
@@ -21,6 +25,7 @@
      * handler directly and doesn't actually open the app menu. The direct call is faster since no
      * UI is involved and a good shortcut to speed up tests.
      */
+    @CheckReturnValue
     public static TripBuilder invokeCustomMenuActionTo(
             int menuId, Station<? extends ChromeActivity> station) {
         return station.runTo(
@@ -30,4 +35,26 @@
                                 station.getActivity(),
                                 menuId));
     }
+
+    /** Switch to the browsing layout programmatically. */
+    @CheckReturnValue
+    public static TripBuilder showBrowsingLayoutTo(
+            Station<? extends ChromeTabbedActivity> station) {
+        return station.runOnUiThreadTo(
+                () ->
+                        station.getActivity()
+                                .getLayoutManager()
+                                .showLayout(LayoutType.BROWSING, /* animate= */ false));
+    }
+
+    /** Switch to the tab switcher layout programmatically. */
+    @CheckReturnValue
+    public static TripBuilder showTabSwitcherLayoutTo(
+            Station<? extends ChromeTabbedActivity> station) {
+        return station.runOnUiThreadTo(
+                () ->
+                        station.getActivity()
+                                .getLayoutManager()
+                                .showLayout(LayoutType.TAB_SWITCHER, /* animate= */ false));
+    }
 }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/HubBaseStation.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/HubBaseStation.java
index f242f9f7..02288801 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/HubBaseStation.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/HubBaseStation.java
@@ -13,12 +13,9 @@
 
 import android.view.View;
 
-import androidx.test.espresso.Espresso;
-
 import com.google.android.material.tabs.TabLayout;
 
 import org.chromium.base.test.transit.Facility;
-import org.chromium.base.test.transit.Transition;
 import org.chromium.base.test.transit.ViewElement;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
@@ -28,7 +25,6 @@
 import org.chromium.chrome.test.R;
 import org.chromium.chrome.test.transit.ChromeActivityTabModelBoundStation;
 import org.chromium.chrome.test.transit.layouts.LayoutTypeVisibleCondition;
-import org.chromium.chrome.test.transit.page.PageStation;
 
 /** The base station for Hub, with several panes and a toolbar. */
 public abstract class HubBaseStation
@@ -85,15 +81,6 @@
     public abstract @PaneId int getPaneId();
 
     /**
-     * Returns to the previous tab via the back button.
-     *
-     * @return the {@link PageStation} that Hub returned to.
-     */
-    public <T extends PageStation> T leaveHubToPreviousTabViaBack(T destination) {
-        return travelToSync(destination, Transition.retryOption(), () -> Espresso.pressBack());
-    }
-
-    /**
      * Selects the tab switcher pane on the Hub.
      *
      * @return the corresponding subclass of {@link HubBaseStation}.
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/TabSwitcherStation.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/TabSwitcherStation.java
index e0dcc0b9..929960ef 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/TabSwitcherStation.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/TabSwitcherStation.java
@@ -20,10 +20,11 @@
 
 import androidx.recyclerview.widget.RecyclerView;
 
+import com.google.errorprone.annotations.CheckReturnValue;
+
 import org.hamcrest.Matcher;
 
-import org.chromium.base.test.transit.Condition;
-import org.chromium.base.test.transit.Transition;
+import org.chromium.base.test.transit.TripBuilder;
 import org.chromium.base.test.transit.ViewElement;
 import org.chromium.base.test.transit.ViewSpec;
 import org.chromium.base.test.util.ViewActionOnDescendant;
@@ -160,17 +161,21 @@
                                         : PaneId.TAB_SWITCHER,
                                 expectedRegularTabs > 0,
                                 expectedIncognitoTabs > 0));
-        Condition tabCountDecremented =
-                new TabCountChangedCondition(
-                        tabModelSelector.getModel(incognitoModelSelected),
-                        /* expectedChange= */ -1);
-        return travelToSync(
-                tabSwitcher,
-                Transition.conditionOption(tabCountDecremented),
-                () -> {
-                    ViewActionOnDescendant.performOnRecyclerViewNthItemDescendant(
-                            is(recyclerViewElement.get()), index, TAB_CLOSE_BUTTON, click());
-                });
+        return clickCloseTabOnCardIndexTo(index)
+                .waitForAnd(
+                        new TabCountChangedCondition(
+                                tabModelSelector.getModel(incognitoModelSelected),
+                                /* expectedChange= */ -1))
+                .arriveAt(tabSwitcher);
+    }
+
+    /** Click the close tab button on the tab card at the given |index| to start a Trip. */
+    @CheckReturnValue
+    public TripBuilder clickCloseTabOnCardIndexTo(int index) {
+        return runTo(
+                () ->
+                        ViewActionOnDescendant.performOnRecyclerViewNthItemDescendant(
+                                is(recyclerViewElement.get()), index, TAB_CLOSE_BUTTON, click()));
     }
 
     /**
@@ -187,7 +192,7 @@
                         .withIsSelectingTabs(1)
                         .withIncognito(mIsIncognito)
                         .build();
-        return leaveHubToPreviousTabViaBack(destination);
+        return pressBackTo().withRetry().arriveAt(destination);
     }
 
     /** Expect a tab group card to exist. */
@@ -216,8 +221,7 @@
     public TabSwitcherSearchStation openTabSwitcherSearch() {
         TabSwitcherSearchStation searchStation = new TabSwitcherSearchStation(mIsIncognito);
         SoftKeyboardFacility softKeyboard = new SoftKeyboardFacility();
-        searchStation.addInitialFacility(softKeyboard);
-        travelToSync(searchStation, searchElement.getClickTrigger());
+        searchElement.clickTo().arriveAt(searchStation, softKeyboard);
         softKeyboard.close();
         return searchStation;
     }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/BasePageStation.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/BasePageStation.java
index 93497e19..b21cfc30 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/BasePageStation.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/BasePageStation.java
@@ -6,6 +6,8 @@
 
 import static org.chromium.base.test.transit.Condition.whether;
 
+import com.google.errorprone.annotations.CheckReturnValue;
+
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.supplier.Supplier;
 import org.chromium.base.test.transit.CallbackCondition;
@@ -14,9 +16,7 @@
 import org.chromium.base.test.transit.ConditionStatusWithResult;
 import org.chromium.base.test.transit.ConditionWithResult;
 import org.chromium.base.test.transit.Element;
-import org.chromium.base.test.transit.Facility;
-import org.chromium.base.test.transit.Transition;
-import org.chromium.base.test.transit.Transition.Trigger;
+import org.chromium.base.test.transit.TripBuilder;
 import org.chromium.chrome.browser.app.ChromeActivity;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModel;
@@ -50,7 +50,6 @@
         protected Tab mTabAlreadySelected;
         protected String mExpectedUrlSubstring;
         protected String mExpectedTitle;
-        protected List<Facility<?>> mFacilities;
 
         public Config withIncognito(boolean incognito) {
             mIncognito = incognito;
@@ -95,14 +94,6 @@
             return this;
         }
 
-        public Config withFacility(Facility<?> facility) {
-            if (mFacilities == null) {
-                mFacilities = new ArrayList<>();
-            }
-            mFacilities.add(facility);
-            return this;
-        }
-
         public Config initFrom(BasePageStation<?> previousStation) {
             if (mIncognito == null) {
                 mIncognito = previousStation.mIsIncognito;
@@ -171,13 +162,17 @@
             return this;
         }
 
-        public Builder<PageT> withFacility(Facility<?> facility) {
-            mConfig.withFacility(facility);
+        public Builder<PageT> initFrom(BasePageStation<?> previousStation) {
+            mConfig.initFrom(previousStation);
             return this;
         }
 
-        public Builder<PageT> initFrom(BasePageStation<?> previousStation) {
-            mConfig.initFrom(previousStation);
+        public Builder<PageT> initForLoadingUrlOnSameTab(
+                String url, BasePageStation<?> previousStation) {
+            initFrom(previousStation);
+            if (mConfig.mExpectedUrlSubstring == null) {
+                mConfig.withExpectedUrlSubstring(url);
+            }
             return this;
         }
 
@@ -210,12 +205,6 @@
                         "mTabAlreadySelected=%s mNumTabsBeingSelected=%s",
                         config.mTabAlreadySelected, config.mNumTabsBeingSelected);
 
-        if (config.mFacilities != null) {
-            for (Facility<?> facility : config.mFacilities) {
-                addInitialFacility(facility);
-            }
-        }
-
         if (config.mNumTabsBeingOpened > 0) {
             declareEnterCondition(
                     new TabAddedCondition(config.mNumTabsBeingOpened, tabModelElement));
@@ -269,30 +258,25 @@
         return loadedTabElement.get();
     }
 
-    /** Loads a |url| in the same tab and waits to transition. */
+    /** Loads a |url| in the same tab and waits to transition to the Station built by |builder|. */
     public <DestinationT extends BasePageStation<HostActivity>>
             DestinationT loadPageProgrammatically(String url, Builder<DestinationT> builder) {
-        Config config = builder.mConfig;
-        config.initFrom(this);
-        if (config.mExpectedUrlSubstring == null) {
-            config.mExpectedUrlSubstring = url;
-        }
+        return loadUrlTo(url).arriveAt(builder.initForLoadingUrlOnSameTab(url, this).build());
+    }
 
-        DestinationT destination = builder.build();
-        Trigger trigger =
-                () -> {
-                    @PageTransition
-                    int transitionType = PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR;
-                    loadedTabElement.get().loadUrl(new LoadUrlParams(url, transitionType));
-                };
-        Transition.TransitionOptions options =
-                Transition.newOptions()
-                        .withCondition(new PageLoadCallbackCondition(loadedTabElement.get()))
-                        .withTimeout(10000)
-                        .withPossiblyAlreadyFulfilled()
-                        .withRunTriggerOnUiThread()
-                        .build();
-        return travelToSync(destination, options, trigger);
+    /** Loads a |url| in the same tab to start a Trip. */
+    @CheckReturnValue
+    public TripBuilder loadUrlTo(String url) {
+        return runOnUiThreadTo(
+                        () -> {
+                            @PageTransition
+                            int transitionType =
+                                    PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR;
+                            loadedTabElement.get().loadUrl(new LoadUrlParams(url, transitionType));
+                        })
+                .withTimeout(10000)
+                .withPossiblyAlreadyFulfilled()
+                .waitForAnd(new PageLoadCallbackCondition(loadedTabElement.get()));
     }
 
     /** Condition to check the page url contains a certain substring. */
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/TabSwitcherActionMenuFacility.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/TabSwitcherActionMenuFacility.java
index 5e99002..19f1ecc 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/TabSwitcherActionMenuFacility.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/TabSwitcherActionMenuFacility.java
@@ -15,8 +15,7 @@
 
 import org.chromium.base.test.transit.Condition;
 import org.chromium.base.test.transit.Facility;
-import org.chromium.base.test.transit.Station;
-import org.chromium.base.test.transit.Transition;
+import org.chromium.base.test.transit.TripBuilder;
 import org.chromium.base.test.transit.ViewElement;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
@@ -88,9 +87,10 @@
                 0,
                 regularTabCount);
 
-        RegularTabSwitcherStation destination =
-                new RegularTabSwitcherStation(/* regularTabsExist= */ false, incognitoTabCount > 0);
-        return selectCloseTab(destination);
+        return selectCloseTabTo()
+                .arriveAt(
+                        new RegularTabSwitcherStation(
+                                /* regularTabsExist= */ false, incognitoTabCount > 0));
     }
 
     /**
@@ -101,9 +101,8 @@
      */
     public <T extends PageStation> T selectCloseTabAndDisplayAnotherTab(
             PageStation.Builder<T> pageStationBuilder) {
-        T destination = pageStationBuilder.initFrom(mHostStation).withIsSelectingTabs(1).build();
-
-        return selectCloseTab(destination);
+        return selectCloseTabTo()
+                .arriveAt(pageStationBuilder.initFrom(mHostStation).withIsSelectingTabs(1).build());
     }
 
     /**
@@ -114,22 +113,19 @@
      */
     public <T extends PageStation> T selectCloseTabAndDisplayRegularTab(
             PageStation.Builder<T> pageStationBuilder) {
-        T destination =
-                pageStationBuilder
-                        .withIncognito(false)
-                        .withIsOpeningTabs(0)
-                        .withIsSelectingTabs(1)
-                        .build();
-
-        return selectCloseTab(destination);
+        return selectCloseTabTo()
+                .arriveAt(
+                        pageStationBuilder
+                                .withIncognito(false)
+                                .withIsOpeningTabs(0)
+                                .withIsSelectingTabs(1)
+                                .build());
     }
 
-    private <T extends Station<?>> T selectCloseTab(T destination) {
-        return mHostStation.travelToSync(
-                destination,
-                Transition.conditionOption(
-                        createTabCountChangedCondition(mHostStation.isIncognito(), -1)),
-                closeTabMenuItemElement.getClickTrigger());
+    public TripBuilder selectCloseTabTo() {
+        return closeTabMenuItemElement
+                .clickTo()
+                .waitForAnd(createTabCountChangedCondition(mHostStation.isIncognito(), -1));
     }
 
     /** Select the "New tab" menu option to open a new Tab. */
@@ -139,47 +135,42 @@
                         .withIsOpeningTabs(1)
                         .withIsSelectingTabs(1)
                         .build();
-        return mHostStation.travelToSync(
-                destination,
-                Transition.conditionOption(
-                        createTabCountChangedCondition(/* incognito= */ false, +1)),
-                newTabMenuItemElement.getClickTrigger());
+        return newTabMenuItemElement
+                .clickTo()
+                .waitForAnd(createTabCountChangedCondition(/* incognito= */ false, +1))
+                .arriveAt(destination);
     }
 
     /** Select the "New Incognito tab" menu option to open a new incognito Tab. */
     public IncognitoNewTabPageStation selectNewIncognitoTab() {
-        IncognitoNewTabPageStation destination =
-                IncognitoNewTabPageStation.newBuilder()
-                        .withIsOpeningTabs(1)
-                        .withIsSelectingTabs(1)
-                        .build();
-        return mHostStation.travelToSync(
-                destination,
-                Transition.conditionOption(
-                        createTabCountChangedCondition(/* incognito= */ true, +1)),
-                newIncognitoTabMenuItemElement.getClickTrigger());
+        return newIncognitoTabMenuItemElement
+                .clickTo()
+                .waitForAnd(createTabCountChangedCondition(/* incognito= */ true, +1))
+                .arriveAt(
+                        IncognitoNewTabPageStation.newBuilder()
+                                .withIsOpeningTabs(1)
+                                .withIsSelectingTabs(1)
+                                .build());
     }
 
     /** Switches out of incognito tab model to regular tab model */
     public <T extends PageStation> T selectSwitchOutOfIncognito(
             PageStation.Builder<T> destinationBuilder) {
         assertTrue(mHostStation.isIncognito());
-        T destination = destinationBuilder.withIsOpeningTabs(0).withIsSelectingTabs(1).build();
-        return mHostStation.travelToSync(
-                destination,
-                Transition.conditionOption(createTabModelChangedCondition()),
-                switchOutOfIncognitoMenuItemElement.getClickTrigger());
+        return switchOutOfIncognitoMenuItemElement
+                .clickTo()
+                .waitForAnd(createTabModelChangedCondition())
+                .arriveAt(destinationBuilder.withIsOpeningTabs(0).withIsSelectingTabs(1).build());
     }
 
     /** Switches to incognito tab model from regular tab model */
     public <T extends PageStation> T selectSwitchToIncognito(
             PageStation.Builder<T> destinationBuilder) {
         assertFalse(mHostStation.isIncognito());
-        T destination = destinationBuilder.withIsOpeningTabs(0).withIsSelectingTabs(1).build();
-        return mHostStation.travelToSync(
-                destination,
-                Transition.conditionOption(createTabModelChangedCondition()),
-                switchToIncognitoMenuItemElement.getClickTrigger());
+        return switchToIncognitoMenuItemElement
+                .clickTo()
+                .waitForAnd(createTabModelChangedCondition())
+                .arriveAt(destinationBuilder.withIsOpeningTabs(0).withIsSelectingTabs(1).build());
     }
 
     private Condition createTabCountChangedCondition(boolean incognito, int change) {
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/WebPageStation.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/WebPageStation.java
index 5f80b35..fd181a3 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/WebPageStation.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/WebPageStation.java
@@ -141,7 +141,7 @@
     /** Trigger to scroll WebContents to the bottom. */
     public TripBuilder scrollToBottomTo() {
         return runJsTo("window.scrollTo(0, document.body.scrollHeight)")
-                .waitForConditionsAnd(new ScrollToBottomCondition(webContentsElement));
+                .waitForAnd(new ScrollToBottomCondition(webContentsElement));
     }
 
     /** Starts a Transition triggered by running |jsCode| in the WebContents. */
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/quick_delete/QuickDeleteDialogFacility.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/quick_delete/QuickDeleteDialogFacility.java
index 29924e7e..e6a59ba 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/quick_delete/QuickDeleteDialogFacility.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/quick_delete/QuickDeleteDialogFacility.java
@@ -83,10 +83,8 @@
                 new RegularTabSwitcherStation(
                         /* regularTabsExist= */ true, /* incognitoTabsExist= */ false);
         QuickDeleteSnackbarFacility snackbar = new QuickDeleteSnackbarFacility(mTimePeriod);
-        tabSwitcher.addInitialFacility(snackbar);
 
-        mHostStation.travelToSync(tabSwitcher, positiveButtonElement.getClickTrigger());
-
+        positiveButtonElement.clickTo().arriveAt(tabSwitcher, snackbar);
         return Pair.create(tabSwitcher, snackbar);
     }
 
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/testhtmls/BlankPopupOnLoadPageStation.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/testhtmls/BlankPopupOnLoadPageStation.java
index d2cb8637..2e5baa1 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/testhtmls/BlankPopupOnLoadPageStation.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/testhtmls/BlankPopupOnLoadPageStation.java
@@ -33,10 +33,11 @@
         PopupBlockedMessageFacility<BlankPopupOnLoadPageStation> popupBlockedMessage =
                 new PopupBlockedMessageFacility<>(1);
         BlankPopupOnLoadPageStation newPage =
-                currentPageStation.loadPageProgrammatically(
-                        url,
-                        new Builder<>(BlankPopupOnLoadPageStation::new)
-                                .withFacility(popupBlockedMessage));
+                new Builder<>(BlankPopupOnLoadPageStation::new)
+                        .initForLoadingUrlOnSameTab(url, currentPageStation)
+                        .build();
+
+        currentPageStation.loadUrlTo(url).arriveAt(newPage, popupBlockedMessage);
 
         return Pair.create(newPage, popupBlockedMessage);
     }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/testhtmls/PopupOnLoadPageStation.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/testhtmls/PopupOnLoadPageStation.java
index 0dfa3d4..dcf0f69 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/testhtmls/PopupOnLoadPageStation.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/testhtmls/PopupOnLoadPageStation.java
@@ -32,14 +32,14 @@
                     ChromeTabbedActivityTestRule activityTestRule, PageStation currentPageStation) {
         // TODO(crbug.com/329307093): Add condition that no new tabs were opened.
         String url = activityTestRule.getTestServer().getURL(PATH);
+        PopupOnLoadPageStation newPage =
+                new Builder<>(PopupOnLoadPageStation::new)
+                        .initForLoadingUrlOnSameTab(url, currentPageStation)
+                        .build();
         PopupBlockedMessageFacility<PopupOnLoadPageStation> popupBlockedMessage =
                 new PopupBlockedMessageFacility<>(2);
-        PopupOnLoadPageStation newPage =
-                currentPageStation.loadPageProgrammatically(
-                        url,
-                        new Builder<>(PopupOnLoadPageStation::new)
-                                .withFacility(popupBlockedMessage));
 
+        currentPageStation.loadUrlTo(url).arriveAt(newPage, popupBlockedMessage);
         return Pair.create(newPage, popupBlockedMessage);
     }
 
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/testhtmls/TopBottomLinksPageStation.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/testhtmls/TopBottomLinksPageStation.java
index a6f240a..21b64a5 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/testhtmls/TopBottomLinksPageStation.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/testhtmls/TopBottomLinksPageStation.java
@@ -7,7 +7,6 @@
 import android.util.Pair;
 
 import org.chromium.base.test.transit.Facility;
-import org.chromium.base.test.transit.Transition;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.transit.context_menu.LinkContextMenuFacility;
 import org.chromium.chrome.test.transit.page.PageStation;
@@ -36,9 +35,11 @@
         String url = activityTestRule.getTestServer().getURL(PATH);
         TopFacility topFacility = new TopFacility();
         TopBottomLinksPageStation station =
-                currentPageStation.loadPageProgrammatically(
-                        url,
-                        new Builder<>(TopBottomLinksPageStation::new).withFacility(topFacility));
+                new Builder<>(TopBottomLinksPageStation::new)
+                        .initForLoadingUrlOnSameTab(url, currentPageStation)
+                        .build();
+
+        currentPageStation.loadUrlTo(url).arriveAt(station, topFacility);
         return Pair.create(station, topFacility);
     }
 
@@ -60,7 +61,7 @@
         public BottomFacility scrollToBottom() {
             return mHostStation
                     .scrollPageDownWithGestureTo()
-                    .withOptions(Transition.retryOption())
+                    .withRetry()
                     .exitFacilityAnd(this)
                     .enterFacility(new BottomFacility());
         }
@@ -86,7 +87,7 @@
         public TopFacility scrollToTop() {
             return mHostStation
                     .scrollPageUpWithGestureTo()
-                    .withOptions(Transition.retryOption())
+                    .withRetry()
                     .exitFacilityAnd(this)
                     .enterFacility(new TopFacility());
         }
diff --git a/chrome/test/base/testing_profile.cc b/chrome/test/base/testing_profile.cc
index 1eb3a218..9bc7979f 100644
--- a/chrome/test/base/testing_profile.cc
+++ b/chrome/test/base/testing_profile.cc
@@ -57,6 +57,7 @@
 #include "chrome/common/buildflags.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_features.h"
+#include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_paths_internal.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
@@ -294,7 +295,8 @@
 
   // If no profile path was supplied, create one.
   if (profile_path_.empty()) {
-    profile_path_ = base::CreateUniqueTempDirectoryScopedToTest();
+    profile_path_ = base::CreateUniqueTempDirectoryScopedToTestInDir(
+        base::PathService::CheckedGet(chrome::DIR_USER_DATA));
   }
 
   // Set any testing factories prior to initializing the services.
diff --git a/chrome/test/data/webui/chromeos/settings/os_about_page/test_about_page_browser_proxy.ts b/chrome/test/data/webui/chromeos/settings/os_about_page/test_about_page_browser_proxy.ts
index 5bf9e9e..94e798d2 100644
--- a/chrome/test/data/webui/chromeos/settings/os_about_page/test_about_page_browser_proxy.ts
+++ b/chrome/test/data/webui/chromeos/settings/os_about_page/test_about_page_browser_proxy.ts
@@ -26,6 +26,7 @@
     isLts: false,
   };
   private canChangeChannel_ = true;
+  private canChangeFirmware_ = true;
   private regulatoryInfo_: RegulatoryInfo|null = null;
   private tpmFirmwareUpdateStatus_: TpmFirmwareUpdateStatusChangedEvent = {
     updateAvailable: false,
@@ -52,6 +53,7 @@
       'openHelpPage',
       'openFeedbackDialog',
       'canChangeChannel',
+      'canChangeFirmware',
       'getChannelInfo',
       'getVersionInfo',
       'getRegulatoryInfo',
@@ -132,6 +134,10 @@
     this.canChangeChannel_ = canChangeChannel;
   }
 
+  setCanChangeFirmware(canChangeFirmware: boolean): void {
+    this.canChangeFirmware_ = canChangeFirmware;
+  }
+
   setChannels(current: BrowserChannel, target: BrowserChannel): void {
     this.channelInfo_.currentChannel = current;
     this.channelInfo_.targetChannel = target;
@@ -175,6 +181,11 @@
     return Promise.resolve(this.canChangeChannel_);
   }
 
+  canChangeFirmware(): Promise<boolean> {
+    this.methodCalled('canChangeFirmware');
+    return Promise.resolve(this.canChangeFirmware_);
+  }
+
   checkInternetConnection(): Promise<boolean> {
     this.methodCalled('checkInternetConnection');
     return Promise.resolve(this.hasInternetConnection_);
diff --git a/chrome/test/data/webui/new_tab_page/metrics_utils_test.ts b/chrome/test/data/webui/new_tab_page/metrics_utils_test.ts
index c7b4f5f..cce308c 100644
--- a/chrome/test/data/webui/new_tab_page/metrics_utils_test.ts
+++ b/chrome/test/data/webui/new_tab_page/metrics_utils_test.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {recordDuration, recordLoadDuration, recordOccurence, recordPerdecage} from 'chrome://new-tab-page/new_tab_page.js';
+import {recordBoolean, recordDuration, recordEnumeration, recordLoadDuration, recordOccurrence, recordPerdecage, recordSmallCount, recordSparseValueWithPersistentHash, recordValue} from 'chrome://new-tab-page/new_tab_page.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {assertEquals} from 'chrome://webui-test/chai_assert.js';
 import type {MetricsTracker} from 'chrome://webui-test/metrics_test_support.js';
@@ -36,9 +36,47 @@
     assertEquals(1, metrics.count('foo.metric', 5));
   });
 
-  test('recordOccurence', () => {
-    recordOccurence('foo.metric');
+  test('recordOccurrence', () => {
+    recordOccurrence('foo.metric');
     assertEquals(1, metrics.count('foo.metric'));
     assertEquals(1, metrics.count('foo.metric', 1));
   });
+
+  test('recordSmallCount', () => {
+    recordSmallCount('foo.metric', 5);
+    assertEquals(1, metrics.count('foo.metric'));
+    assertEquals(1, metrics.count('foo.metric', 5));
+  });
+
+  test('recordValue', () => {
+    recordValue(
+        {
+          metricName: 'foo.metric',
+          type: chrome.metricsPrivate.MetricTypeType.HISTOGRAM_LINEAR,
+          min: 1,
+          max: 10,
+          buckets: 11,
+        },
+        5);
+    assertEquals(1, metrics.count('foo.metric'));
+    assertEquals(1, metrics.count('foo.metric', 5));
+  });
+
+  test('recordEnumeration', () => {
+    recordEnumeration('foo.metric', 5, 10);
+    assertEquals(1, metrics.count('foo.metric'));
+    assertEquals(1, metrics.count('foo.metric', 5));
+  });
+
+  test('recordSparseValueWithPersistentHash', () => {
+    recordSparseValueWithPersistentHash('foo.metric', 'bar');
+    assertEquals(1, metrics.count('foo.metric'));
+    assertEquals(1, metrics.count('foo.metric', 'bar'));
+  });
+
+  test('recordBoolean', () => {
+    recordBoolean('foo.metric', true);
+    assertEquals(1, metrics.count('foo.metric'));
+    assertEquals(1, metrics.count('foo.metric', true));
+  });
 });
diff --git a/chrome/test/data/webui/settings/other_google_data_dialog_test.ts b/chrome/test/data/webui/settings/other_google_data_dialog_test.ts
index 88d7c269..dbcb352 100644
--- a/chrome/test/data/webui/settings/other_google_data_dialog_test.ts
+++ b/chrome/test/data/webui/settings/other_google_data_dialog_test.ts
@@ -184,4 +184,49 @@
     assertEquals(
         loadTimeData.getString('otherDataTitle'), title.textContent!.trim());
   });
+
+  test('LinkRowsCssClass', async function() {
+    // Case 1: User is signed in and Google is DSE, passwords > Google search
+    // history > my activity rows should be shown in this order.
+    setSignedInAndDseState(SignedInState.SIGNED_IN, /*isGoogleDse=*/ true);
+    await flushTasks();
+    assertTrue(
+        dialog.$.passwordManagerLink.classList.contains('first-link-row'));
+    assertTrue(
+        dialog.$.googleSearchHistoryLink.classList.contains('middle-link-row'));
+    assertTrue(dialog.$.myActivityLink.classList.contains('last-link-row'));
+    assertFalse(isVisible(dialog.$.nonGoogleSearchHistoryLink));
+
+    // Case 2: User is signed in and Google is not the DSE, passwords  > my
+    // activity > non Google search history rows should be shown in this order.
+    setSignedInAndDseState(SignedInState.SIGNED_IN, /*isGoogleDse=*/ false);
+    await flushTasks();
+    assertTrue(
+        dialog.$.passwordManagerLink.classList.contains('first-link-row'));
+    assertFalse(isVisible(dialog.$.googleSearchHistoryLink));
+    assertTrue(dialog.$.myActivityLink.classList.contains('middle-link-row'));
+    assertTrue(dialog.$.nonGoogleSearchHistoryLink.classList.contains(
+        'last-link-row'));
+
+    // Case 3: User is not signed in and Google is not the DSE, passwords  > non
+    // Google search history rows should be shown in this order.
+    setSignedInAndDseState(SignedInState.SIGNED_OUT, /*isGoogleDse=*/ false);
+    await flushTasks();
+    assertTrue(
+        dialog.$.passwordManagerLink.classList.contains('first-link-row'));
+    assertFalse(isVisible(dialog.$.googleSearchHistoryLink));
+    assertFalse(isVisible(dialog.$.myActivityLink));
+    assertTrue(dialog.$.nonGoogleSearchHistoryLink.classList.contains(
+        'last-link-row'));
+
+    // Case 4: User is not signed in and Google is the DSE, only passwords row
+    // should be shown.
+    setSignedInAndDseState(SignedInState.SIGNED_OUT, /*isGoogleDse=*/ true);
+    await flushTasks();
+    assertTrue(
+        dialog.$.passwordManagerLink.classList.contains('only-link-row'));
+    assertFalse(isVisible(dialog.$.googleSearchHistoryLink));
+    assertFalse(isVisible(dialog.$.myActivityLink));
+    assertFalse(isVisible(dialog.$.nonGoogleSearchHistoryLink));
+  });
 });
diff --git a/chromeos/ash/services/recording/recording_service.cc b/chromeos/ash/services/recording/recording_service.cc
index 6f825ef9..d897246 100644
--- a/chromeos/ash/services/recording/recording_service.cc
+++ b/chromeos/ash/services/recording/recording_service.cc
@@ -389,8 +389,7 @@
           info->visible_rect);
   scoped_refptr<media::VideoFrame> frame = media::VideoFrame::WrapExternalData(
       info->pixel_format, info->coded_size, visible_rect, visible_rect.size(),
-      reinterpret_cast<const uint8_t*>(mapping.memory()), mapping.size(),
-      info->timestamp);
+      mapping, info->timestamp);
   if (!frame) {
     DLOG(ERROR) << "Failed to create a VideoFrame.";
     return;
diff --git a/chromeos/ui/frame/highlight_border_overlay.cc b/chromeos/ui/frame/highlight_border_overlay.cc
index fe0acbe9..1aa39268 100644
--- a/chromeos/ui/frame/highlight_border_overlay.cc
+++ b/chromeos/ui/frame/highlight_border_overlay.cc
@@ -122,6 +122,7 @@
       window_(widget->GetNativeWindow()),
       delegate_(std::move(delegate)) {
   rounded_corner_radius_ = GetCornerRadius(window_, delegate_.get());
+  layer_.SetName("HighlightBorderOverlay");
   layer_.SetFillsBoundsOpaquely(false);
 
   UpdateNinePatchLayer();
diff --git a/clank b/clank
index 42ba606..fe18a94 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 42ba606e843b4a89eb3bfa3954ddd285fb1cf324
+Subproject commit fe18a946fd0b94293fc90107fbf7ba606bff27fb
diff --git a/components/BUILD.gn b/components/BUILD.gn
index 5a700d0..aebcf12 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -1053,8 +1053,8 @@
       "dom_distiller/content/browser/test/dom_distiller_js_browsertest.cc",
       "dom_distiller/content/browser/test/test_util.cc",
       "dom_distiller/content/browser/test/test_util.h",
-      "optimization_guide/content/browser/page_content_proto_provider_browsertest.cc",
       "optimization_guide/content/browser/frame_metadata_observer_browsertest.cc",
+      "optimization_guide/content/browser/page_content_proto_provider_browsertest.cc",
       "optimization_guide/content/renderer/page_text_agent_browsertest.cc",
       "paint_preview/renderer/paint_preview_recorder_browsertest.cc",
       "ukm/content/source_url_recorder_browsertest.cc",
@@ -1153,6 +1153,7 @@
     if (is_ios) {
       entitlements_path = "//content/app/ios/appex/app.entitlements"
       deps += [
+        "//components/test:optimization_guide_test_bundle_data",
         "//content/test/ios/appex:test_content_process_bundle",
         "//content/test/ios/appex:test_gpu_process_bundle",
         "//content/test/ios/appex:test_network_process_bundle",
diff --git a/components/autofill/android/BUILD.gn b/components/autofill/android/BUILD.gn
index c4ee65e..f7b208e 100644
--- a/components/autofill/android/BUILD.gn
+++ b/components/autofill/android/BUILD.gn
@@ -214,14 +214,13 @@
     "//components/autofill/core/common/autofill_features.cc",
     "//components/autofill/core/common/autofill_payments_features.cc",
   ]
-  template =
-      "//components/autofill/android/java_templates/AutofillFeatures.java.tmpl"
+  class_name = "org.chromium.components.autofill.AutofillFeatures"
 }
 
 java_cpp_strings("java_switches_srcjar") {
   visibility = [ ":*" ]
   sources = [ "//components/autofill/core/common/autofill_switches.cc" ]
-  template = "java_templates/AutofillSwitches.java.tmpl"
+  class_name = "org.chromium.components.autofill.AutofillSwitches"
 }
 
 # We intentionally do not include :autofill_payments_java_resources not to
diff --git a/components/autofill/android/java_templates/AutofillFeatures.java.tmpl b/components/autofill/android/java_templates/AutofillFeatures.java.tmpl
deleted file mode 100644
index af8be17..0000000
--- a/components/autofill/android/java_templates/AutofillFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.autofill;
-
-/**
- * Contains features that are specific to the autofill component.
- */
-public final class AutofillFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Prevents instantiation.
-    private AutofillFeatures() {{}}
-}}
diff --git a/components/autofill/android/java_templates/AutofillSwitches.java.tmpl b/components/autofill/android/java_templates/AutofillSwitches.java.tmpl
deleted file mode 100644
index f7724a4..0000000
--- a/components/autofill/android/java_templates/AutofillSwitches.java.tmpl
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.autofill;
-
-/**
- * Contains all of the command line switches that are specific to the autofill/
- * portion of Chromium on Android.
- * Note: This file is generated from //components/autofill/core/common/autofill_switches.cc.
- */
-public final class AutofillSwitches {{
-
-{NATIVE_STRINGS}
-    // Prevents instantiation.
-    private AutofillSwitches() {{}}
-}}
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index c8f43e7..681c5b1 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -1105,6 +1105,8 @@
     "payments/test/mock_payments_window_manager.h",
     "payments/test/mock_save_and_fill_manager.cc",
     "payments/test/mock_save_and_fill_manager.h",
+    "payments/test/mock_virtual_card_enrollment_manager.cc",
+    "payments/test/mock_virtual_card_enrollment_manager.h",
     "payments/test/test_credit_card_otp_authenticator.cc",
     "payments/test/test_credit_card_otp_authenticator.h",
     "payments/test/test_credit_card_risk_based_authenticator.cc",
diff --git a/components/autofill/core/browser/form_import/form_data_importer_unittest.cc b/components/autofill/core/browser/form_import/form_data_importer_unittest.cc
index d62de85a..7a7dc41 100644
--- a/components/autofill/core/browser/form_import/form_data_importer_unittest.cc
+++ b/components/autofill/core/browser/form_import/form_data_importer_unittest.cc
@@ -53,6 +53,7 @@
 #include "components/autofill/core/browser/metrics/autofill_metrics_utils.h"
 #include "components/autofill/core/browser/payments/payments_autofill_client.h"
 #include "components/autofill/core/browser/payments/test/mock_mandatory_reauth_manager.h"
+#include "components/autofill/core/browser/payments/test/mock_virtual_card_enrollment_manager.h"
 #include "components/autofill/core/browser/payments/test_credit_card_save_manager.h"
 #include "components/autofill/core/browser/payments/test_payments_autofill_client.h"
 #include "components/autofill/core/browser/payments/test_virtual_card_enrollment_manager.h"
@@ -482,31 +483,6 @@
       ::testing::Pointee(ComparesEqual(std::move(matchers)))...);
 }
 
-class MockVirtualCardEnrollmentManager
-    : public TestVirtualCardEnrollmentManager {
- public:
-  MockVirtualCardEnrollmentManager(
-      PaymentsDataManager* payments_data_manager,
-      payments::TestPaymentsNetworkInterface* payments_network_interface,
-      TestAutofillClient* autofill_client)
-      : TestVirtualCardEnrollmentManager(payments_data_manager,
-                                         payments_network_interface,
-                                         autofill_client) {}
-  MOCK_METHOD(
-      void,
-      InitVirtualCardEnroll,
-      (const CreditCard& credit_card,
-       VirtualCardEnrollmentSource virtual_card_enrollment_source,
-       VirtualCardEnrollmentManager::VirtualCardEnrollmentFieldsLoadedCallback
-           virtual_card_enrollment_fields_loaded_callback,
-       std::optional<payments::GetDetailsForEnrollmentResponseDetails>
-           get_details_for_enrollment_response_details,
-       PrefService* user_prefs,
-       VirtualCardEnrollmentManager::RiskAssessmentFunction
-           risk_assessment_function),
-      (override));
-};
-
 // TODO(crbug.com/40270301): Move MockCreditCardSaveManager to new header and cc
 // file.
 class MockCreditCardSaveManager : public TestCreditCardSaveManager {
diff --git a/components/autofill/core/browser/metrics/payments/card_metadata_metrics_unittest.cc b/components/autofill/core/browser/metrics/payments/card_metadata_metrics_unittest.cc
index edc9cb59..b91ce0b 100644
--- a/components/autofill/core/browser/metrics/payments/card_metadata_metrics_unittest.cc
+++ b/components/autofill/core/browser/metrics/payments/card_metadata_metrics_unittest.cc
@@ -761,12 +761,15 @@
                            std::get<2>(info.param), std::get<3>(info.param)});
     });
 
+// =============================
+//    Benefits metrics: Shown
+// =============================
+
 // Tests that when the card suggestion shown had a benefit available,
 // `FORM_EVENT_SUGGESTION_FOR_CARD_WITH_BENEFIT_AVAILABLE_SHOWN` is logged as
-// many times as the suggestions are shown.
-// `FORM_EVENT_SUGGESTION_FOR_CARD_WITH_BENEFIT_AVAILABLE_SHOWN_ONCE` is only
-// logged once. `kSuggestionWithBenefitShownWithMultipleServerCards` is not
-// logged.
+// many times as the suggestions are shown, and
+// `FORM_EVENT_SUGGESTION_FOR_CARD_WITH_BENEFIT_AVAILABLE_SHOWN_ONCE` is
+// logged only once.
 TEST_P(CardBenefitFormEventMetricsTest, LogShownMetrics_SuggestionHasBenefits) {
   base::HistogramTester histogram_tester;
   AddBenefitToCard(card());
@@ -783,18 +786,6 @@
           Bucket(
               FORM_EVENT_SUGGESTION_FOR_CARD_WITH_BENEFIT_AVAILABLE_SHOWN_ONCE,
               1)));
-  EXPECT_THAT(
-      histogram_tester.GetAllSamples("Autofill.FormEvents.CreditCard.Benefits"),
-      BucketsInclude(
-          Bucket(CardBenefitFormEvent::
-                     kSuggestionWithBenefitShownWithMultipleServerCards,
-                 0)));
-  EXPECT_THAT(histogram_tester.GetAllSamples(base::StrCat(
-                  {"Autofill.FormEvents.CreditCard.Benefits.", GetSuffix()})),
-              BucketsInclude(
-                  Bucket(CardBenefitFormEvent::
-                             kSuggestionWithBenefitShownWithMultipleServerCards,
-                         0)));
 
   // Show the popup again.
   ShowCardSuggestions();
@@ -809,26 +800,15 @@
           Bucket(
               FORM_EVENT_SUGGESTION_FOR_CARD_WITH_BENEFIT_AVAILABLE_SHOWN_ONCE,
               1)));
-  EXPECT_THAT(
-      histogram_tester.GetAllSamples("Autofill.FormEvents.CreditCard.Benefits"),
-      BucketsInclude(
-          Bucket(CardBenefitFormEvent::
-                     kSuggestionWithBenefitShownWithMultipleServerCards,
-                 0)));
-  EXPECT_THAT(histogram_tester.GetAllSamples(base::StrCat(
-                  {"Autofill.FormEvents.CreditCard.Benefits.", GetSuffix()})),
-              BucketsInclude(
-                  Bucket(CardBenefitFormEvent::
-                             kSuggestionWithBenefitShownWithMultipleServerCards,
-                         0)));
 }
 
 // Tests that when we have multiple cards with benefits that share the same
 // issuer or benefit source, we only log
-// `FORM_EVENT_SUGGESTION_FOR_CARD_WITH_BENEFIT_AVAILABLE_SHOWN_ONCE` and
-// `kSuggestionWithBenefitShownWithMultipleServerCards` once.
-TEST_P(CardBenefitFormEventMetricsTest,
-       LogShownMetrics_MultipleSuggestionsWithSameIssuerIdOrBenefitSource) {
+// FORM_EVENT_SUGGESTION_FOR_CARD_WITH_BENEFIT_AVAILABLE_SHOWN_ONCE once for all
+// cards in that benefit source's benefits histogram.
+TEST_P(
+    CardBenefitFormEventMetricsTest,
+    LogShownMetrics_BenefitHistogram_MultipleSuggestionsWithSameBenefitSourceHaveBenefits) {
   base::HistogramTester histogram_tester;
   AddBenefitToCard(card());
 
@@ -841,18 +821,6 @@
       BucketsAre(Bucket(
           FORM_EVENT_SUGGESTION_FOR_CARD_WITH_BENEFIT_AVAILABLE_SHOWN_ONCE,
           1)));
-  EXPECT_THAT(
-      histogram_tester.GetAllSamples("Autofill.FormEvents.CreditCard.Benefits"),
-      BucketsInclude(
-          Bucket(CardBenefitFormEvent::
-                     kSuggestionWithBenefitShownWithMultipleServerCards,
-                 1)));
-  EXPECT_THAT(
-      histogram_tester.GetAllSamples(base::StrCat(
-          {"Autofill.FormEvents.CreditCard.Benefits.", GetSuffix()})),
-      BucketsAre(Bucket(CardBenefitFormEvent::
-                            kSuggestionWithBenefitShownWithMultipleServerCards,
-                        1)));
 }
 
 // Tests that when the card suggestion shown did not have any benefit available,
@@ -874,18 +842,126 @@
           Bucket(
               FORM_EVENT_SUGGESTION_FOR_CARD_WITH_BENEFIT_AVAILABLE_SHOWN_ONCE,
               0)));
-  EXPECT_THAT(
-      histogram_tester.GetAllSamples("Autofill.FormEvents.CreditCard.Benefits"),
-      BucketsInclude(
-          Bucket(CardBenefitFormEvent::
-                     kSuggestionWithBenefitShownWithMultipleServerCards,
-                 0)));
-  EXPECT_THAT(
-      histogram_tester.GetAllSamples(base::StrCat(
-          {"Autofill.FormEvents.CreditCard.Benefits.", GetSuffix()})),
-      BucketsAre(Bucket(CardBenefitFormEvent::
-                            kSuggestionWithBenefitShownWithMultipleServerCards,
-                        0)));
+}
+
+// Tests that when we have one server card with a benefit available and a local
+// card, when we select the server card with a benefit available, we don't log
+// `kSuggestionWithBenefitShownWithMultipleServerCards`.
+TEST_P(
+    CardBenefitFormEventMetricsTest,
+    Metrics_OneServerCardWithBenefitAndOneLocalCard_DoesNotLogSuggestionWithBenefitShownWithMultipleServerCards) {
+  base::HistogramTester histogram_tester;
+
+  // Add server card with a benefit available.
+  AddBenefitToCard(card());
+
+  // Add local card.
+  AddLocalCard();
+
+  // Simulate activating the autofill popup for the credit card field.
+  ShowCardSuggestions();
+
+  histogram_tester.ExpectBucketCount(
+      "Autofill.FormEvents.CreditCard.Benefits",
+      CardBenefitFormEvent::kSuggestionWithBenefitShownWithMultipleServerCards,
+      0);
+  histogram_tester.ExpectBucketCount(
+      base::StrCat({"Autofill.FormEvents.CreditCard.Benefits.", GetSuffix()}),
+      CardBenefitFormEvent::kSuggestionWithBenefitShownWithMultipleServerCards,
+      0);
+}
+
+// Tests that when we have multiple server cards with one having benefits
+// available, we only log `kSuggestionWithBenefitShownWithMultipleServerCards`
+// once when the suggestions are shown twice.
+TEST_P(
+    CardBenefitFormEventMetricsTest,
+    Metrics_MultipleServerCardsWithOneBenefitAvailable_LogSuggestionWithBenefitShownWithMultipleServerCards) {
+  base::HistogramTester histogram_tester;
+
+  // Add server card with benefit available.
+  AddBenefitToCard(card());
+
+  // Add a server card without a benefit available.
+  personal_data().test_payments_data_manager().AddServerCreditCard(
+      test::GetMaskedServerCard2());
+
+  // Simulate activating the autofill popup for the credit card field.
+  ShowCardSuggestions();
+
+  histogram_tester.ExpectBucketCount(
+      "Autofill.FormEvents.CreditCard.Benefits",
+      CardBenefitFormEvent::kSuggestionWithBenefitShownWithMultipleServerCards,
+      1);
+  histogram_tester.ExpectBucketCount(
+      base::StrCat({"Autofill.FormEvents.CreditCard.Benefits.", GetSuffix()}),
+      CardBenefitFormEvent::kSuggestionWithBenefitShownWithMultipleServerCards,
+      1);
+
+  // Show the popup again.
+  ShowCardSuggestions();
+
+  histogram_tester.ExpectBucketCount(
+      "Autofill.FormEvents.CreditCard.Benefits",
+      CardBenefitFormEvent::kSuggestionWithBenefitShownWithMultipleServerCards,
+      1);
+  histogram_tester.ExpectBucketCount(
+      base::StrCat({"Autofill.FormEvents.CreditCard.Benefits.", GetSuffix()}),
+      CardBenefitFormEvent::kSuggestionWithBenefitShownWithMultipleServerCards,
+      1);
+}
+
+// Tests that when we have multiple server cards with benefits available that
+// share the same benefit source or issuer id, we only log
+// `kSuggestionWithBenefitShownWithMultipleServerCards` once to the benefit
+// subhistogram.
+TEST_P(
+    CardBenefitFormEventMetricsTest,
+    Metrics_MultipleServerCardsWithSameBenefitSourceOrIssuerId_LogSuggestionWithBenefitShownWithMultipleServerCards) {
+  base::HistogramTester histogram_tester;
+
+  // Add server card with benefit available.
+  AddBenefitToCard(card());
+
+  // Add another server card with the same benefit source or issuer id as the
+  // first server card.
+  AddAdditionalCardWithBenefit();
+
+  // Simulate activating the autofill popup for the credit card field.
+  ShowCardSuggestions();
+
+  histogram_tester.ExpectBucketCount(
+      base::StrCat({"Autofill.FormEvents.CreditCard.Benefits.", GetSuffix()}),
+      CardBenefitFormEvent::kSuggestionWithBenefitShownWithMultipleServerCards,
+      1);
+}
+
+// Tests that when we have multiple server cards without any benefits available,
+// shown metrics for card benefits will not be logged.
+TEST_P(
+    CardBenefitFormEventMetricsTest,
+    Metrics_MultipleServerCardsWithoutBenefitsAvailable_DoesNotLogAnyShownMetrics) {
+  base::HistogramTester histogram_tester;
+
+  // Add a server card without a benefit available.
+  personal_data().test_payments_data_manager().AddServerCreditCard(
+      test::GetMaskedServerCard());
+
+  // Add another server card without a benefit available.
+  personal_data().test_payments_data_manager().AddServerCreditCard(
+      test::GetMaskedServerCard2());
+
+  // Simulate activating the autofill popup for the credit card field.
+  ShowCardSuggestions();
+
+  histogram_tester.ExpectBucketCount(
+      "Autofill.FormEvents.CreditCard.Benefits",
+      CardBenefitFormEvent::kSuggestionWithBenefitShownWithMultipleServerCards,
+      0);
+  histogram_tester.ExpectBucketCount(
+      base::StrCat({"Autofill.FormEvents.CreditCard.Benefits.", GetSuffix()}),
+      CardBenefitFormEvent::kSuggestionWithBenefitShownWithMultipleServerCards,
+      0);
 }
 
 // =============================
diff --git a/components/autofill/core/browser/payments/amount_extraction_manager.cc b/components/autofill/core/browser/payments/amount_extraction_manager.cc
index b496e19..de90a202 100644
--- a/components/autofill/core/browser/payments/amount_extraction_manager.cc
+++ b/components/autofill/core/browser/payments/amount_extraction_manager.cc
@@ -177,7 +177,7 @@
     bnpl_manager->OnAmountExtractionReturned(parsed_extracted_amount);
   }
   if constexpr (BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
-                BUILDFLAG(IS_CHROMEOS)) {
+                BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)) {
     if (base::FeatureList::IsEnabled(
             ::autofill::features::kAutofillEnableAmountExtractionTesting)) {
       VLOG(3) << "The result of amount extraction on domain "
@@ -200,7 +200,7 @@
       autofill_metrics::AmountExtractionResult::kTimeout);
   // TODO(crbug.com/378517983): Add BNPL flow action logic here.
   if constexpr (BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
-                BUILDFLAG(IS_CHROMEOS)) {
+                BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)) {
     if (base::FeatureList::IsEnabled(
             ::autofill::features::kAutofillEnableAmountExtractionTesting)) {
       VLOG(3) << "The amount extraction on domain "
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager.cc b/components/autofill/core/browser/payments/credit_card_access_manager.cc
index 5312f3d4..5393cb1f 100644
--- a/components/autofill/core/browser/payments/credit_card_access_manager.cc
+++ b/components/autofill/core/browser/payments/credit_card_access_manager.cc
@@ -40,6 +40,7 @@
 #include "components/autofill/core/browser/payments/payments_network_interface.h"
 #include "components/autofill/core/browser/payments/payments_util.h"
 #include "components/autofill/core/browser/payments/payments_window_manager.h"
+#include "components/autofill/core/browser/payments/virtual_card_enrollment_manager.h"
 #include "components/autofill/core/browser/payments/webauthn_callback_types.h"
 #include "components/autofill/core/browser/suggestions/payments/payments_suggestion_generator.h"
 #include "components/autofill/core/common/autofill_clock.h"
@@ -353,6 +354,24 @@
             : PaymentsRpcCardType::kServerCard);
   }
 
+  // If the to-be-unmasked card is a virtual card eligible card (this also
+  // implicitly checks the RecordType to be masked server card), send the
+  // virtual card enrollment preflight call early.
+  auto* virtual_card_enrollment_manager =
+      payments_autofill_client().GetVirtualCardEnrollmentManager();
+  if (card->virtual_card_enrollment_state() ==
+          CreditCard::VirtualCardEnrollmentState::kUnenrolledAndEligible &&
+      virtual_card_enrollment_manager &&
+      base::FeatureList::IsEnabled(
+          features::
+              kAutofillEnableMultipleRequestInVirtualCardDownstreamEnrollment)) {
+    // Set empty callback as we need to wait for form submission & card
+    // extraction from the form, before we start the next step.
+    virtual_card_enrollment_manager->InitVirtualCardEnroll(
+        *card, VirtualCardEnrollmentSource::kDownstream,
+        /*virtual_card_enrollment_fields_loaded_callback=*/base::DoNothing());
+  }
+
   // If card has been previously unmasked, use cached data.
   std::unordered_map<std::string, CachedServerCardInfo>::iterator it =
       unmasked_card_cache_.find(GetKeyForUnmaskedCardsCache(*card));
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc
index 6e2eca4..af9f401 100644
--- a/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc
@@ -37,6 +37,7 @@
 #include "components/autofill/core/browser/payments/payments_autofill_client.h"
 #include "components/autofill/core/browser/payments/payments_window_manager.h"
 #include "components/autofill/core/browser/payments/test/mock_payments_window_manager.h"
+#include "components/autofill/core/browser/payments/test/mock_virtual_card_enrollment_manager.h"
 #include "components/autofill/core/browser/payments/test/test_credit_card_otp_authenticator.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
@@ -2555,4 +2556,83 @@
           .has_value());
 }
 
+TEST_F(CreditCardAccessManagerTest, InvokeVirtualCardEnrollmentPreflightCall) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(
+      features::
+          kAutofillEnableMultipleRequestInVirtualCardDownstreamEnrollment);
+  auto virtual_card_enrollment_manager =
+      std::make_unique<MockVirtualCardEnrollmentManager>(
+          &personal_data().payments_data_manager(),
+          /*payments_network_interface=*/nullptr, &autofill_client_);
+  autofill_client_.GetPaymentsAutofillClient()
+      ->set_virtual_card_enrollment_manager(
+          std::move(virtual_card_enrollment_manager));
+  CreditCard card = test::GetMaskedServerCard();
+  card.set_virtual_card_enrollment_state(
+      CreditCard::VirtualCardEnrollmentState::kUnenrolledAndEligible);
+  personal_data().test_payments_data_manager().AddServerCreditCard(card);
+  EXPECT_CALL(*static_cast<MockVirtualCardEnrollmentManager*>(
+                  autofill_client_.GetPaymentsAutofillClient()
+                      ->GetVirtualCardEnrollmentManager()),
+              InitVirtualCardEnroll);
+
+  PrepareToFetchCreditCardAndWaitForCallbacks();
+  CreditCardAccessManagerTestBase::FetchCreditCard(&card);
+}
+
+TEST_F(CreditCardAccessManagerTest,
+       DoNotInvokeVirtualCardEnrollmentPreflightCall_FlagOff) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndDisableFeature(
+      features::
+          kAutofillEnableMultipleRequestInVirtualCardDownstreamEnrollment);
+  auto virtual_card_enrollment_manager =
+      std::make_unique<MockVirtualCardEnrollmentManager>(
+          &personal_data().payments_data_manager(),
+          /*payments_network_interface=*/nullptr, &autofill_client_);
+  autofill_client_.GetPaymentsAutofillClient()
+      ->set_virtual_card_enrollment_manager(
+          std::move(virtual_card_enrollment_manager));
+  CreditCard card = test::GetMaskedServerCard();
+  card.set_virtual_card_enrollment_state(
+      CreditCard::VirtualCardEnrollmentState::kUnenrolledAndEligible);
+  personal_data().test_payments_data_manager().AddServerCreditCard(card);
+  EXPECT_CALL(*static_cast<MockVirtualCardEnrollmentManager*>(
+                  autofill_client_.GetPaymentsAutofillClient()
+                      ->GetVirtualCardEnrollmentManager()),
+              InitVirtualCardEnroll)
+      .Times(0);
+
+  PrepareToFetchCreditCardAndWaitForCallbacks();
+  CreditCardAccessManagerTestBase::FetchCreditCard(&card);
+}
+
+TEST_F(CreditCardAccessManagerTest,
+       DoNotInvokeVirtualCardEnrollmentPreflightCall_CardNotEligible) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(
+      features::
+          kAutofillEnableMultipleRequestInVirtualCardDownstreamEnrollment);
+  auto virtual_card_enrollment_manager =
+      std::make_unique<MockVirtualCardEnrollmentManager>(
+          &personal_data().payments_data_manager(),
+          /*payments_network_interface=*/nullptr, &autofill_client_);
+  autofill_client_.GetPaymentsAutofillClient()
+      ->set_virtual_card_enrollment_manager(
+          std::move(virtual_card_enrollment_manager));
+  CreditCard card = test::GetMaskedServerCard();
+  card.set_virtual_card_enrollment_state(
+      CreditCard::VirtualCardEnrollmentState::kUnenrolledAndNotEligible);
+  personal_data().test_payments_data_manager().AddServerCreditCard(card);
+  EXPECT_CALL(*static_cast<MockVirtualCardEnrollmentManager*>(
+                  autofill_client_.GetPaymentsAutofillClient()
+                      ->GetVirtualCardEnrollmentManager()),
+              InitVirtualCardEnroll)
+      .Times(0);
+
+  PrepareToFetchCreditCardAndWaitForCallbacks();
+  CreditCardAccessManagerTestBase::FetchCreditCard(&card);
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
index 8602c00b..52159b72 100644
--- a/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/credit_card_save_manager_unittest.cc
@@ -48,6 +48,7 @@
 #include "components/autofill/core/browser/payments/payments_autofill_client.h"
 #include "components/autofill/core/browser/payments/payments_customer_data.h"
 #include "components/autofill/core/browser/payments/payments_util.h"
+#include "components/autofill/core/browser/payments/test/mock_virtual_card_enrollment_manager.h"
 #include "components/autofill/core/browser/payments/test_credit_card_save_manager.h"
 #include "components/autofill/core/browser/payments/test_legal_message_line.h"
 #include "components/autofill/core/browser/payments/test_payments_autofill_client.h"
@@ -306,25 +307,6 @@
   ~MockAutofillClient() override = default;
 };
 
-class MockVirtualCardEnrollmentManager
-    : public TestVirtualCardEnrollmentManager {
- public:
-  using TestVirtualCardEnrollmentManager::TestVirtualCardEnrollmentManager;
-  MOCK_METHOD(
-      void,
-      InitVirtualCardEnroll,
-      (const CreditCard& credit_card,
-       VirtualCardEnrollmentSource virtual_card_enrollment_source,
-       VirtualCardEnrollmentManager::VirtualCardEnrollmentFieldsLoadedCallback
-           virtual_card_enrollment_fields_loaded_callback,
-       std::optional<payments::GetDetailsForEnrollmentResponseDetails>
-           get_details_for_enrollment_response_details,
-       PrefService* user_prefs,
-       VirtualCardEnrollmentManager::RiskAssessmentFunction
-           risk_assessment_function),
-      (override));
-};
-
 }  // namespace
 // The anonymous namespace needs to end here because of `friend`ships between
 // the tests and the production code.
diff --git a/components/autofill/core/browser/payments/test/mock_virtual_card_enrollment_manager.cc b/components/autofill/core/browser/payments/test/mock_virtual_card_enrollment_manager.cc
new file mode 100644
index 0000000..0a76e18
--- /dev/null
+++ b/components/autofill/core/browser/payments/test/mock_virtual_card_enrollment_manager.cc
@@ -0,0 +1,19 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/browser/payments/test/mock_virtual_card_enrollment_manager.h"
+
+namespace autofill {
+
+MockVirtualCardEnrollmentManager::MockVirtualCardEnrollmentManager(
+    PaymentsDataManager* payments_data_manager,
+    payments::TestPaymentsNetworkInterface* payments_network_interface,
+    TestAutofillClient* autofill_client)
+    : TestVirtualCardEnrollmentManager(payments_data_manager,
+                                       payments_network_interface,
+                                       autofill_client) {}
+
+MockVirtualCardEnrollmentManager::~MockVirtualCardEnrollmentManager() = default;
+
+}  // namespace autofill
diff --git a/components/autofill/core/browser/payments/test/mock_virtual_card_enrollment_manager.h b/components/autofill/core/browser/payments/test/mock_virtual_card_enrollment_manager.h
new file mode 100644
index 0000000..359b17d
--- /dev/null
+++ b/components/autofill/core/browser/payments/test/mock_virtual_card_enrollment_manager.h
@@ -0,0 +1,45 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_MOCK_VIRTUAL_CARD_ENROLLMENT_MANAGER_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_MOCK_VIRTUAL_CARD_ENROLLMENT_MANAGER_H_
+
+#include "components/autofill/core/browser/payments/test_virtual_card_enrollment_manager.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace autofill {
+
+class MockVirtualCardEnrollmentManager
+    : public TestVirtualCardEnrollmentManager {
+ public:
+  MockVirtualCardEnrollmentManager(
+      PaymentsDataManager* payments_data_manager,
+      payments::TestPaymentsNetworkInterface* payments_network_interface,
+      TestAutofillClient* autofill_client);
+  ~MockVirtualCardEnrollmentManager() override;
+
+  MOCK_METHOD(
+      void,
+      InitVirtualCardEnroll,
+      (const CreditCard& credit_card,
+       VirtualCardEnrollmentSource virtual_card_enrollment_source,
+       VirtualCardEnrollmentManager::VirtualCardEnrollmentFieldsLoadedCallback
+           virtual_card_enrollment_fields_loaded_callback,
+       std::optional<payments::GetDetailsForEnrollmentResponseDetails>
+           get_details_for_enrollment_response_details,
+       PrefService* user_prefs,
+       VirtualCardEnrollmentManager::RiskAssessmentFunction
+           risk_assessment_function),
+      (override));
+
+  MOCK_METHOD(bool,
+              ShouldContinueExistingDownstreamEnrollment,
+              (const CreditCard& credit_card,
+               VirtualCardEnrollmentSource virtual_card_enrollment_source),
+              (override));
+};
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PAYMENTS_TEST_MOCK_VIRTUAL_CARD_ENROLLMENT_MANAGER_H_
diff --git a/components/autofill/core/browser/payments/virtual_card_enrollment_manager.cc b/components/autofill/core/browser/payments/virtual_card_enrollment_manager.cc
index ae0dce6..8d4ac06 100644
--- a/components/autofill/core/browser/payments/virtual_card_enrollment_manager.cc
+++ b/components/autofill/core/browser/payments/virtual_card_enrollment_manager.cc
@@ -104,7 +104,27 @@
         get_details_for_enrollment_response_details,
     PrefService* user_prefs,
     RiskAssessmentFunction risk_assessment_function) {
-  // If there is any ongoing enrollment, override it.
+  // Check if we should continue existing downstream enrollment, and if so early
+  // return but don't reset the state.
+  if (ShouldContinueExistingDownstreamEnrollment(
+          credit_card, virtual_card_enrollment_source)) {
+    // If enrollment details have been received, run the callback immediately.
+    if (enroll_response_details_received_) {
+      std::move(virtual_card_enrollment_fields_loaded_callback)
+          .Run(&state_.virtual_card_enrollment_fields);
+    } else {
+      // If downstream enrollment has started, but we haven't
+      // received the enrollment details, the
+      // `virtual_card_enrollment_fields_loaded_callback_` will be invoked later
+      // when we receive the response.
+      virtual_card_enrollment_fields_loaded_callback_ =
+          std::move(virtual_card_enrollment_fields_loaded_callback);
+    }
+    return;
+  }
+
+  // Proceed with normal enrollment flow.
+  // Reset ongoing enrollment if there is any.
   Reset();
 
   // If at strike limit, exit enrollment flow.
@@ -405,6 +425,33 @@
   Reset();
 }
 
+bool VirtualCardEnrollmentManager::ShouldContinueExistingDownstreamEnrollment(
+    const CreditCard& credit_card,
+    VirtualCardEnrollmentSource virtual_card_enrollment_source) {
+  // If feature is disabled, we won't start downstream enrollment preflight call
+  // early.
+  if (!base::FeatureList::IsEnabled(
+          features::
+              kAutofillEnableMultipleRequestInVirtualCardDownstreamEnrollment)) {
+    return false;
+  }
+
+  if (virtual_card_enrollment_source !=
+      VirtualCardEnrollmentSource::kDownstream) {
+    return false;
+  }
+
+  bool downstream_enrollment_has_started =
+      state_.virtual_card_enrollment_fields.credit_card == credit_card &&
+      state_.virtual_card_enrollment_fields.virtual_card_enrollment_source ==
+          VirtualCardEnrollmentSource::kDownstream;
+  if (!downstream_enrollment_has_started) {
+    return false;
+  }
+
+  return true;
+}
+
 void VirtualCardEnrollmentManager::OnRiskDataLoadedForVirtualCard(
     const std::string& risk_data) {
   state_.risk_data = risk_data;
diff --git a/components/autofill/core/browser/payments/virtual_card_enrollment_manager.h b/components/autofill/core/browser/payments/virtual_card_enrollment_manager.h
index 5017f82a..fb40576 100644
--- a/components/autofill/core/browser/payments/virtual_card_enrollment_manager.h
+++ b/components/autofill/core/browser/payments/virtual_card_enrollment_manager.h
@@ -271,8 +271,20 @@
   // Cancels the entire Virtual Card enrollment process.
   void OnVirtualCardEnrollmentBubbleCancelled();
 
+  // If downstream enrollment has been started, continue the flow. Return
+  // boolean to indicate whether we do so or instead start the normal enrollment
+  // flow.
+  virtual bool ShouldContinueExistingDownstreamEnrollment(
+      const CreditCard& credit_card,
+      VirtualCardEnrollmentSource virtual_card_enrollment_source);
+
  private:
   friend class VirtualCardEnrollmentManagerTest;
+  FRIEND_TEST_ALL_PREFIXES(
+      DownstreamEnrollmentEarlyPreflightCallCallbackParamTest,
+      InvokedAfterEnrollDetailsReceived);
+  FRIEND_TEST_ALL_PREFIXES(DownstreamEnrollmentEarlyPreflightCallParamTest,
+                           ShouldContinueExistingDownstreamEnrollment);
   FRIEND_TEST_ALL_PREFIXES(VirtualCardEnrollmentManagerTest,
                            OnDidGetDetailsForEnrollResponse);
   FRIEND_TEST_ALL_PREFIXES(VirtualCardEnrollmentManagerTest,
diff --git a/components/autofill/core/browser/payments/virtual_card_enrollment_manager_unittest.cc b/components/autofill/core/browser/payments/virtual_card_enrollment_manager_unittest.cc
index 55c1dd1d..03507f5 100644
--- a/components/autofill/core/browser/payments/virtual_card_enrollment_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/virtual_card_enrollment_manager_unittest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <memory>
 #include <string>
 
 #include "base/functional/callback.h"
@@ -9,6 +10,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/mock_callback.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
 #include "components/autofill/core/browser/data_manager/payments/test_payments_data_manager.h"
@@ -22,6 +24,7 @@
 #include "components/autofill/core/browser/payments/payments_autofill_client.h"
 #include "components/autofill/core/browser/payments/payments_requests/update_virtual_card_enrollment_request.h"
 #include "components/autofill/core/browser/payments/payments_util.h"
+#include "components/autofill/core/browser/payments/test/mock_virtual_card_enrollment_manager.h"
 #include "components/autofill/core/browser/payments/test_legal_message_line.h"
 #include "components/autofill/core/browser/payments/test_payments_network_interface.h"
 #include "components/autofill/core/browser/payments/test_virtual_card_enrollment_manager.h"
@@ -905,4 +908,130 @@
       base::Minutes(1), card_unmasked_from_cache() ? 0 : 1);
 }
 
+class DownstreamEnrollmentEarlyPreflightCallParamTest
+    : public VirtualCardEnrollmentManagerTest,
+      public ::testing::WithParamInterface<
+          std::tuple<bool, VirtualCardEnrollmentSource, bool>> {
+ public:
+  DownstreamEnrollmentEarlyPreflightCallParamTest() {
+    feature_list_.InitWithFeatureState(
+        features::
+            kAutofillEnableMultipleRequestInVirtualCardDownstreamEnrollment,
+        experiment_enabled());
+  }
+
+  // Whether the experiment to support multiple requests in downstream
+  // enrollment is enabled.
+  bool experiment_enabled() const { return std::get<0>(GetParam()); }
+
+  // The source of the enrollment.
+  VirtualCardEnrollmentSource source() const { return std::get<1>(GetParam()); }
+
+  // Whether downstream enrollment for this VirtualCardEnrollmentManager
+  // instance has started or not.
+  bool downstream_enrollment_has_started() const {
+    return std::get<2>(GetParam());
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+INSTANTIATE_TEST_SUITE_P(
+    VirtualCardEnrollmentManagerTest,
+    DownstreamEnrollmentEarlyPreflightCallParamTest,
+    ::testing::Combine(
+        ::testing::Bool(),
+        ::testing::Values(VirtualCardEnrollmentSource::kUpstream,
+                          VirtualCardEnrollmentSource::kDownstream,
+                          VirtualCardEnrollmentSource::kSettingsPage),
+        ::testing::Bool()));
+
+// Tests that ShouldContinueExistingDownstreamEnrollment should return correct
+// values.
+TEST_P(DownstreamEnrollmentEarlyPreflightCallParamTest,
+       ShouldContinueExistingDownstreamEnrollment) {
+  CreditCard card = test::GetMaskedServerCard();
+  card.set_virtual_card_enrollment_state(
+      CreditCard::VirtualCardEnrollmentState::kUnenrolledAndEligible);
+  auto* virtual_card_enrollment_process_state =
+      virtual_card_enrollment_manager_->GetVirtualCardEnrollmentProcessState();
+  if (downstream_enrollment_has_started()) {
+    virtual_card_enrollment_process_state->virtual_card_enrollment_fields
+        .credit_card = card;
+    virtual_card_enrollment_process_state->virtual_card_enrollment_fields
+        .virtual_card_enrollment_source =
+        VirtualCardEnrollmentSource::kDownstream;
+  }
+
+  bool expected = experiment_enabled() &&
+                  source() == VirtualCardEnrollmentSource::kDownstream &&
+                  downstream_enrollment_has_started();
+  EXPECT_EQ(expected,
+            virtual_card_enrollment_manager_
+                ->ShouldContinueExistingDownstreamEnrollment(card, source()));
+}
+
+class DownstreamEnrollmentEarlyPreflightCallCallbackParamTest
+    : public VirtualCardEnrollmentManagerTest,
+      public ::testing::WithParamInterface<bool> {
+ public:
+  // Whether enroll details have been received from the server, when the card
+  // extraction from the form happens.
+  bool enroll_details_received() const { return GetParam(); }
+};
+
+INSTANTIATE_TEST_SUITE_P(
+    VirtualCardEnrollmentManagerTest,
+    DownstreamEnrollmentEarlyPreflightCallCallbackParamTest,
+    ::testing::Bool());
+
+// Tests that callback should be invoked at the right time.
+TEST_P(DownstreamEnrollmentEarlyPreflightCallCallbackParamTest,
+       InvokedAfterEnrollDetailsReceived) {
+  auto mock_manager = NiceMock<MockVirtualCardEnrollmentManager>(
+      &payments_data_manager(), &payments_network_interface(),
+      autofill_client_.get());
+
+  // SetUpOnDidGetDetailsForEnrollResponse call configures the card art image,
+  // so it should be called before the first InitVirtualCardEnroll to set up the
+  // VirtualCardEnrollmentProcessState properly.
+  const TestLegalMessageLine google_legal_message =
+      TestLegalMessageLine("google_test_legal_message");
+  const TestLegalMessageLine issuer_legal_message =
+      TestLegalMessageLine("issuer_test_legal_message");
+  payments::GetDetailsForEnrollmentResponseDetails response =
+      std::move(SetUpOnDidGetDetailsForEnrollResponse(
+          google_legal_message, issuer_legal_message,
+          /*make_image_present=*/true));
+
+  // Simulate InitVirtualCardEnroll call during card unmask.
+  ON_CALL(mock_manager, ShouldContinueExistingDownstreamEnrollment)
+      .WillByDefault(testing::Return(false));
+  mock_manager.VirtualCardEnrollmentManager::InitVirtualCardEnroll(
+      *card_, VirtualCardEnrollmentSource::kDownstream, base::DoNothing());
+
+  // Simulate InitVirtualCardEnroll call after form extraction.
+  ON_CALL(mock_manager, ShouldContinueExistingDownstreamEnrollment)
+      .WillByDefault(testing::Return(true));
+  base::MockCallback<MockVirtualCardEnrollmentManager::
+                         VirtualCardEnrollmentFieldsLoadedCallback>
+      callback;
+  mock_manager.SetEnrollResponseDetailsReceived(enroll_details_received());
+
+  // If enroll details have been received, the callback should be invoked
+  // immediately.
+  EXPECT_CALL(callback, Run).Times(enroll_details_received() ? 1 : 0);
+  mock_manager.VirtualCardEnrollmentManager::InitVirtualCardEnroll(
+      *card_, VirtualCardEnrollmentSource::kDownstream, callback.Get());
+
+  // Otherwise, the callback should be invoked when the details are received.
+  if (!enroll_details_received()) {
+    EXPECT_CALL(callback, Run);
+    mock_manager.OnDidGetDetailsForEnrollResponse(
+        payments::PaymentsAutofillClient::PaymentsRpcResult::kSuccess,
+        response);
+  }
+}
+
 }  // namespace autofill
diff --git a/components/browser_ui/styles/android/BUILD.gn b/components/browser_ui/styles/android/BUILD.gn
index c8a652b..cce4e2a1 100644
--- a/components/browser_ui/styles/android/BUILD.gn
+++ b/components/browser_ui/styles/android/BUILD.gn
@@ -206,6 +206,7 @@
     "java/res/drawable/ic_history_24dp.xml",
     "java/res/drawable/ic_info_outline_grey_16dp.xml",
     "java/res/drawable/ic_info_outline_grey_24dp.xml",
+    "java/res/drawable/ic_keep_24dp.xml",
     "java/res/drawable/ic_language.xml",
     "java/res/drawable/ic_language_24.xml",
     "java/res/drawable/ic_lightbulb_24dp.xml",
diff --git a/components/browser_ui/styles/android/java/res/drawable/ic_keep_24dp.xml b/components/browser_ui/styles/android/java/res/drawable/ic_keep_24dp.xml
new file mode 100644
index 0000000..d7fab13
--- /dev/null
+++ b/components/browser_ui/styles/android/java/res/drawable/ic_keep_24dp.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2025 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportHeight="24"
+    android:viewportWidth="24"
+    android:tint="@macro/default_icon_color">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M16,12L18,14L18,16L13,16L13,22L12,23L11,22L11,16L6,16L6,14L8,12L8,5L7,5L7,3L17,3L17,5L16,5L16,12ZM8.85,14L15.15,14L14,12.85L14,5L10,5L10,12.85L8.85,14ZM12,14L12,14L12,14L12,14L12,14L12,14Z" />
+</vector>
\ No newline at end of file
diff --git a/components/browser_ui/widget/android/java/res/layout/number_roll_view.xml b/components/browser_ui/widget/android/java/res/layout/number_roll_view.xml
index d048421..329d74d 100644
--- a/components/browser_ui/widget/android/java/res/layout/number_roll_view.xml
+++ b/components/browser_ui/widget/android/java/res/layout/number_roll_view.xml
@@ -18,7 +18,7 @@
         android:id="@+id/up"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_gravity="center_vertical"
+        android:layout_gravity="start|center_vertical"
         android:singleLine="true"
         android:textAppearance="@style/TextAppearance.Headline.Primary" />
 
@@ -26,7 +26,7 @@
         android:id="@+id/down"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_gravity="center_vertical"
+        android:layout_gravity="start|center_vertical"
         android:singleLine="true"
         android:textAppearance="@style/TextAppearance.Headline.Primary" />
 </org.chromium.components.browser_ui.widget.NumberRollView>
diff --git a/components/capture_mode/camera_video_frame_handler.cc b/components/capture_mode/camera_video_frame_handler.cc
index 3bf22eb..94845a2 100644
--- a/components/capture_mode/camera_video_frame_handler.cc
+++ b/components/capture_mode/camera_video_frame_handler.cc
@@ -175,8 +175,8 @@
     auto& frame_info = buffer->frame_info;
     auto frame = media::VideoFrame::WrapExternalData(
         frame_info->pixel_format, frame_info->coded_size,
-        frame_info->visible_rect, frame_info->visible_rect.size(),
-        mapping.GetMemoryAs<uint8_t>(), mapping.size(), frame_info->timestamp);
+        frame_info->visible_rect, frame_info->visible_rect.size(), mapping,
+        frame_info->timestamp);
 
     if (frame) {
       frame->AddDestructionObserver(base::DoNothingWithBoundArgs(mapping_));
diff --git a/components/chromeos_camera/jpeg_encode_accelerator_unittest.cc b/components/chromeos_camera/jpeg_encode_accelerator_unittest.cc
index a849f01..98e16bae3 100644
--- a/components/chromeos_camera/jpeg_encode_accelerator_unittest.cc
+++ b/components/chromeos_camera/jpeg_encode_accelerator_unittest.cc
@@ -658,8 +658,9 @@
       media::VideoFrame::WrapExternalData(
           media::PIXEL_FORMAT_I420, test_image->visible_size,
           gfx::Rect(test_image->visible_size), test_image->visible_size,
-          static_cast<uint8_t*>(in_shm_->mapping.memory()),
-          test_image->image_data.size(), base::TimeDelta());
+          in_shm_->mapping.GetMemoryAsSpan<uint8_t>().first(
+              test_image->image_data.size()),
+          base::TimeDelta());
   LOG_ASSERT(input_frame_.get());
   input_frame_->BackWithSharedMemory(&in_shm_->region);
 
diff --git a/components/chromeos_camera/mojo_jpeg_encode_accelerator_service.cc b/components/chromeos_camera/mojo_jpeg_encode_accelerator_service.cc
index eaca32b..c994a336 100644
--- a/components/chromeos_camera/mojo_jpeg_encode_accelerator_service.cc
+++ b/components/chromeos_camera/mojo_jpeg_encode_accelerator_service.cc
@@ -262,15 +262,12 @@
     return;
   }
 
-  const uint8_t* input_shm_memory =
-      input_mapping.GetMemoryAsSpan<uint8_t>().data();
   scoped_refptr<media::VideoFrame> frame = media::VideoFrame::WrapExternalData(
       media::PIXEL_FORMAT_I420,  // format
       coded_size,                // coded_size
       gfx::Rect(coded_size),     // visible_rect
       coded_size,                // natural_size
-      input_shm_memory,          // data
-      input_buffer_size,         // data_size
+      input_mapping,             // data
       base::TimeDelta());        // timestamp
   if (!frame.get()) {
     LOG(ERROR) << "Could not create VideoFrame for buffer id " << task_id;
diff --git a/components/chromeos_camera/mojo_mjpeg_decode_accelerator_service.cc b/components/chromeos_camera/mojo_mjpeg_decode_accelerator_service.cc
index b174a4c..9269556 100644
--- a/components/chromeos_camera/mojo_mjpeg_decode_accelerator_service.cc
+++ b/components/chromeos_camera/mojo_mjpeg_decode_accelerator_service.cc
@@ -238,14 +238,12 @@
     return;
   }
 
-  uint8_t* shm_memory = mapping.GetMemoryAsSpan<uint8_t>().data();
   scoped_refptr<media::VideoFrame> frame = media::VideoFrame::WrapExternalData(
       media::PIXEL_FORMAT_I420,  // format
       coded_size,                // coded_size
       gfx::Rect(coded_size),     // visible_rect
       coded_size,                // natural_size
-      shm_memory,                // data
-      output_buffer_size,        // data_size
+      mapping,                   // data
       base::TimeDelta());        // timestamp
   if (!frame.get()) {
     LOG(ERROR) << "Could not create VideoFrame for input buffer id "
diff --git a/components/collaboration_strings.grdp b/components/collaboration_strings.grdp
index 20f0f45..c2351c4 100644
--- a/components/collaboration_strings.grdp
+++ b/components/collaboration_strings.grdp
@@ -117,6 +117,15 @@
   <!-- Error Messages -->
   <!-- /Data Sharing -->
 
+  <!-- Versioning -->
+  <message name="IDS_COLLABORATION_SHARED_TAB_GROUPS_PANEL_OUT_OF_DATE_MESSAGE_CELL_TEXT" desc="Text for the out-of-date cell that can appear at the top of the tab groups panel when the app is out-of-date to support shared tab groups.">
+    Update Chrome to continue using your shared tab groups
+  </message>
+  <message name="IDS_COLLABORATION_SHARED_TAB_GROUPS_AVAILABLE_AGAIN_IPH_MESSAGE" desc="The text that appears in the in-product help tooltip anchored on the tab groups panel when the shared tab groups are available again (typically after having updated the app).">
+    Your shared tab groups are available again
+  </message>
+  <!-- Versioning -->
+
   <!-- Recent Activity -->
   <message name="IDS_DATA_SHARING_RECENT_ACTIVITY_USER_SELF" desc="Text on a recent activity bottom sheet row that indicates that the user themselves took an action, e.g. user themselves changed the tab as opposed to another user changing the tab. Used as the first part of another string.">
     You
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TAB_GROUPS_AVAILABLE_AGAIN_IPH_MESSAGE.png.sha1 b/components/collaboration_strings_grdp/IDS_COLLABORATION_SHARED_TAB_GROUPS_AVAILABLE_AGAIN_IPH_MESSAGE.png.sha1
similarity index 100%
rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TAB_GROUPS_AVAILABLE_AGAIN_IPH_MESSAGE.png.sha1
rename to components/collaboration_strings_grdp/IDS_COLLABORATION_SHARED_TAB_GROUPS_AVAILABLE_AGAIN_IPH_MESSAGE.png.sha1
diff --git a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_TAB_GROUPS_PANEL_OUT_OF_DATE_MESSAGE_CELL_TEXT.png.sha1 b/components/collaboration_strings_grdp/IDS_COLLABORATION_SHARED_TAB_GROUPS_PANEL_OUT_OF_DATE_MESSAGE_CELL_TEXT.png.sha1
similarity index 100%
rename from ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_TAB_GROUPS_PANEL_OUT_OF_DATE_MESSAGE_CELL_TEXT.png.sha1
rename to components/collaboration_strings_grdp/IDS_COLLABORATION_SHARED_TAB_GROUPS_PANEL_OUT_OF_DATE_MESSAGE_CELL_TEXT.png.sha1
diff --git a/components/components_strings.grd b/components/components_strings.grd
index cd2214f6..4282e47 100644
--- a/components/components_strings.grd
+++ b/components/components_strings.grd
@@ -378,6 +378,9 @@
       <message name="IDS_ADD" desc="Used for Add on buttons">
         Add
       </message>
+      <message name="IDS_MOVE" desc="Used for Move on buttons" formatter_data="android_java">
+        Move
+      </message>
       <message name="IDS_REMOVE" desc="Used for Remove on buttons">
         Remove
       </message>
diff --git a/components/components_strings_grd/IDS_MOVE.png.sha1 b/components/components_strings_grd/IDS_MOVE.png.sha1
new file mode 100644
index 0000000..04c1a5d8
--- /dev/null
+++ b/components/components_strings_grd/IDS_MOVE.png.sha1
@@ -0,0 +1 @@
+51347137bf4f3afab3098863b3311ce475ef79d9
\ No newline at end of file
diff --git a/components/content_settings/android/BUILD.gn b/components/content_settings/android/BUILD.gn
index 7e7b544f..50b0d1aa 100644
--- a/components/content_settings/android/BUILD.gn
+++ b/components/content_settings/android/BUILD.gn
@@ -71,6 +71,5 @@
 
 java_cpp_strings("java_pref_names_srcjar") {
   sources = [ "//components/content_settings/core/common/pref_names.h" ]
-
-  template = "java_templates/PrefNames.java.tmpl"
+  class_name = "org.chromium.components.content_settings.PrefNames"
 }
diff --git a/components/content_settings/android/java_templates/PrefNames.java.tmpl b/components/content_settings/android/java_templates/PrefNames.java.tmpl
deleted file mode 100644
index d1f680e..0000000
--- a/components/content_settings/android/java_templates/PrefNames.java.tmpl
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.content_settings;
-
-/** Contains content settings related preference names (keys). */
-public final class PrefNames {{
-
-{NATIVE_STRINGS}
-
-    // Prevents instantiation.
-    private PrefNames() {{}}
-}}
diff --git a/components/embedder_support/android/metrics/BUILD.gn b/components/embedder_support/android/metrics/BUILD.gn
index d48744c..d0ae9d62 100644
--- a/components/embedder_support/android/metrics/BUILD.gn
+++ b/components/embedder_support/android/metrics/BUILD.gn
@@ -50,7 +50,7 @@
   # External code should depend on ":java" instead.
   visibility = [ ":*" ]
   sources = [ "features.cc" ]
-  template = "java_templates/AndroidMetricsFeatures.java.tmpl"
+  class_name = "org.chromium.components.metrics.AndroidMetricsFeatures"
 }
 
 android_library("java") {
diff --git a/components/embedder_support/android/metrics/java_templates/AndroidMetricsFeatures.java.tmpl b/components/embedder_support/android/metrics/java_templates/AndroidMetricsFeatures.java.tmpl
deleted file mode 100644
index 4aeee89..0000000
--- a/components/embedder_support/android/metrics/java_templates/AndroidMetricsFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.metrics;
-
-/**
- * Contains features that are specific to android metrics.
- */
-public final class AndroidMetricsFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Prevents instantiation.
-    private AndroidMetricsFeatures() {{}}
-}}
diff --git a/components/gwp_asan/client/android/BUILD.gn b/components/gwp_asan/client/android/BUILD.gn
index 572ab3d4..66d615c 100644
--- a/components/gwp_asan/client/android/BUILD.gn
+++ b/components/gwp_asan/client/android/BUILD.gn
@@ -13,7 +13,7 @@
   # External code should depend on `:gwp_asan_java` instead.
   visibility = [ ":*" ]
   sources = [ "//components/gwp_asan/client/gwp_asan_features.cc" ]
-  template = "org/chromium/components/gwp_asan/GwpAsanFeatures.java.tmpl"
+  class_name = "org.chromium.components.gwp_asan.GwpAsanFeatures"
 }
 
 android_library("gwp_asan_java") {
diff --git a/components/gwp_asan/client/android/org/chromium/components/gwp_asan/GwpAsanFeatures.java.tmpl b/components/gwp_asan/client/android/org/chromium/components/gwp_asan/GwpAsanFeatures.java.tmpl
deleted file mode 100644
index e31bf3a..0000000
--- a/components/gwp_asan/client/android/org/chromium/components/gwp_asan/GwpAsanFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.gwp_asan;
-
-/**
- * Contains features that are specific to GWP-ASan.
- */
-public final class GwpAsanFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Prevents instantiation.
-    private GwpAsanFeatures() {{}}
-}}
diff --git a/components/input/touchpad_pinch_event_queue_unittest.cc b/components/input/touchpad_pinch_event_queue_unittest.cc
index f8ac3b8..49e5d9e 100644
--- a/components/input/touchpad_pinch_event_queue_unittest.cc
+++ b/components/input/touchpad_pinch_event_queue_unittest.cc
@@ -7,6 +7,7 @@
 #include <string>
 
 #include "base/functional/bind.h"
+#include "base/functional/callback_helpers.h"
 #include "components/input/event_with_latency_info.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/components/invalidation/invalidation_listener_impl.cc b/components/invalidation/invalidation_listener_impl.cc
index 466db401..ee790b4 100644
--- a/components/invalidation/invalidation_listener_impl.cc
+++ b/components/invalidation/invalidation_listener_impl.cc
@@ -12,6 +12,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/task/sequenced_task_runner.h"
 #include "components/gcm_driver/gcm_driver.h"
 #include "components/gcm_driver/instance_id/instance_id.h"
 #include "components/gcm_driver/instance_id/instance_id_driver.h"
diff --git a/components/lens/BUILD.gn b/components/lens/BUILD.gn
index cbdd847..824dfd97e3a 100644
--- a/components/lens/BUILD.gn
+++ b/components/lens/BUILD.gn
@@ -30,6 +30,8 @@
     "lens_overlay_metrics.h",
     "lens_overlay_mime_type.h",
     "lens_overlay_new_tab_source.h",
+    "lens_overlay_request_id_generator.cc",
+    "lens_overlay_request_id_generator.h",
     "lens_overlay_side_panel_menu_option.h",
     "lens_overlay_side_panel_result.h",
     "lens_permission_user_action.h",
@@ -42,6 +44,7 @@
   ]
   deps = [
     "//base:base",
+    "//components/base32",
     "//components/lens:lens_mojo",
     "//components/lens/proto/v1:lens_latencies_metadata_proto",
     "//components/signin/public/identity_manager",
@@ -49,6 +52,7 @@
     "//net",
     "//services/metrics/public/cpp:metrics_cpp",
     "//services/metrics/public/cpp:ukm_builders",
+    "//third_party/lens_server_proto:lens_overlay_proto",
     "//url",
   ]
   public_deps = [ ":features" ]
@@ -78,14 +82,19 @@
 
 source_set("unit_tests") {
   testonly = true
-  sources = [ "lens_url_utils_unittest.cc" ]
+  sources = [
+    "lens_overlay_request_id_generator_unittest.cc",
+    "lens_url_utils_unittest.cc",
+  ]
 
   deps = [
     ":lens",
     "//base",
     "//base/test:test_support",
+    "//components/base32",
     "//testing/gmock",
     "//testing/gtest",
+    "//third_party/lens_server_proto:lens_overlay_proto",
     "//url",
   ]
 }
diff --git a/components/lens/DEPS b/components/lens/DEPS
index 9afd5a4..4851e73 100644
--- a/components/lens/DEPS
+++ b/components/lens/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+components/base32",
   "+components/prefs",
   "+components/signin/public/identity_manager",
   "+components/sync",
@@ -7,5 +8,6 @@
   "+google_apis",
   "+net",
   "+services/metrics/public/cpp",
+  "+third_party/lens_server_proto",
   "+ui/gfx/geometry/size_f.h",
 ]
\ No newline at end of file
diff --git a/chrome/browser/ui/lens/lens_overlay_request_id_generator.cc b/components/lens/lens_overlay_request_id_generator.cc
similarity index 97%
rename from chrome/browser/ui/lens/lens_overlay_request_id_generator.cc
rename to components/lens/lens_overlay_request_id_generator.cc
index 6239c898..af8ca52 100644
--- a/chrome/browser/ui/lens/lens_overlay_request_id_generator.cc
+++ b/components/lens/lens_overlay_request_id_generator.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/lens/lens_overlay_request_id_generator.h"
+#include "components/lens/lens_overlay_request_id_generator.h"
 
 #include "base/check.h"
 #include "base/containers/span.h"
diff --git a/chrome/browser/ui/lens/lens_overlay_request_id_generator.h b/components/lens/lens_overlay_request_id_generator.h
similarity index 94%
rename from chrome/browser/ui/lens/lens_overlay_request_id_generator.h
rename to components/lens/lens_overlay_request_id_generator.h
index 0370144..3816e765f 100644
--- a/chrome/browser/ui/lens/lens_overlay_request_id_generator.h
+++ b/components/lens/lens_overlay_request_id_generator.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_LENS_LENS_OVERLAY_REQUEST_ID_GENERATOR_H_
-#define CHROME_BROWSER_UI_LENS_LENS_OVERLAY_REQUEST_ID_GENERATOR_H_
+#ifndef COMPONENTS_LENS_LENS_OVERLAY_REQUEST_ID_GENERATOR_H_
+#define COMPONENTS_LENS_LENS_OVERLAY_REQUEST_ID_GENERATOR_H_
 
 #include <optional>
 
@@ -109,4 +109,4 @@
 
 }  // namespace lens
 
-#endif  // CHROME_BROWSER_UI_LENS_LENS_OVERLAY_REQUEST_ID_GENERATOR_H_
+#endif  // COMPONENTS_LENS_LENS_OVERLAY_REQUEST_ID_GENERATOR_H_
diff --git a/chrome/browser/ui/lens/lens_overlay_request_id_generator_unittest.cc b/components/lens/lens_overlay_request_id_generator_unittest.cc
similarity index 98%
rename from chrome/browser/ui/lens/lens_overlay_request_id_generator_unittest.cc
rename to components/lens/lens_overlay_request_id_generator_unittest.cc
index cba10d2..8c37632e 100644
--- a/chrome/browser/ui/lens/lens_overlay_request_id_generator_unittest.cc
+++ b/components/lens/lens_overlay_request_id_generator_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/lens/lens_overlay_request_id_generator.h"
+#include "components/lens/lens_overlay_request_id_generator.h"
 
 #include <memory>
 #include <string>
@@ -48,10 +48,12 @@
   ASSERT_EQ(first_id->image_sequence_id(), 1);
   ASSERT_EQ(first_id->long_context_id(), 0);
 
+  #if !BUILDFLAG(IS_IOS)
   // Verify that the initial request id is only generated once.
   EXPECT_DEATH(request_id_generator.GetNextRequestId(
                    RequestIdUpdateMode::kInitialRequest),
                "");
+  #endif
 }
 
 TEST_F(LensOverlayRequestIdGeneratorTest,
@@ -69,10 +71,12 @@
   ASSERT_EQ(first_id->image_sequence_id(), 1);
   ASSERT_EQ(first_id->long_context_id(), 1);
 
+  #if !BUILDFLAG(IS_IOS)
   // Verify that the initial request id is only generated once.
   EXPECT_DEATH(request_id_generator.GetNextRequestId(
                    RequestIdUpdateMode::kInitialRequest),
                "");
+  #endif
 }
 
 TEST_F(LensOverlayRequestIdGeneratorTest,
diff --git a/components/live_caption/views/caption_bubble.cc b/components/live_caption/views/caption_bubble.cc
index 89c22cb..e67bf5f1 100644
--- a/components/live_caption/views/caption_bubble.cc
+++ b/components/live_caption/views/caption_bubble.cc
@@ -44,6 +44,8 @@
 #include "ui/compositor/layer.h"
 #include "ui/events/event.h"
 #include "ui/gfx/animation/slide_animation.h"
+#include "ui/gfx/font.h"
+#include "ui/gfx/font_list.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/geometry/rounded_corners_f.h"
 #include "ui/gfx/geometry/vector2d.h"
@@ -116,6 +118,13 @@
   return css_string;
 }
 
+gfx::FontList GetNewFontList(const std::vector<std::string>& font_names,
+                             int font_style,
+                             int font_size,
+                             gfx::Font::Weight font_weight) {
+  return gfx::FontList(font_names, font_style, font_size, font_weight);
+}
+
 // Parses a CSS color string that is in the form rgba and has a non-zero alpha
 // value into an SkColor and sets it to be the value of the passed-in SkColor
 // address. Returns whether or not the operation was a success.
@@ -552,7 +561,8 @@
       destroyed_callback_(std::move(destroyed_callback)),
       application_locale_(application_locale),
       is_expanded_(caption_bubble_settings_->GetLiveCaptionBubbleExpanded()),
-      controls_animation_(this) {
+      controls_animation_(this),
+      new_font_list_getter_(base::BindRepeating(GetNewFontList)) {
   SetButtons(static_cast<int>(ui::mojom::DialogButton::kNone));
   // While not shown, the title is still used to identify the window in the
   // window switcher.
@@ -1246,8 +1256,11 @@
   font_names.push_back(kPrimaryFont);
   font_names.push_back(kSecondaryFont);
   font_names.push_back(kTertiaryFont);
+#if BUILDFLAG(IS_CHROMEOS)
+  font_names.push_back(kArabicFont);
+#endif
 
-  const gfx::FontList font_list = gfx::FontList(
+  const gfx::FontList font_list = new_font_list_getter_.Run(
       font_names, gfx::Font::FontStyle::NORMAL,
       font_size * GetTextScaleFactor(), gfx::Font::Weight::NORMAL);
   return font_list;
@@ -1621,6 +1634,10 @@
   return generic_error_message_->GetVisible();
 }
 
+void CaptionBubble::SetNewFontListGetterForTesting(NewFontListGetter callback) {
+  new_font_list_getter_ = std::move(callback);
+}
+
 void CaptionBubble::SetCaptionBubbleStyle() {
   SetTextSizeAndFontFamily();
   if (GetWidget()) {
diff --git a/components/live_caption/views/caption_bubble.h b/components/live_caption/views/caption_bubble.h
index 5570ec1..5968f04 100644
--- a/components/live_caption/views/caption_bubble.h
+++ b/components/live_caption/views/caption_bubble.h
@@ -18,6 +18,7 @@
 #include "components/live_caption/views/translation_view_wrapper_base.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/gfx/animation/slide_animation.h"
+#include "ui/gfx/font.h"
 #include "ui/gfx/font_list.h"
 #include "ui/native_theme/caption_style.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
@@ -77,6 +78,12 @@
   METADATA_HEADER(CaptionBubble, views::BubbleDialogDelegateView)
 
  public:
+  using NewFontListGetter = base::RepeatingCallback<gfx::FontList(
+      const std::vector<std::string>& font_names,
+      int font_style,
+      int font_size,
+      gfx::Font::Weight font_weight)>;
+
   CaptionBubble(
       CaptionBubbleSettings* caption_bubble_settings,
       std::unique_ptr<TranslationViewWrapperBase> translation_view_wrapper,
@@ -111,6 +118,7 @@
   views::MdTextButton* GetScrollLockButtonForTesting();
   views::View* GetHeaderForTesting();
   TranslationViewWrapperBase* GetTranslationViewWrapperForTesting();
+  void SetNewFontListGetterForTesting(NewFontListGetter callback);
 
   void SetCaptionBubbleStyle();
 
@@ -308,6 +316,8 @@
 
   base::CallbackListSubscription title_text_changed_callback_;
 
+  NewFontListGetter new_font_list_getter_;
+
   base::WeakPtrFactory<CaptionBubble> weak_ptr_factory_{this};
 };
 
diff --git a/components/live_caption/views/format_constants.h b/components/live_caption/views/format_constants.h
index 2df51b94..543b5ca2 100644
--- a/components/live_caption/views/format_constants.h
+++ b/components/live_caption/views/format_constants.h
@@ -32,6 +32,9 @@
 inline constexpr char kPrimaryFont[] = "Roboto";
 inline constexpr char kSecondaryFont[] = "Arial";
 inline constexpr char kTertiaryFont[] = "sans-serif";
+#if BUILDFLAG(IS_CHROMEOS)
+inline constexpr char kArabicFont[] = "Noto Sans Arabic UI";
+#endif
 inline constexpr int kFontSizePx = 16;
 inline constexpr int kLiveTranslateLabelFontSizePx = 11;
 inline constexpr double kDefaultRatioInParentX = 0.5;
diff --git a/components/media_router/common/providers/cast/certificate/cast_cert_validator.cc b/components/media_router/common/providers/cast/certificate/cast_cert_validator.cc
index d17f58c..37ad329d 100644
--- a/components/media_router/common/providers/cast/certificate/cast_cert_validator.cc
+++ b/components/media_router/common/providers/cast/certificate/cast_cert_validator.cc
@@ -23,9 +23,9 @@
 #include "components/media_router/common/providers/cast/certificate/cast_crl.h"
 #include "components/media_router/common/providers/cast/certificate/cast_trust_store.h"
 #include "components/media_router/common/providers/cast/certificate/switches.h"
+#include "crypto/evp.h"
 #include "net/cert/time_conversions.h"
 #include "net/cert/x509_util.h"
-#include "third_party/boringssl/src/include/openssl/bytestring.h"
 #include "third_party/boringssl/src/include/openssl/digest.h"
 #include "third_party/boringssl/src/include/openssl/evp.h"
 #include "third_party/boringssl/src/pki/cert_issuer_source_static.h"
@@ -187,10 +187,9 @@
   }
 
   // Get the public key for the certificate.
-  CBS spki;
-  CBS_init(&spki, cert->tbs().spki_tlv.data(), cert->tbs().spki_tlv.size());
-  bssl::UniquePtr<EVP_PKEY> key(EVP_parse_public_key(&spki));
-  if (!key || CBS_len(&spki) != 0) {
+  bssl::UniquePtr<EVP_PKEY> key =
+      crypto::evp::PublicKeyFromBytes(cert->tbs().spki_tlv);
+  if (!key) {
     return false;
   }
 
diff --git a/components/media_router/common/providers/cast/certificate/cast_crl.cc b/components/media_router/common/providers/cast/certificate/cast_crl.cc
index c0571995..2048d91a 100644
--- a/components/media_router/common/providers/cast/certificate/cast_crl.cc
+++ b/components/media_router/common/providers/cast/certificate/cast_crl.cc
@@ -19,10 +19,10 @@
 #include "base/memory/singleton.h"
 #include "base/time/time.h"
 #include "components/media_router/common/providers/cast/certificate/cast_fallback_crl.h"
+#include "crypto/evp.h"
 #include "crypto/sha2.h"
 #include "net/cert/time_conversions.h"
 #include "net/cert/x509_util.h"
-#include "third_party/boringssl/src/include/openssl/bytestring.h"
 #include "third_party/boringssl/src/include/openssl/digest.h"
 #include "third_party/boringssl/src/include/openssl/evp.h"
 #include "third_party/boringssl/src/pki/cert_errors.h"
@@ -146,11 +146,9 @@
     return false;
   }
 
-  CBS spki;
-  CBS_init(&spki, parsed_cert->tbs().spki_tlv.data(),
-           parsed_cert->tbs().spki_tlv.size());
-  bssl::UniquePtr<EVP_PKEY> pubkey(EVP_parse_public_key(&spki));
-  if (!pubkey || CBS_len(&spki) != 0) {
+  bssl::UniquePtr<EVP_PKEY> pubkey =
+      crypto::evp::PublicKeyFromBytes(parsed_cert->tbs().spki_tlv);
+  if (!pubkey) {
     VLOG(2) << "CRL - Parsing public key failed";
 #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
     return false;
diff --git a/components/media_router/common/providers/cast/certificate/net_parsed_certificate.cc b/components/media_router/common/providers/cast/certificate/net_parsed_certificate.cc
index 8f922f2..7b2eb5d0 100644
--- a/components/media_router/common/providers/cast/certificate/net_parsed_certificate.cc
+++ b/components/media_router/common/providers/cast/certificate/net_parsed_certificate.cc
@@ -10,9 +10,9 @@
 #include "components/media_router/common/providers/cast/certificate/net_parsed_certificate.h"
 
 #include "base/containers/contains.h"
+#include "crypto/evp.h"
 #include "net/cert/time_conversions.h"
 #include "net/cert/x509_util.h"
-#include "third_party/boringssl/src/include/openssl/bytestring.h"
 #include "third_party/boringssl/src/include/openssl/digest.h"
 #include "third_party/boringssl/src/include/openssl/evp.h"
 #include "third_party/boringssl/src/pki/input.h"
@@ -157,10 +157,9 @@
   // TODO(davidben): This function only uses BoringSSL functions and the SPKI,
   // which is already exported as GetSpkiTlv(). Remove this method altogether
   // and move this into openscreen.
-  CBS spki;
-  CBS_init(&spki, cert_->tbs().spki_tlv.data(), cert_->tbs().spki_tlv.size());
-  bssl::UniquePtr<EVP_PKEY> pubkey(EVP_parse_public_key(&spki));
-  if (!pubkey || CBS_len(&spki) != 0) {
+  bssl::UniquePtr<EVP_PKEY> pubkey =
+      crypto::evp::PublicKeyFromBytes(cert_->tbs().spki_tlv);
+  if (!pubkey) {
     return false;
   }
 
diff --git a/components/metrics/BUILD.gn b/components/metrics/BUILD.gn
index 21f19c3..dbc0182 100644
--- a/components/metrics/BUILD.gn
+++ b/components/metrics/BUILD.gn
@@ -50,16 +50,14 @@
     # External code should depend on ":foo_java" instead.
     visibility = [ ":*" ]
     sources = [ "//components/metrics/metrics_features.cc" ]
-    template =
-        "//components/metrics/android/java_templates/MetricsFeatures.java.tmpl"
+    class_name = "org.chromium.components.metrics.MetricsFeatures"
   }
 
   java_cpp_strings("java_switches_srcjar") {
     # External code should depend on ":metrics_java" instead.
     visibility = [ ":*" ]
     sources = [ "//components/metrics/metrics_switches.cc" ]
-    template =
-        "//components/metrics/android/java_templates/MetricsSwitches.java.tmpl"
+    class_name = "org.chromium.components.metrics.MetricsSwitches"
   }
 
   java_cpp_enum("java_enum_srcjar") {
diff --git a/components/metrics/android/java_templates/MetricsFeatures.java.tmpl b/components/metrics/android/java_templates/MetricsFeatures.java.tmpl
deleted file mode 100644
index 99d9f95..0000000
--- a/components/metrics/android/java_templates/MetricsFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.metrics;
-
-/**
- * Contains features that are specific to metrics.
- */
-public final class MetricsFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Prevents instantiation.
-    private MetricsFeatures() {{}}
-}}
\ No newline at end of file
diff --git a/components/metrics/android/java_templates/MetricsSwitches.java.tmpl b/components/metrics/android/java_templates/MetricsSwitches.java.tmpl
deleted file mode 100644
index 638e62a..0000000
--- a/components/metrics/android/java_templates/MetricsSwitches.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.metrics;
-
-/**
- * Contains command line switches that are specific to the metrics component.
- */
-public final class MetricsSwitches {{
-
-{NATIVE_STRINGS}
-
-    // Prevents instantiation.
-    private MetricsSwitches() {{}}
-}}
diff --git a/components/mirroring/service/video_capture_client.cc b/components/mirroring/service/video_capture_client.cc
index 5c21e7d..7be99d2 100644
--- a/components/mirroring/service/video_capture_client.cc
+++ b/components/mirroring/service/video_capture_client.cc
@@ -235,8 +235,7 @@
       frame = media::VideoFrame::WrapExternalData(
           buffer->info->pixel_format, buffer->info->coded_size,
           buffer->info->visible_rect, buffer->info->visible_rect.size(),
-          mapping.GetMemoryAs<uint8_t>(), frame_allocation_size,
-          buffer->info->timestamp);
+          mapping, buffer->info->timestamp);
     }
     buffer_finished_callback =
         base::BindPostTaskToCurrentDefault(base::BindOnce(
@@ -254,8 +253,7 @@
       frame = media::VideoFrame::WrapExternalData(
           buffer->info->pixel_format, buffer->info->coded_size,
           buffer->info->visible_rect, buffer->info->visible_rect.size(),
-          mapping.GetMemoryAs<uint8_t>(), frame_allocation_size,
-          buffer->info->timestamp);
+          mapping, buffer->info->timestamp);
       if (frame) {
         frame->BackWithOwnedSharedMemory(std::move(shm_region),
                                          std::move(mapping));
diff --git a/components/network_session_configurator/android/BUILD.gn b/components/network_session_configurator/android/BUILD.gn
index eaf3784..9dab022 100644
--- a/components/network_session_configurator/android/BUILD.gn
+++ b/components/network_session_configurator/android/BUILD.gn
@@ -11,7 +11,7 @@
   visibility = [ ":*" ]
   sources =
       [ "//components/network_session_configurator/common/network_switches.cc" ]
-  template = "NetworkSessionSwitches.java.tmpl"
+  class_name = "org.chromium.components.network_session_configurator.NetworkSessionSwitches"
 }
 
 # If there's already an android_library target, you can add
diff --git a/components/network_session_configurator/android/NetworkSessionSwitches.java.tmpl b/components/network_session_configurator/android/NetworkSessionSwitches.java.tmpl
deleted file mode 100644
index 31d47dd..0000000
--- a/components/network_session_configurator/android/NetworkSessionSwitches.java.tmpl
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.network_session_configurator;
-
-/**
-* Contains command line switches that are specific to
-* configuring network sessions via network_session_configurator.
-*/
-public final class NetworkSessionSwitches {{
-
-{NATIVE_STRINGS}
-
-   // Prevents instantiation.
-   private NetworkSessionSwitches() {{}}
-}}
-
diff --git a/components/omnibox/common/BUILD.gn b/components/omnibox/common/BUILD.gn
index 6e3210d..37d4e8be 100644
--- a/components/omnibox/common/BUILD.gn
+++ b/components/omnibox/common/BUILD.gn
@@ -41,7 +41,7 @@
   java_cpp_features("java_features_srcjar") {
     visibility = [ ":*" ]
     sources = [ "//components/omnibox/common/omnibox_features.cc" ]
-    template = "//components/omnibox/common/java_templates/OmniboxFeatureList.java.tmpl"
+    class_name = "org.chromium.components.omnibox.OmniboxFeatureList"
   }
 
   android_library("features_java") {
diff --git a/components/omnibox/common/java_templates/OmniboxFeatureList.java.tmpl b/components/omnibox/common/java_templates/OmniboxFeatureList.java.tmpl
deleted file mode 100644
index 39d6e35..0000000
--- a/components/omnibox/common/java_templates/OmniboxFeatureList.java.tmpl
+++ /dev/null
@@ -1,15 +0,0 @@
- // Copyright 2024 The Chromium Authors
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
-
-package org.chromium.components.omnibox;
-
-/**
- * Contains features that are specific to the Omnibox.
- */
-public class OmniboxFeatureList {{
-    // Non-instantiable.
-    private OmniboxFeatureList() {{}}
-
-{NATIVE_FEATURES}
-}}
diff --git a/components/optimization_guide/content/browser/page_content_proto_util.cc b/components/optimization_guide/content/browser/page_content_proto_util.cc
index 500d3c8..5dd1798 100644
--- a/components/optimization_guide/content/browser/page_content_proto_util.cc
+++ b/components/optimization_guide/content/browser/page_content_proto_util.cc
@@ -789,7 +789,7 @@
 }
 
 bool IsCoordinateInNode(
-    const optimization_guide::proto::Coordinate& coordinate,
+    const gfx::Point& coordinate,
     const optimization_guide::proto::ContentAttributes& node_attributes) {
   if (!node_attributes.geometry().has_visible_bounding_box()) {
     return false;
@@ -807,7 +807,7 @@
     const optimization_guide::proto::DocumentIdentifier&
         current_document_identifier,
     const optimization_guide::proto::ContentNode* current_root_node,
-    const optimization_guide::proto::Coordinate& coordinate,
+    const gfx::Point& coordinate,
     std::optional<TargetNodeInfo> prev_target_node_info) {
   std::vector<const optimization_guide::proto::ContentNode*> nodes_for_walk;
   int highest_z_order = std::numeric_limits<int>::min();
@@ -880,7 +880,7 @@
 std::optional<optimization_guide::TargetNodeInfo> FindNodeAtPoint(
     const optimization_guide::proto::AnnotatedPageContent&
         annotated_page_content,
-    const optimization_guide::proto::Coordinate& coordinate) {
+    const gfx::Point& coordinate) {
   return FindNodeAtPointRecursive(
       annotated_page_content.main_frame_data().document_identifier(),
       &annotated_page_content.root_node(), coordinate, std::nullopt);
diff --git a/components/optimization_guide/content/browser/page_content_proto_util.h b/components/optimization_guide/content/browser/page_content_proto_util.h
index c1d15109..22646753 100644
--- a/components/optimization_guide/content/browser/page_content_proto_util.h
+++ b/components/optimization_guide/content/browser/page_content_proto_util.h
@@ -13,6 +13,7 @@
 #include "components/optimization_guide/proto/features/model_prototyping.pb.h"
 #include "content/public/browser/global_routing_id.h"
 #include "third_party/blink/public/mojom/content_extraction/ai_page_content.mojom-forward.h"
+#include "ui/gfx/geometry/point.h"
 #include "url/origin.h"
 
 namespace optimization_guide {
@@ -63,7 +64,7 @@
 std::optional<optimization_guide::TargetNodeInfo> FindNodeAtPoint(
     const optimization_guide::proto::AnnotatedPageContent&
         annotated_page_content,
-    const optimization_guide::proto::Coordinate& coordinate);
+    const gfx::Point& coordinate);
 
 }  // namespace optimization_guide
 
diff --git a/components/optimization_guide/content/browser/page_content_proto_util_unittest.cc b/components/optimization_guide/content/browser/page_content_proto_util_unittest.cc
index 2b9be20e..511eb6f 100644
--- a/components/optimization_guide/content/browser/page_content_proto_util_unittest.cc
+++ b/components/optimization_guide/content/browser/page_content_proto_util_unittest.cc
@@ -10,6 +10,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/content_extraction/ai_page_content.mojom.h"
 #include "third_party/blink/renderer/platform/graphics/color.h"
+#include "ui/gfx/geometry/point.h"
 
 namespace optimization_guide {
 namespace {
@@ -946,12 +947,8 @@
   SetGeometry(child1, gfx::Rect(10, 10, 20, 20));
   SetZOrder(child1, 1);
 
-  Coordinate coord;
-  // Coordinate outside any node
-  coord.set_x(500);
-  coord.set_y(500);
-
-  std::optional<TargetNodeInfo> result = FindNodeAtPoint(page_content, coord);
+  std::optional<TargetNodeInfo> result =
+      FindNodeAtPoint(page_content, gfx::Point(500, 500));
   EXPECT_EQ(result, std::nullopt);
 }
 
@@ -970,11 +967,8 @@
   SetGeometry(target_child, gfx::Rect(50, 50, 100, 100));
   SetZOrder(target_child, 1);
 
-  Coordinate coord;
-  coord.set_x(75);
-  coord.set_y(75);
-
-  std::optional<TargetNodeInfo> result = FindNodeAtPoint(page_content, coord);
+  std::optional<TargetNodeInfo> result =
+      FindNodeAtPoint(page_content, gfx::Point(75, 75));
   EXPECT_TRUE(result.has_value());
   EXPECT_EQ(result->document_identifier.serialized_token(), main_doc_token);
   EXPECT_EQ(result->node, target_child);
@@ -1000,12 +994,9 @@
   // Higher Z-order
   SetZOrder(child_high_z, 2);
 
-  Coordinate coord;
   // Hits both child_low_z and child_high_z
-  coord.set_x(70);
-  coord.set_y(70);
-
-  std::optional<TargetNodeInfo> result = FindNodeAtPoint(page_content, coord);
+  std::optional<TargetNodeInfo> result =
+      FindNodeAtPoint(page_content, gfx::Point(70, 70));
   EXPECT_TRUE(result.has_value());
   EXPECT_EQ(result->document_identifier.serialized_token(), main_doc_token);
   EXPECT_EQ(result->node, child_high_z);
@@ -1043,11 +1034,8 @@
   SetGeometry(target_node_in_iframe, gfx::Rect(100, 100, 50, 50));
   SetZOrder(target_node_in_iframe, 1);
 
-  Coordinate coord;
-  coord.set_x(120);
-  coord.set_y(120);
-
-  std::optional<TargetNodeInfo> result = FindNodeAtPoint(page_content, coord);
+  std::optional<TargetNodeInfo> result =
+      FindNodeAtPoint(page_content, gfx::Point(120, 120));
   EXPECT_TRUE(result.has_value());
   EXPECT_EQ(result->document_identifier.serialized_token(),
             iframe_internal_token);
@@ -1092,11 +1080,8 @@
   SetGeometry(target_node_in_iframe, gfx::Rect(50, 50, 500, 500));
   SetZOrder(target_node_in_iframe, 1);
 
-  Coordinate coord;
-  coord.set_x(120);
-  coord.set_y(120);
-
-  std::optional<TargetNodeInfo> result = FindNodeAtPoint(page_content, coord);
+  std::optional<TargetNodeInfo> result =
+      FindNodeAtPoint(page_content, gfx::Point(120, 120));
   EXPECT_TRUE(result.has_value());
   EXPECT_EQ(result->document_identifier.serialized_token(),
             iframe_internal_token);
@@ -1139,11 +1124,8 @@
   SetGeometry(target_node_in_iframe, gfx::Rect(150, 150, 50, 50));
   SetZOrder(target_node_in_iframe, 1);
 
-  Coordinate coord;
-  coord.set_x(160);
-  coord.set_y(160);
-
-  std::optional<TargetNodeInfo> result = FindNodeAtPoint(page_content, coord);
+  std::optional<TargetNodeInfo> result =
+      FindNodeAtPoint(page_content, gfx::Point(160, 160));
   EXPECT_TRUE(result.has_value());
   EXPECT_EQ(result->document_identifier.serialized_token(),
             iframe_internal_token);
@@ -1185,11 +1167,8 @@
   SetGeometry(child_node_in_iframe, gfx::Rect(100, 100, 400, 400));
   SetZOrder(child_node_in_iframe, 1);
 
-  Coordinate coord;
-  coord.set_x(60);
-  coord.set_y(60);
-
-  std::optional<TargetNodeInfo> result = FindNodeAtPoint(page_content, coord);
+  std::optional<TargetNodeInfo> result =
+      FindNodeAtPoint(page_content, gfx::Point(60, 60));
   EXPECT_TRUE(result.has_value());
   EXPECT_EQ(result->document_identifier.serialized_token(), "main_doc");
   EXPECT_EQ(result->node, iframe_node_in_main_doc);
diff --git a/components/optimization_guide/core/hints/hints_processing_util.cc b/components/optimization_guide/core/hints/hints_processing_util.cc
index be18ca1..a9799a6 100644
--- a/components/optimization_guide/core/hints/hints_processing_util.cc
+++ b/components/optimization_guide/core/hints/hints_processing_util.cc
@@ -141,6 +141,8 @@
       return "BuyNowPayLaterAllowlistAffirm";
     case proto::OptimizationType::BUY_NOW_PAY_LATER_ALLOWLIST_ZIP:
       return "BuyNowPayLaterAllowlistZip";
+    case proto::OptimizationType::BUY_NOW_PAY_LATER_ALLOWLIST_KLARNA:
+      return "BuyNowPayLaterAllowlistKlarna";
     case proto::OptimizationType::SAVED_TAB_GROUP:
       return "SavedTabGroup";
     case proto::OptimizationType::TEXT_CLASSIFIER_ENTITY_DETECTION:
diff --git a/components/optimization_guide/core/optimization_guide_proto_util.cc b/components/optimization_guide/core/optimization_guide_proto_util.cc
index 4f07c64..ba3bcef3 100644
--- a/components/optimization_guide/core/optimization_guide_proto_util.cc
+++ b/components/optimization_guide/core/optimization_guide_proto_util.cc
@@ -553,25 +553,10 @@
     destination_attribute->set_float_value(attribute.second);
   }
 
-  auto add_bool_attribute = [&destination](ax::mojom::BoolAttribute attr,
-                                           bool value) {
-    auto* dest_attr = destination->add_attributes();
-    dest_attr->set_bool_type(BoolAttributeToProto(attr));
-    dest_attr->set_bool_value(value);
-  };
-
-  if (auto source_bool_vector =
-          std::get_if<std::vector<std::pair<ax::mojom::BoolAttribute, bool>>>(
-              &source.bool_attributes)) {
-    for (const auto& attribute : *source_bool_vector) {
-      add_bool_attribute(attribute.first, attribute.second);
-    }
-  } else if (auto source_bool_bitset =
-                 std::get_if<ui::AXBitset<ax::mojom::BoolAttribute>>(
-                     &source.bool_attributes)) {
-    // TODO: crbug.com/422234724 - Cleanup once expressed as an int pair in the
-    // protobuff.
-    source_bool_bitset->ForEach(add_bool_attribute);
+  for (const auto& attribute : source.bool_attributes) {
+    auto* destination_attribute = destination->add_attributes();
+    destination_attribute->set_bool_type(BoolAttributeToProto(attribute.first));
+    destination_attribute->set_bool_value(attribute.second);
   }
 
   for (const auto& attribute : source.intlist_attributes) {
diff --git a/components/optimization_guide/internal b/components/optimization_guide/internal
index 4bf147b..5130ac8 160000
--- a/components/optimization_guide/internal
+++ b/components/optimization_guide/internal
@@ -1 +1 @@
-Subproject commit 4bf147bd5fd4f2db7396c616574510501af16f4d
+Subproject commit 5130ac88727e4be82deaf63548d1538304dc6e23
diff --git a/components/optimization_guide/proto/hints.proto b/components/optimization_guide/proto/hints.proto
index 5771b06..edf0615b 100644
--- a/components/optimization_guide/proto/hints.proto
+++ b/components/optimization_guide/proto/hints.proto
@@ -143,7 +143,7 @@
 // enum in enums.xml and optimization/histograms.xml for metric recording.
 enum OptimizationType {
   // Values for obsolete optimizations.
-  reserved 11, 12, 16, 29, 32, 66, 72, 73, 89, 94, 95, 96, 98, 99;
+  reserved 11, 12, 16, 29, 32, 66, 72, 73, 89, 94, 95, 96, 98, 99, 101;
 
   TYPE_UNSPECIFIED = 0;
   // This optimization blocks JavaScript on the page.
@@ -327,6 +327,12 @@
   DIGITAL_CREDENTIALS_LOW_FRICTION = 97;
   // Merchant blocklist for card flat rate benefits.
   SHARED_CREDIT_CARD_FLAT_RATE_BENEFITS_BLOCKLIST = 100;
+
+  // TODO(crbug.com/423826272): Add enum 101 for READALOUD_AUDIO_OVERVIEWS.
+
+  // This optimization helps determine if this merchant page is a good candidate
+  // for enabling buy now pay later flow with Klarna.
+  BUY_NOW_PAY_LATER_ALLOWLIST_KLARNA = 102;
 }
 
 // Presents semantics for how page load URLs should be matched.
diff --git a/components/payments/content/android/java/res/layout/secure_payment_confirmation.xml b/components/payments/content/android/java/res/layout/secure_payment_confirmation.xml
index ac2d8973..ebaa2af 100644
--- a/components/payments/content/android/java/res/layout/secure_payment_confirmation.xml
+++ b/components/payments/content/android/java/res/layout/secure_payment_confirmation.xml
@@ -26,8 +26,7 @@
       android:id="@+id/scroll_view"
       android:layout_below="@id/handlebar"
       android:layout_height="wrap_content"
-      android:layout_width="match_parent"
-      android:clickable="true">
+      android:layout_width="match_parent">
 
     <RelativeLayout
         android:layout_height="wrap_content"
diff --git a/components/persistent_cache/backend_params_manager.cc b/components/persistent_cache/backend_params_manager.cc
index 5f260bdb..149aa9e 100644
--- a/components/persistent_cache/backend_params_manager.cc
+++ b/components/persistent_cache/backend_params_manager.cc
@@ -4,23 +4,35 @@
 
 #include "components/persistent_cache/backend_params_manager.h"
 
+#include <cstdint>
+#include <vector>
+
+#include "base/files/file.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/functional/bind.h"
 #include "base/location.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/sequence_checker.h"
 #include "base/strings/strcat.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/task/thread_pool.h"
 #include "components/persistent_cache/sqlite/sqlite_backend_impl.h"
 
 namespace {
 
-constexpr const char kPathSeparator[] = "_";
-constexpr const char kDbFile[] = "db_file";
-constexpr const char kJournalFile[] = "journal_file";
+struct FilePathWithInfo {
+  base::FilePath file_path;
+  base::File::Info info;
+};
+
+const base::FilePath::CharType kDbFile[] = FILE_PATH_LITERAL(".db_file");
+const base::FilePath::CharType kJournalFile[] =
+    FILE_PATH_LITERAL(".journal_file");
 
 constexpr size_t kLruCacheCapacity = 100;
+
 }  // namespace
 
 namespace persistent_cache {
@@ -91,6 +103,85 @@
   base::CreateDirectory(top_directory_);
 }
 
+int64_t BackendParamsManager::BringDownTotalFootprintOfFiles(
+    int64_t target_footprint) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // Clear params cache so they don't hold on to files or prevent their
+  // deletion. BackendParam instances that were vended by this class and
+  // retained somewhere else can still create problems and need to be handled
+  // appropriately.
+  backend_params_map_.Clear();
+
+  int64_t total_footprint = 0;
+  std::vector<FilePathWithInfo> filepaths_with_info;
+  base::FileEnumerator file_enumerator(top_directory_, /*recursive=*/false,
+                                       base::FileEnumerator::FILES);
+
+  file_enumerator.ForEach([&total_footprint, &filepaths_with_info](
+                              const base::FilePath& file_path) {
+    base::File::Info info;
+    base::GetFileInfo(file_path, &info);
+
+    // Only target database files for deletion.
+    if (file_path.MatchesFinalExtension(kDbFile)) {
+      filepaths_with_info.emplace_back(file_path, info);
+    }
+
+    // All files count towards measured footprint.
+    total_footprint += info.size;
+  });
+
+  // Nothing to do.
+  if (total_footprint <= target_footprint) {
+    return 0;
+  }
+
+  // Order files from least to most recently modified to prioritize deleting
+  // older staler files.
+  std::sort(filepaths_with_info.begin(), filepaths_with_info.end(),
+            [](const FilePathWithInfo& left, const FilePathWithInfo& right) {
+              return left.info.last_modified < right.info.last_modified;
+            });
+
+  int64_t size_of_necessary_deletes = total_footprint - target_footprint;
+  int64_t deleted_size = 0;
+
+  for (const FilePathWithInfo& file_path_with_info : filepaths_with_info) {
+    if (size_of_necessary_deletes <= deleted_size) {
+      break;
+    }
+
+    bool db_file_delete_success =
+        base::DeleteFile(file_path_with_info.file_path);
+    base::UmaHistogramBoolean(
+        "PersistentCache.ParamsManager.DbFile.DeleteSucess",
+        db_file_delete_success);
+
+    if (db_file_delete_success) {
+      deleted_size += file_path_with_info.info.size;
+
+      base::FilePath journal_file_path =
+          file_path_with_info.file_path.ReplaceExtension(kJournalFile);
+      base::File::Info journal_file_info;
+      base::GetFileInfo(journal_file_path, &journal_file_info);
+
+      // TODO (https://crbug.com/377475540): Cleanup when deletion of journal
+      // failed.
+      bool journal_file_delete_success = base::DeleteFile(journal_file_path);
+      base::UmaHistogramBoolean(
+          "PersistentCache.ParamsManager.JournalFile.DeleteSucess",
+          journal_file_delete_success);
+
+      if (journal_file_delete_success) {
+        deleted_size += journal_file_info.size;
+      }
+    };
+  }
+
+  return deleted_size;
+}
+
 // static
 BackendParams BackendParamsManager::CreateParamsSync(
     base::FilePath directory,
@@ -107,19 +198,26 @@
     flags |= base::File::FLAG_WRITE;
   }
 
-  // PersistentCache backing files are not executables.
 #if BUILDFLAG(IS_WIN)
+  // PersistentCache backing files are not executables.
   flags |= base::File::FLAG_WIN_NO_EXECUTE;
+
+  // String conversion to wstring necessary on Windows.
+  std::wstring key_part = base::UTF8ToWide(key);
+  base::FilePath db_file_name =
+      base::FilePath(base::StrCat({key_part, kDbFile}));
+  base::FilePath journal_file_name =
+      base::FilePath(base::StrCat({key_part, kJournalFile}));
+#else
+  base::FilePath db_file_name = base::FilePath(base::StrCat({key, kDbFile}));
+  base::FilePath journal_file_name =
+      base::FilePath(base::StrCat({key, kJournalFile}));
 #endif
 
-  params.db_file = base::File(
-      directory.AppendASCII(base::StrCat({key, kPathSeparator, kDbFile})),
-      flags);
+  params.db_file = base::File(directory.Append(db_file_name), flags);
   params.db_file_is_writable = writes_supported;
 
-  params.journal_file = base::File(
-      directory.AppendASCII(base::StrCat({key, kPathSeparator, kJournalFile})),
-      flags);
+  params.journal_file = base::File(directory.Append(journal_file_name), flags);
   params.journal_file_is_writable = writes_supported;
 
   return params;
diff --git a/components/persistent_cache/backend_params_manager.h b/components/persistent_cache/backend_params_manager.h
index b236b8e..1523f071 100644
--- a/components/persistent_cache/backend_params_manager.h
+++ b/components/persistent_cache/backend_params_manager.h
@@ -53,6 +53,12 @@
   // Delete all managed files.
   void DeleteAllFiles();
 
+  // Use to reduce the total size of files on disk until it's equal or smaller
+  // than `target_footprint`. Use when enforcing a quota or proactively saving
+  // space. If the goal is to get rid of all files use `DeleteAllFiles()`
+  // instead. Returns the number of bytes deleted.
+  int64_t BringDownTotalFootprintOfFiles(int64_t target_footprint);
+
  private:
   struct BackendParamsKey {
     BackendType backend_type;
diff --git a/components/persistent_cache/backend_params_manager_unittest.cc b/components/persistent_cache/backend_params_manager_unittest.cc
index 3c36319..6f934af 100644
--- a/components/persistent_cache/backend_params_manager_unittest.cc
+++ b/components/persistent_cache/backend_params_manager_unittest.cc
@@ -3,15 +3,22 @@
 // found in the LICENSE file.
 #include "components/persistent_cache/backend_params_manager.h"
 
+#include <cstdint>
 #include <memory>
 
+#include "base/files/file.h"
 #include "base/files/file_enumerator.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_forward.h"
 #include "base/run_loop.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/test/bind.h"
 #include "base/test/task_environment.h"
+#include "base/threading/platform_thread.h"
+#include "base/time/time.h"
 #include "components/persistent_cache/backend_params.h"
 #include "components/persistent_cache/persistent_cache.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -24,7 +31,7 @@
  protected:
   int CountFiles() {
     base::FileEnumerator file_enumarator(temp_dir_.GetPath(),
-                                         /* recursive=*/true,
+                                         /*recursive=*/true,
                                          base::FileEnumerator::FILES);
     int file_count = 0;
     file_enumarator.ForEach(
@@ -33,8 +40,53 @@
     return file_count;
   }
 
+  std::vector<base::Time> GetSortedModificationTimes() {
+    std::vector<base::Time> modification_times;
+
+    base::FileEnumerator file_enumarator(
+        temp_dir_.GetPath(), /*recursive=*/true, base::FileEnumerator::FILES);
+    file_enumarator.ForEach(
+        [&modification_times](const base::FilePath& file_path) {
+          base::File::Info info;
+          base::GetFileInfo(file_path, &info);
+          modification_times.push_back(info.last_accessed);
+        });
+
+    // Sort so that oldest entries are first.
+    std::sort(modification_times.begin(), modification_times.end());
+
+    return modification_times;
+  }
+
+  void Fill(persistent_cache::BackendParamsManager& params_manager,
+            int64_t file_count,
+            int64_t file_size) {
+    for (int i = 0; i < file_count; ++i) {
+      const std::string key = base::NumberToString(i);
+
+      // Actual sleep is necessary to get timestamp variety since
+      // BackendParamsManager relies on OS file timestamps which are not
+      // affected by mock time.
+      base::PlatformThread::Sleep(base::Milliseconds(5));
+
+      BackendParams params = params_manager.GetOrCreateParamsSync(
+          BackendType::kSqlite, key,
+          BackendParamsManager::AccessRights::kReadWrite);
+      params.db_file.SetLength(file_size);
+    }
+  }
+
+  // Create enough file that are big enough to go over kTargetFootprint.
+  void OverFill(persistent_cache::BackendParamsManager& params_manager) {
+    static constexpr int64_t kFileCount = 10;
+    // Just large enough to ensure the target footprint will be surpassed.
+    static constexpr int64_t kFileSize = (kTargetFootprint / kFileCount) + 100;
+    Fill(params_manager, kFileCount, kFileSize);
+  }
+
+  static constexpr int64_t kTargetFootprint = 20000;
   base::ScopedTempDir temp_dir_;
-  base::test::TaskEnvironment task_environment;
+  base::test::TaskEnvironment task_environment_;
 };
 
 TEST_F(BackendParamsManagerTest,
@@ -147,4 +199,62 @@
   EXPECT_EQ(CountFiles(), 0);
 }
 
+TEST_F(BackendParamsManagerTest, NoFileReductionIfNotNeeded) {
+  const int64_t file_count = 1;
+  const int64_t file_size = 100;
+
+  BackendParamsManager params_manager(temp_dir_.GetPath());
+  Fill(params_manager, file_count, file_size);
+  EXPECT_LE(base::ComputeDirectorySize(temp_dir_.GetPath()), kTargetFootprint);
+
+  // The footprint of the files do not approach the requested target size so
+  // nothing is done.
+  EXPECT_EQ(params_manager.BringDownTotalFootprintOfFiles(file_count *
+                                                          file_size * 10),
+            0);
+}
+
+TEST_F(BackendParamsManagerTest, BringDownTotalFootPrint) {
+  BackendParamsManager params_manager(temp_dir_.GetPath());
+
+  OverFill(params_manager);
+  EXPECT_GE(base::ComputeDirectorySize(temp_dir_.GetPath()), kTargetFootprint);
+
+  EXPECT_GT(params_manager.BringDownTotalFootprintOfFiles(kTargetFootprint), 0);
+
+  EXPECT_LE(base::ComputeDirectorySize(temp_dir_.GetPath()), kTargetFootprint);
+}
+
+TEST_F(BackendParamsManagerTest, OldestEntriesAreRemovedFirst) {
+  BackendParamsManager params_manager(temp_dir_.GetPath());
+
+  OverFill(params_manager);
+
+  std::vector<base::Time> modification_times = GetSortedModificationTimes();
+
+  params_manager.BringDownTotalFootprintOfFiles(kTargetFootprint);
+
+  std::vector<base::Time> modification_times_after_reduction =
+      GetSortedModificationTimes();
+
+  // Verify that the size of the files in the directory actually went down.
+  ASSERT_GT(modification_times.size(),
+            modification_times_after_reduction.size());
+
+  auto original_timestamps_it = modification_times.rbegin();
+  auto timestamps_after_reduction_it =
+      modification_times_after_reduction.rbegin();
+
+  // Verify that the entries removed were the oldest ones or tied for oldest.
+  // The missing timestamps have to be the smallest since the data is sorted.
+  // This test is tolerant of timestamps all being equal for whatever reason.
+  while (timestamps_after_reduction_it !=
+         modification_times_after_reduction.rend()) {
+    EXPECT_EQ(*original_timestamps_it, *timestamps_after_reduction_it);
+
+    ++original_timestamps_it;
+    ++timestamps_after_reduction_it;
+  }
+}
+
 }  // namespace persistent_cache
diff --git a/components/policy/android/BUILD.gn b/components/policy/android/BUILD.gn
index 4c34661..d6ce399c 100644
--- a/components/policy/android/BUILD.gn
+++ b/components/policy/android/BUILD.gn
@@ -17,7 +17,7 @@
   # External code should depend on ":policy_java" instead.
   visibility = [ ":*" ]
   sources = [ "//components/policy/core/common/policy_switches.cc" ]
-  template = "java_templates/PolicySwitches.java.tmpl"
+  class_name = "org.chromium.components.policy.PolicySwitches"
 }
 
 android_library("policy_java") {
diff --git a/components/policy/android/java_templates/PolicySwitches.java.tmpl b/components/policy/android/java_templates/PolicySwitches.java.tmpl
deleted file mode 100644
index a5b1343..0000000
--- a/components/policy/android/java_templates/PolicySwitches.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.policy;
-
-/**
- * Contains command line switches that are specific to the policy component.
- */
-public final class PolicySwitches {{
-
-{NATIVE_STRINGS}
-
-    // Prevents instantiation.
-    private PolicySwitches() {{}}
-}}
diff --git a/components/policy/core/common/policy_loader_common.cc b/components/policy/core/common/policy_loader_common.cc
index 87c66c0c..fec1b1c 100644
--- a/components/policy/core/common/policy_loader_common.cc
+++ b/components/policy/core/common/policy_loader_common.cc
@@ -61,6 +61,7 @@
     key::kCommandLineFlagSecurityWarningsEnabled,
     key::kEnterpriseCustomLabelForBrowser,
     key::kEnterpriseLogoUrlForBrowser,
+    key::kNTPFooterManagementNoticeEnabled,
 #endif
 #if !BUILDFLAG(IS_IOS)
     key::kFirstPartySetsOverrides,
diff --git a/components/policy/resources/templates/policy_definitions/ContentSettings/DefaultThirdPartyStoragePartitioningSetting.yaml b/components/policy/resources/templates/policy_definitions/ContentSettings/DefaultThirdPartyStoragePartitioningSetting.yaml
index 54e5aac..4863bc6 100644
--- a/components/policy/resources/templates/policy_definitions/ContentSettings/DefaultThirdPartyStoragePartitioningSetting.yaml
+++ b/components/policy/resources/templates/policy_definitions/ContentSettings/DefaultThirdPartyStoragePartitioningSetting.yaml
@@ -8,6 +8,8 @@
   If this policy is set to 2 - BlockPartitioning, third-party storage partitioning will be disabled for all contexts.
 
   Use <ph name="THIRD_PARTY_STORAGE_PARTITIONING_BLOCKED_FOR_ORIGINS_POLICY_NAME">ThirdPartyStoragePartitioningBlockedForOrigins</ph> to disable third-party storage partitioning for specific top-level origins. For detailed information on third-party storage partitioning, please see https://developers.google.com/privacy-sandbox/cookies/storage-partitioning.
+
+  This will be removed in Chrome 145, and the requestStorageAccess method is recommended for use instead: https://developer.mozilla.org/en-US/docs/Web/API/Document/requestStorageAccess. Feedback can be left at https://crbug.com/425248669.
 example_value: 1
 features:
   dynamic_refresh: true
diff --git a/components/policy/resources/templates/policy_definitions/ContentSettings/ThirdPartyStoragePartitioningBlockedForOrigins.yaml b/components/policy/resources/templates/policy_definitions/ContentSettings/ThirdPartyStoragePartitioningBlockedForOrigins.yaml
index 8f8d8d0f..a7c703a 100644
--- a/components/policy/resources/templates/policy_definitions/ContentSettings/ThirdPartyStoragePartitioningBlockedForOrigins.yaml
+++ b/components/policy/resources/templates/policy_definitions/ContentSettings/ThirdPartyStoragePartitioningBlockedForOrigins.yaml
@@ -7,6 +7,8 @@
   For detailed information on valid patterns, please see https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Note that patterns you list here are treated as origins, not URLs, so you should not specify a path.
 
   For detailed information on third-party storage partitioning, please see https://developers.google.com/privacy-sandbox/cookies/storage-partitioning.
+
+  This will be removed in Chrome 145, and the requestStorageAccess method is recommended for use instead: https://developer.mozilla.org/en-US/docs/Web/API/Document/requestStorageAccess. Feedback can be left at https://crbug.com/425248669.
 example_value:
 - www.example.com
 - '[*.]example.edu'
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/DeviceUserInitiatedFirmwareUpdatesEnabled.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/DeviceUserInitiatedFirmwareUpdatesEnabled.yaml
index b2fab07a..bfcee5c4 100644
--- a/components/policy/resources/templates/policy_definitions/Miscellaneous/DeviceUserInitiatedFirmwareUpdatesEnabled.yaml
+++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/DeviceUserInitiatedFirmwareUpdatesEnabled.yaml
@@ -24,7 +24,7 @@
   value: true
 - caption: Users may not initiate firmware updates
   value: false
-default: false
+default: true
 example_value: true
 tags: ['google-sharing']
 generate_device_proto: True
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPFooterManagementNoticeEnabled.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPFooterManagementNoticeEnabled.yaml
index bd3ce84..c0f54fa 100644
--- a/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPFooterManagementNoticeEnabled.yaml
+++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPFooterManagementNoticeEnabled.yaml
@@ -6,6 +6,12 @@
   If this policy is left unset or set to true, managed browsers will display a “Managed by…” notice with an icon.
 
   If this policy is set to false, the management notice will be hidden.
+
+  Note that this policy is only applied for managed browsers, so it will have no effect for managed users on unmanaged browsers.
+
+  On <ph name="MS_WIN_NAME">Microsoft® Windows®</ph>, this policy is only available on instances that are joined to a <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> domain, joined to <ph name="MS_AAD_NAME">Microsoft® Azure® Active Directory®</ph> or enrolled in <ph name="CHROME_ENTERPRISE_CORE_NAME">Chrome Enterprise Core</ph>.
+
+  On <ph name="MAC_OS_NAME">macOS</ph>, this policy is only available on instances that are managed via MDM, joined to a domain via MCX or enrolled in <ph name="CHROME_ENTERPRISE_CORE_NAME">Chrome Enterprise Core</ph>.
 example_value: true
 features:
   dynamic_refresh: true
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/WebRtcEventLogCollectionAllowed.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/WebRtcEventLogCollectionAllowed.yaml
index bbfede69..53aec751 100644
--- a/components/policy/resources/templates/policy_definitions/Miscellaneous/WebRtcEventLogCollectionAllowed.yaml
+++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/WebRtcEventLogCollectionAllowed.yaml
@@ -10,7 +10,7 @@
   dynamic_refresh: true
   per_profile: true
 future_on:
-- fuchsia
+- android
 items:
 - caption: Allow WebRTC event log collection from Google services
   value: true
diff --git a/components/policy/test/data/pref_mapping/WebRtcEventLogCollectionAllowed.json b/components/policy/test/data/pref_mapping/WebRtcEventLogCollectionAllowed.json
index fc3a3613..7fcdd75 100644
--- a/components/policy/test/data/pref_mapping/WebRtcEventLogCollectionAllowed.json
+++ b/components/policy/test/data/pref_mapping/WebRtcEventLogCollectionAllowed.json
@@ -5,7 +5,7 @@
       "linux",
       "mac",
       "chromeos",
-      "fuchsia"
+      "desktop_android"
     ],
     "policy_pref_mapping_tests": [
       {
diff --git a/components/printing/browser/print_to_pdf/pdf_print_job.cc b/components/printing/browser/print_to_pdf/pdf_print_job.cc
index d631aec7..5acab8e 100644
--- a/components/printing/browser/print_to_pdf/pdf_print_job.cc
+++ b/components/printing/browser/print_to_pdf/pdf_print_job.cc
@@ -61,9 +61,9 @@
 }
 
 void PdfPrintJob::OnDidPrintWithParams(
-    printing::mojom::PrintWithParamsResultPtr result) {
-  if (result->is_failure_reason()) {
-    switch (result->get_failure_reason()) {
+    printing::mojom::PrintRenderFrame::PrintWithParamsResult result) {
+  if (!result.has_value()) {
+    switch (result.error()) {
       case printing::mojom::PrintFailureReason::kGeneralFailure:
         FailJob(PdfPrintResult::kPrintFailure);
         return;
@@ -77,7 +77,7 @@
   }
 
   const printing::mojom::DidPrintDocumentParamsPtr& params =
-      result->get_data()->params;
+      result.value()->params;
   const auto& content = *params->content;
   const auto& region = content.metafile_data_region;
   if (!region.IsValid()) {
@@ -95,8 +95,8 @@
   printing::PrintCompositeClient::FromWebContents(web_contents())
       ->CompositeDocument(
           params->document_cookie, printing_rfh_, content,
-          result->get_data()->accessibility_tree,
-          result->get_data()->generate_document_outline,
+          result.value()->accessibility_tree,
+          result.value()->generate_document_outline,
           printing::mojom::PrintCompositor::DocumentType::kPDF,
           base::BindOnce(&PdfPrintJob::OnCompositeDocumentToPdfDone,
                          weak_ptr_factory_.GetWeakPtr()));
diff --git a/components/printing/browser/print_to_pdf/pdf_print_job.h b/components/printing/browser/print_to_pdf/pdf_print_job.h
index f6796a9d..9778d1a 100644
--- a/components/printing/browser/print_to_pdf/pdf_print_job.h
+++ b/components/printing/browser/print_to_pdf/pdf_print_job.h
@@ -11,7 +11,7 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/memory/weak_ptr.h"
 #include "components/printing/browser/print_to_pdf/pdf_print_result.h"
-#include "components/printing/common/print.mojom-forward.h"
+#include "components/printing/common/print.mojom.h"
 #include "components/services/print_compositor/public/mojom/print_compositor.mojom.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents_observer.h"
@@ -56,7 +56,8 @@
   // WebContentsObserver overrides:
   void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
 
-  void OnDidPrintWithParams(printing::mojom::PrintWithParamsResultPtr result);
+  void OnDidPrintWithParams(
+      printing::mojom::PrintRenderFrame::PrintWithParamsResult result);
   void OnCompositeDocumentToPdfDone(
       printing::mojom::PrintCompositor::Status status,
       base::ReadOnlySharedMemoryRegion region);
diff --git a/components/printing/common/print.mojom b/components/printing/common/print.mojom
index 6809c45..ac2f719 100644
--- a/components/printing/common/print.mojom
+++ b/components/printing/common/print.mojom
@@ -6,8 +6,8 @@
 
 import "mojo/public/mojom/base/shared_memory.mojom";
 import "mojo/public/mojom/base/string16.mojom";
-import "mojo/public/mojom/base/values.mojom";
 import "mojo/public/mojom/base/unguessable_token.mojom";
+import "mojo/public/mojom/base/values.mojom";
 import "printing/mojom/print.mojom";
 import "ui/accessibility/mojom/ax_tree_update.mojom";
 import "ui/gfx/geometry/mojom/geometry.mojom";
@@ -239,7 +239,8 @@
   // Sends back to the browser the complete rendered document that was requested
   // by PrintPreview.
   [EnableIf=enable_print_preview]
-  MetafileReadyForPrinting(DidPreviewDocumentParams params, int32 request_id);
+  MetafileReadyForPrinting(
+      DidPreviewDocumentParams params, int32 request_id);
 
   // Tells the browser print preview failed.
   // `document_cookie`, if valid, identifies the print job that needs to be
@@ -271,10 +272,10 @@
   // additionally has a custom orientation on ALL pages, otherwise false.
   [EnableIf=enable_print_preview]
   DidGetDefaultPageLayout(PageSizeMargins page_layout_in_points,
-      gfx.mojom.RectF printable_area_in_points,
-      bool all_pages_have_custom_size,
-      bool all_pages_have_custom_orientation,
-      int32 request_id);
+                          gfx.mojom.RectF printable_area_in_points,
+                          bool all_pages_have_custom_size,
+                          bool all_pages_have_custom_orientation,
+                          int32 request_id);
 
   // Notifies the browser about the to-be-rendered print preview document.
   [EnableIf=enable_print_preview]
@@ -293,11 +294,6 @@
   kPrintingInProgress,
 };
 
-union PrintWithParamsResult {
-  PrintWithParamsResultData data;
-  PrintFailureReason failure_reason;
-};
-
 // Render process interface exposed to the browser to handle most of the
 // printing grunt work for RenderView.
 interface PrintRenderFrame {
@@ -313,7 +309,7 @@
   // the caller and printing is completed without further round-trips to the
   // browser.
   PrintWithParams(PrintPagesParams params)
-      => (PrintWithParamsResult result);
+      => result<PrintWithParamsResultData, PrintFailureReason>;
 
   // Tells the RenderFrame to switch the CSS to print media type, render every
   // requested page using the print preview document's frame/node, and then
@@ -325,8 +321,8 @@
   // Optionally provides a `print_renderer` to render print documents.
   [EnableIf=enable_print_preview]
   InitiatePrintPreview(
-      [EnableIf=is_chromeos]
-      pending_associated_remote<PrintRenderer>? print_renderer,
+      [EnableIf=is_chromeos] pending_associated_remote<PrintRenderer>?
+          print_renderer,
       bool has_selection);
 
   // Sets PrintPreviewUI interface to notify the browser of preview actions.
@@ -398,8 +394,7 @@
   // Updates the current print settings with new `job_settings`. If an error
   // occurs, return null.
   [EnableIf=enable_print_preview, Sync]
-  UpdatePrintSettings(
-      mojo_base.mojom.DictionaryValue job_settings)
+  UpdatePrintSettings(mojo_base.mojom.DictionaryValue job_settings)
       => (PrintPagesParams? current_settings);
 
   // Tells the browser to set up the print preview requested by the script. It
@@ -427,5 +422,6 @@
   // Sends the accessibility tree corresponding to a document being
   // printed, needed for a tagged (accessible) PDF.
   [EnableIf=enable_print_preview]
-  SetAccessibilityTree(int32 cookie, ax.mojom.AXTreeUpdate accessibility_tree);
+  SetAccessibilityTree(
+      int32 cookie, ax.mojom.AXTreeUpdate accessibility_tree);
 };
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc
index 91c3d7e..cb0f05d 100644
--- a/components/printing/renderer/print_render_frame_helper.cc
+++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -39,6 +39,7 @@
 #include "base/strings/string_util.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/trace_event/trace_event.h"
+#include "base/types/expected.h"
 #include "base/types/fixed_array.h"
 #include "build/build_config.h"
 #include "components/grit/components_resources.h"
@@ -1327,14 +1328,14 @@
     PrintWithParamsCallback callback) {
   ScopedIPC scoped_ipc(weak_ptr_factory_.GetWeakPtr());
   if (ipc_nesting_level_ > kAllowedIpcDepthForPrint) {
-    std::move(callback).Run(mojom::PrintWithParamsResult::NewFailureReason(
-        mojom::PrintFailureReason::kGeneralFailure));
+    std::move(callback).Run(
+        base::unexpected(mojom::PrintFailureReason::kGeneralFailure));
     return;
   }
 
   if (print_with_params_callback_) {
-    std::move(callback).Run(mojom::PrintWithParamsResult::NewFailureReason(
-        mojom::PrintFailureReason::kPrintingInProgress));
+    std::move(callback).Run(
+        base::unexpected(mojom::PrintFailureReason::kPrintingInProgress));
     return;
   }
 
@@ -1342,8 +1343,8 @@
   frame->DispatchBeforePrintEvent(/*print_client=*/nullptr);
   // Don't print if the RenderFrame is gone.
   if (render_frame_gone_) {
-    std::move(callback).Run(mojom::PrintWithParamsResult::NewFailureReason(
-        mojom::PrintFailureReason::kGeneralFailure));
+    std::move(callback).Run(
+        base::unexpected(mojom::PrintFailureReason::kGeneralFailure));
     return;
   }
 
@@ -2151,10 +2152,10 @@
   if (print_with_params_callback_) {
     DCHECK_NE(result, PrintingResult::kOk);
     std::move(print_with_params_callback_)
-        .Run(mojom::PrintWithParamsResult::NewFailureReason(
-            result == PrintingResult::kInvalidPageRange
-                ? mojom::PrintFailureReason::kInvalidPageRange
-                : mojom::PrintFailureReason::kGeneralFailure));
+        .Run(
+            base::unexpected(result == PrintingResult::kInvalidPageRange
+                                 ? mojom::PrintFailureReason::kInvalidPageRange
+                                 : mojom::PrintFailureReason::kGeneralFailure));
     Reset();
     return;
   }
@@ -2343,8 +2344,7 @@
     result->params = std::move(page_params);
     result->accessibility_tree = std::move(accessibility_tree);
     result->generate_document_outline = print_params.generate_document_outline;
-    std::move(print_with_params_callback_)
-        .Run(mojom::PrintWithParamsResult::NewData(std::move(result)));
+    std::move(print_with_params_callback_).Run(base::ok(std::move(result)));
     Reset();
     return true;
   }
diff --git a/components/privacy_sandbox/privacy_sandbox_features.cc b/components/privacy_sandbox/privacy_sandbox_features.cc
index 99679343..dbfdecb 100644
--- a/components/privacy_sandbox/privacy_sandbox_features.cc
+++ b/components/privacy_sandbox/privacy_sandbox_features.cc
@@ -215,7 +215,7 @@
 
 BASE_FEATURE(kPrivacySandboxAdsApiUxEnhancements,
              "PrivacySandboxAdsApiUxEnhancements",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 BASE_FEATURE(kPrivacySandboxAllowPromptForBlocked3PCookies,
              "PrivacySandboxAllowPromptForBlocked3PCookies",
diff --git a/components/proto_extras/proto_extras.gni b/components/proto_extras/proto_extras.gni
index 6927c206..ca9c1c8 100644
--- a/components/proto_extras/proto_extras.gni
+++ b/components/proto_extras/proto_extras.gni
@@ -24,6 +24,11 @@
 # - Include via <name>.ostream.h.
 # - Disable via `omit_stream_operators` (default is false).
 #
+# Equality operator support:
+# - The generated operator resides in the namespace of the proto message.
+# - Include via <name>.equal.h.
+# - Disable via `omit_equality` (default is false).
+#
 # The proto_extras template supports the following other properties:
 # - extras_deps: These are the proto_extras targets for any proto dependencies.
 # - sources: The .proto files to generate from.
@@ -42,7 +47,7 @@
 # the protobuf_full_support option can be used to ensure the generated code
 # with the full protobuf library. Due to android build complications, this also
 # requires the `use_fuzzing_engine_with_lpm` build flag to be set.
-# This option is only relevant for base::Value serialization.
+# This option is relevant for base::Value serialization and equality.
 #
 # Caveats:
 # - Integer types in the proto that are not compatible with base::Value are
@@ -83,6 +88,10 @@
       !invoker.omit_stream_operators) {
     _generate_ostream = false
   }
+  _generate_equality = true
+  if (defined(invoker.omit_equality) && invoker.omit_equality) {
+    _generate_equality = false
+  }
   _protobuf_full_support = false
   if (defined(invoker.protobuf_full_support) && invoker.protobuf_full_support &&
       use_fuzzing_engine_with_lpm) {
@@ -95,7 +104,7 @@
           "serialization. Cannot set omit_to_value_serialization = true if " +
           "omit_stream_operators = false. Target: ${target_name}")
 
-  assert(_generate_to_value || _generate_ostream,
+  assert(_generate_to_value || _generate_ostream || _generate_equality,
          "There must be one generation type enabled. Target: ${target_name}")
 
   _extras_deps = []
@@ -120,6 +129,7 @@
       if (_protobuf_full_support) {
         link_deps += [ "//components/proto_extras:protobuf_full_support" ]
       }
+
       # Link the *_to_value targets for all extras_deps.
       _extras_deps_to_value = []
       foreach(_dep, _extras_deps) {
@@ -166,6 +176,39 @@
     }
   }
 
+  if (_generate_equality) {
+    _equality_target_name = "${target_name}_equal"
+    _all_targets += [ _equality_target_name ]
+    proto_library(_equality_target_name) {
+      proto_in_dir = "//"
+      sources = invoker.sources
+      forward_variables_from(invoker,
+                             [
+                               "deps",
+                               "defines",
+                               "visibility",
+                             ])
+
+      # Link the *_to_value targets for all extras_deps.
+      _extras_deps_equality = []
+      foreach(_dep, _extras_deps) {
+        _extras_deps_equality += [ "${_dep}_equal" ]
+      }
+      link_deps = _extras_deps_equality
+      _equality_options_list = [ "generate_equality" ]
+      if (_protobuf_full_support) {
+        _equality_options_list += [ "protobuf_full_support" ]
+        link_deps += [ "//components/proto_extras:protobuf_full_support" ]
+      }
+
+      generator_plugin_label = "//components/proto_extras:proto_extras_plugin"
+      generator_plugin_suffix = ".equal"
+      generate_cc = false
+      generate_python = false
+      generator_plugin_options = string_join(",", _equality_options_list)
+    }
+  }
+
   # Group all generated targets into one group for the target_name.
   # Users can techncally depend on the generated target names for a more
   # optimized build graph, but it is uncommon in the codebase to not depend on a
diff --git a/components/proto_extras/proto_extras_plugin.cc b/components/proto_extras/proto_extras_plugin.cc
index 8d12e91..2f18e133 100644
--- a/components/proto_extras/proto_extras_plugin.cc
+++ b/components/proto_extras/proto_extras_plugin.cc
@@ -27,13 +27,16 @@
 using google::protobuf::Descriptor;
 using google::protobuf::FieldDescriptor;
 using google::protobuf::FileDescriptor;
+using google::protobuf::OneofDescriptor;
 using google::protobuf::compiler::GeneratorContext;
+using google::protobuf::compiler::cpp::UnderscoresToCamelCase;
 using google::protobuf::io::Printer;
 using google::protobuf::io::ZeroCopyOutputStream;
 
 struct ProtoExtrasGeneratorOptions {
   bool generate_to_value_serialization = false;
   bool generate_stream_operator = false;
+  bool generate_equality = false;
   bool protobuf_full_support = false;
 };
 
@@ -152,13 +155,119 @@
       google::protobuf::compiler::cpp::ClassName(&message);
   printer->Emit({{"message_type", message_type}},
                 R"(
-std::ostream& operator<<(std::ostream& out, const $message_type$ & message) {
+std::ostream& operator<<(std::ostream& out, const $message_type$& message) {
   // This relies on Serialize() from *.to_value.h.
   return out << Serialize(message).DebugString();
 }
 )");
 }
 
+void CreateEqualityOperatorDefinition(
+    const Descriptor& message,
+    Printer* printer,
+    const ProtoExtrasGeneratorOptions& options) {
+  std::string message_type =
+      google::protobuf::compiler::cpp::ClassName(&message);
+  printer->Emit(
+      {{"message_type", message_type},
+       {"compare_fields",
+        [&]() {
+          // If protobuf_full_support is enabled, use MessageDifferencerEquals
+          // to compare the messages as the messages should be full Message
+          // types.
+          if (options.protobuf_full_support) {
+            printer->Print(
+                "if (!::proto_extras::MessageDifferencerEquals(lhs, rhs)) "
+                "return false;\n");
+            return;
+          }
+          printer->Print(
+              "if (lhs.unknown_fields() != rhs.unknown_fields()) return "
+              "false;\n");
+
+          // Compare oneof fields using a switch statement.
+          for (int i = 0; i < message.oneof_decl_count(); ++i) {
+            const OneofDescriptor* oneof = message.oneof_decl(i);
+            printer->Emit(
+                {{"oneof_name", oneof->name()},
+                 {"message_type", message_type},
+                 {"captital_oneof_name", base::ToUpperASCII(oneof->name())},
+                 {"body",
+                  [&]() {
+                    for (int j = 0; j < oneof->field_count(); ++j) {
+                      const FieldDescriptor* field = oneof->field(j);
+                      std::string field_name(field->lowercase_name());
+                      std::string case_name = UnderscoresToCamelCase(
+                          field->lowercase_name(), /*cap_next_letter=*/true);
+
+                      printer->Emit(
+                          {
+                              {"message_type", message_type},
+                              {"case_name", case_name},
+                              {"field_name", field_name},
+                          },
+                          R"(
+          case $message_type$::k$case_name$:
+            if (lhs.$field_name$() != rhs.$field_name$()) return false;
+            break;
+      )");
+                    }
+                  }}},
+                R"(
+  if (lhs.$oneof_name$_case() != rhs.$oneof_name$_case()) return false;
+  switch (lhs.$oneof_name$_case()) {
+    $body$
+    case $message_type$::$captital_oneof_name$_NOT_SET:
+      break;
+  }
+)");
+          }
+
+          // Compare non-oneof fields.
+          for (int j = 0; j < message.field_count(); j++) {
+            const FieldDescriptor& field = *message.field(j);
+            // Skip fields that are part of a oneof, as they are handled above.
+            if (field.containing_oneof()) {
+              continue;
+            }
+
+            std::string field_name(field.lowercase_name());
+
+            if (field.is_repeated()) {
+              printer->Emit({{"field_name", field_name}},
+                            R"(
+  if (lhs.$field_name$().size() != rhs.$field_name$().size()) return false;
+  for (int i = 0; i < lhs.$field_name$().size(); ++i) {
+    if (lhs.$field_name$()[i] != rhs.$field_name$()[i]) return false;
+  }
+)");
+            } else if (field.has_presence()) {
+              printer->Emit({{"field_name", field_name}},
+                            R"(
+  if (lhs.has_$field_name$() != rhs.has_$field_name$()) return false;
+  if (lhs.has_$field_name$() && lhs.$field_name$() != rhs.$field_name$()) return false;
+)");
+            } else {
+              printer->Emit({{"field_name", field_name}},
+                            R"(
+  if (lhs.$field_name$() != rhs.$field_name$()) return false;
+)");
+            }
+          }
+        }}},
+      R"(
+bool operator==(const $message_type$& lhs, const $message_type$& rhs) {
+  if (&lhs == &rhs) return true;
+  $compare_fields$
+  return true;
+}
+
+bool operator!=(const $message_type$& lhs, const $message_type$& rhs) {
+  return !(lhs == rhs);
+}
+)");
+}
+
 class ProtoExtrasGenerator : public google::protobuf::compiler::CodeGenerator {
  public:
   ProtoExtrasGenerator() = default;
@@ -175,19 +284,26 @@
             command_line_options, "generate_to_value_serialization"),
         .generate_stream_operator =
             base::Contains(command_line_options, "generate_stream_operator"),
+        .generate_equality =
+            base::Contains(command_line_options, "generate_equality"),
         .protobuf_full_support =
             base::Contains(command_line_options, "protobuf_full_support"),
     };
-    CHECK(generator_options.generate_to_value_serialization ||
+    // The current design of this library assumes that only one of the
+    // serialization options is enabled.
+    CHECK(generator_options.generate_to_value_serialization ^
+          generator_options.generate_equality ^
           generator_options.generate_stream_operator);
 
     base::FilePath proto_file_path = base::FilePath::FromASCII(file->name());
     base::FilePath::StringType file_suffix;
     if (generator_options.generate_to_value_serialization) {
       file_suffix = FILE_PATH_LITERAL(".to_value");
-    } else {
-      CHECK(generator_options.generate_stream_operator);
+    } else if (generator_options.generate_stream_operator) {
       file_suffix = FILE_PATH_LITERAL(".ostream");
+    } else {
+      CHECK(generator_options.generate_equality);
+      file_suffix = FILE_PATH_LITERAL(".equal");
     }
 
     base::FilePath h_file_path =
@@ -266,13 +382,20 @@
     if (generator_options.generate_to_value_serialization) {
       impl_user_includes.insert({"base/base64.h", "base/values.h",
                                  "components/proto_extras/proto_extras_lib.h"});
-      for (int i = 0; i < file->dependency_count(); i++) {
-        base::FilePath dependency_proto_file_path =
-            base::FilePath::FromASCII(file->dependency(i)->name());
+    }
+    for (int i = 0; i < file->dependency_count(); i++) {
+      base::FilePath dependency_proto_file_path =
+          base::FilePath::FromASCII(file->dependency(i)->name());
+      if (generator_options.generate_to_value_serialization) {
         impl_user_includes.insert(
             dependency_proto_file_path
                 .ReplaceExtension(FILE_PATH_LITERAL("to_value.h"))
                 .AsUTF8Unsafe());
+      } else if (generator_options.generate_equality) {
+        impl_user_includes.insert(
+            dependency_proto_file_path
+                .ReplaceExtension(FILE_PATH_LITERAL("equal.h"))
+                .AsUTF8Unsafe());
       }
     }
     if (generator_options.protobuf_full_support) {
@@ -329,6 +452,10 @@
           "$m$& message);\n",
           "m", message_type);
     }
+    if (options.generate_equality) {
+      printer->Print("bool operator==(const $m$& lhs, const $m$& rhs);\n", "m",
+                     message_type);
+    }
     for (int i = 0; i < message.nested_type_count(); i++) {
       if (!PrintFunctionDeclarations(*message.nested_type(i), printer, error,
                                      options)) {
@@ -349,6 +476,9 @@
     if (options.generate_stream_operator) {
       CreateOstreamDefinition(message, printer, options);
     }
+    if (options.generate_equality) {
+      CreateEqualityOperatorDefinition(message, printer, options);
+    }
 
     for (int i = 0; i < message.nested_type_count(); i++) {
       if (!PrintFunctionDefinitions(*message.nested_type(i), printer, error,
diff --git a/components/proto_extras/proto_extras_unittest.cc b/components/proto_extras/proto_extras_unittest.cc
index 3e17c3d..eaea048 100644
--- a/components/proto_extras/proto_extras_unittest.cc
+++ b/components/proto_extras/proto_extras_unittest.cc
@@ -3,16 +3,24 @@
 // found in the LICENSE file.
 
 #include "base/test/values_test_util.h"
+#include "components/proto_extras/test_proto/test_proto.equal.h"
+#include "components/proto_extras/test_proto/test_proto.ostream.h"
 #include "components/proto_extras/test_proto/test_proto.pb.h"
 #include "components/proto_extras/test_proto/test_proto.to_value.h"
 #include "components/proto_extras/test_proto/test_proto_dependency.pb.h"
 #include "components/proto_extras/test_proto/test_proto_dependency.to_value.h"
+#include "components/proto_extras/test_proto2/test_proto2.equal.h"
 #include "components/proto_extras/test_proto2/test_proto2.ostream.h"
 #include "components/proto_extras/test_proto2/test_proto2.pb.h"
 #include "components/proto_extras/test_proto2/test_proto2.to_value.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace proto_extras {
+
+void PrintTo(const TestMessage& msg, std::ostream* os) {
+  *os << msg;
+}
+
 namespace {
 
 TEST(ProtoExtrasToValueTest, BasicField) {
@@ -259,5 +267,248 @@
             base::JSONReader::Read(R"({"maybe_int": 1})"));
 }
 
+TEST(ProtoExtrasEquality, Basic) {
+  TestMessage msg1;
+  TestMessage msg2;
+
+  // Test default messages are equal.
+  EXPECT_EQ(msg1, msg2);
+
+  // Test setting a field makes them unequal.
+  msg1.set_int32_field(1);
+  EXPECT_NE(msg1, msg2);
+
+  // Test setting the same field to the same value makes them equal.
+  msg2.set_int32_field(1);
+  EXPECT_EQ(msg1, msg2);
+
+  // Test setting different values makes them unequal.
+  msg2.set_int32_field(2);
+  EXPECT_NE(msg1, msg2);
+}
+
+TEST(ProtoExtrasEquality, RepeatedField) {
+  TestMessage msg1;
+  TestMessage msg2;
+
+  // Test repeated fields.
+  msg1.add_repeated_int32_field(1);
+  EXPECT_NE(msg1, msg2);
+  msg2.add_repeated_int32_field(1);
+  EXPECT_EQ(msg1, msg2);
+  msg1.add_repeated_int32_field(2);
+  EXPECT_NE(msg1, msg2);
+  msg2.add_repeated_int32_field(3);
+  EXPECT_NE(msg1, msg2);
+  msg2.set_repeated_int32_field(1, 2);
+  EXPECT_EQ(msg1, msg2);
+}
+
+TEST(ProtoExtrasEquality, OneofField) {
+  TestMessage msg1;
+  TestMessage msg2;
+
+  // Test oneof fields.
+  msg1.set_maybe_int32_field(100);
+  EXPECT_NE(msg1, msg2);
+  msg2.set_maybe_int32_field(100);
+  EXPECT_EQ(msg1, msg2);
+  msg2.set_maybe_string_field("test");
+  EXPECT_NE(msg1, msg2);
+  msg1.set_maybe_string_field("test");
+  EXPECT_EQ(msg1, msg2);
+}
+
+TEST(ProtoExtrasEquality, NestedMessage) {
+  TestMessage msg1;
+  TestMessage msg2;
+
+  // Test nested message
+  msg1.mutable_nested_message_field()->set_int32_field(1);
+  EXPECT_NE(msg1, msg2);
+  msg2.mutable_nested_message_field()->set_int32_field(1);
+  EXPECT_EQ(msg1, msg2);
+  msg1.mutable_nested_message_field()->set_int32_field(2);
+  EXPECT_NE(msg1, msg2);
+}
+
+TEST(ProtoExtrasEquality, EnumField) {
+  TestMessage msg1;
+  TestMessage msg2;
+  // Test enum
+  msg1.set_enum_field(TestMessage::ENUM_A);
+  EXPECT_NE(msg1, msg2);
+  msg2.set_enum_field(TestMessage::ENUM_A);
+  EXPECT_EQ(msg1, msg2);
+  msg2.set_enum_field(TestMessage::ENUM_B);
+  EXPECT_NE(msg1, msg2);
+}
+
+TEST(ProtoExtrasProtoEqualityProto2, Basic) {
+  TestMessageProto2 msg1;
+  TestMessageProto2 msg2;
+
+  // Test default messages are equal.
+  EXPECT_EQ(msg1, msg2);
+
+  // Test setting a field makes them unequal.
+  msg1.set_int32_field(1);
+  EXPECT_NE(msg1, msg2);
+
+  // Test setting the same field to the same value makes them equal.
+  msg2.set_int32_field(1);
+  EXPECT_EQ(msg1, msg2);
+
+  // Test setting different values makes them unequal.
+  msg2.set_int32_field(2);
+  EXPECT_NE(msg1, msg2);
+
+  msg2.set_int32_field(1);
+  EXPECT_EQ(msg1, msg2);
+
+  // Test other basic types
+  msg1.set_int64_field(100);
+  msg2.set_int64_field(200);
+  EXPECT_NE(msg1, msg2);
+  msg2.set_int64_field(100);
+  EXPECT_EQ(msg1, msg2);
+
+  msg1.set_bytes_field("abc");
+  msg2.set_bytes_field("def");
+  EXPECT_NE(msg1, msg2);
+  msg2.set_bytes_field("abc");
+  EXPECT_EQ(msg1, msg2);
+
+  msg1.set_bool_field(true);
+  msg2.set_bool_field(false);
+  EXPECT_NE(msg1, msg2);
+  msg2.set_bool_field(true);
+  EXPECT_EQ(msg1, msg2);
+
+  msg1.set_uint64_field(std::numeric_limits<uint64_t>::max());
+  msg2.set_uint64_field(0);
+  EXPECT_NE(msg1, msg2);
+  msg2.set_uint64_field(std::numeric_limits<uint64_t>::max());
+  EXPECT_EQ(msg1, msg2);
+}
+
+TEST(ProtoExtrasProtoEqualityProto2, RepeatedField) {
+  TestMessageProto2 msg1;
+  TestMessageProto2 msg2;
+
+  // Test repeated int32
+  msg1.add_repeated_int32_field(1);
+  EXPECT_NE(msg1, msg2);
+  msg2.add_repeated_int32_field(1);
+  EXPECT_EQ(msg1, msg2);
+  msg1.add_repeated_int32_field(2);
+  EXPECT_NE(msg1, msg2);
+  msg2.add_repeated_int32_field(3);
+  EXPECT_NE(msg1, msg2);
+  msg2.set_repeated_int32_field(1, 2);
+  EXPECT_EQ(msg1, msg2);
+
+  // Test repeated embedded message
+  msg1.add_repeated_embedded_message()->set_str_field("a");
+  EXPECT_NE(msg1, msg2);
+  msg2.add_repeated_embedded_message()->set_str_field("a");
+  EXPECT_EQ(msg1, msg2);
+  msg1.add_repeated_embedded_message()->set_str_field("b");
+  EXPECT_NE(msg1, msg2);
+  msg2.add_repeated_embedded_message()->set_str_field("c");
+  EXPECT_NE(msg1, msg2);
+  msg2.mutable_repeated_embedded_message(1)->set_str_field("b");
+  EXPECT_EQ(msg1, msg2);
+
+  // Test repeated inner enum
+  msg1.add_repeated_inner_enum(TestMessageProto2::INNER_ENUM_OPTION1);
+  EXPECT_NE(msg1, msg2);
+  msg2.add_repeated_inner_enum(TestMessageProto2::INNER_ENUM_OPTION1);
+  EXPECT_EQ(msg1, msg2);
+  msg1.add_repeated_inner_enum(TestMessageProto2::INNER_ENUM_OPTION2);
+  EXPECT_NE(msg1, msg2);
+  msg2.add_repeated_inner_enum(TestMessageProto2::INNER_ENUM_UNSPECIFIED);
+  EXPECT_NE(msg1, msg2);
+  msg2.set_repeated_inner_enum(1, TestMessageProto2::INNER_ENUM_OPTION2);
+  EXPECT_EQ(msg1, msg2);
+}
+
+TEST(ProtoExtrasProtoEqualityProto2, OneofField) {
+  TestMessageProto2 msg1;
+  TestMessageProto2 msg2;
+
+  // Test oneof fields.
+  msg1.set_maybe_int(100);
+  EXPECT_NE(msg1, msg2);
+  msg2.set_maybe_int(100);
+  EXPECT_EQ(msg1, msg2);
+
+  msg2.set_maybe_bool(true);
+  EXPECT_NE(msg1, msg2);
+  msg1.set_maybe_bool(true);
+  EXPECT_EQ(msg1, msg2);
+
+  msg2.mutable_maybe_message()->set_str_field("test");
+  EXPECT_NE(msg1, msg2);
+  msg1.mutable_maybe_message()->set_str_field("test");
+  EXPECT_EQ(msg1, msg2);
+
+  msg2.set_maybe_enum(OUTER_ENUM_OPTION1);
+  EXPECT_NE(msg1, msg2);
+  msg1.set_maybe_enum(OUTER_ENUM_OPTION1);
+  EXPECT_EQ(msg1, msg2);
+
+  msg2.set_maybe_bytes("bytes");
+  EXPECT_NE(msg1, msg2);
+  msg1.set_maybe_bytes("bytes");
+  EXPECT_EQ(msg1, msg2);
+}
+
+TEST(ProtoExtrasProtoEqualityProto2, NestedMessage) {
+  TestMessageProto2 msg1;
+  TestMessageProto2 msg2;
+
+  // Test embedded message
+  msg1.mutable_embedded_message()->set_str_field("a");
+  EXPECT_NE(msg1, msg2);
+  msg2.mutable_embedded_message()->set_str_field("a");
+  EXPECT_EQ(msg1, msg2);
+  msg1.mutable_embedded_message()->set_str_field("b");
+  EXPECT_NE(msg1, msg2);
+  msg2.mutable_embedded_message()->set_str_field("b");
+  EXPECT_EQ(msg1, msg2);
+
+  // Test inner message
+  msg1.mutable_inner_message()->set_int_field(1);
+  EXPECT_NE(msg1, msg2);
+  msg2.mutable_inner_message()->set_int_field(1);
+  EXPECT_EQ(msg1, msg2);
+  msg1.mutable_inner_message()->set_int_field(2);
+  EXPECT_NE(msg1, msg2);
+}
+
+TEST(ProtoExtrasProtoEqualityProto2, EnumField) {
+  TestMessageProto2 msg1;
+  TestMessageProto2 msg2;
+
+  // Test outer enum
+  msg1.set_outer_enum(OUTER_ENUM_OPTION1);
+  EXPECT_NE(msg1, msg2);
+  msg2.set_outer_enum(OUTER_ENUM_OPTION1);
+  EXPECT_EQ(msg1, msg2);
+  msg2.set_outer_enum(OUTER_ENUM_OPTION2);
+  EXPECT_NE(msg1, msg2);
+
+  msg2.set_outer_enum(OUTER_ENUM_OPTION1);
+
+  // Test inner enum
+  msg1.set_inner_enum(TestMessageProto2::INNER_ENUM_OPTION1);
+  EXPECT_NE(msg1, msg2);
+  msg2.set_inner_enum(TestMessageProto2::INNER_ENUM_OPTION1);
+  EXPECT_EQ(msg1, msg2);
+  msg2.set_inner_enum(TestMessageProto2::INNER_ENUM_OPTION2);
+  EXPECT_NE(msg1, msg2);
+}
+
 }  // namespace
 }  // namespace proto_extras
diff --git a/components/proto_extras/protobuf_full_support.cc b/components/proto_extras/protobuf_full_support.cc
index 31deed6d..e8bc5130 100644
--- a/components/proto_extras/protobuf_full_support.cc
+++ b/components/proto_extras/protobuf_full_support.cc
@@ -8,6 +8,7 @@
 #include "base/values.h"
 #include "components/proto_extras/proto_extras_lib.h"
 #include "third_party/protobuf/src/google/protobuf/unknown_field_set.h"
+#include "third_party/protobuf/src/google/protobuf/util/message_differencer.h"
 
 namespace proto_extras {
 
@@ -38,4 +39,9 @@
   return dict;
 }
 
+bool MessageDifferencerEquals(const google::protobuf::Message& lhs,
+                              const google::protobuf::Message& rhs) {
+  return google::protobuf::util::MessageDifferencer::Equals(lhs, rhs);
+}
+
 }  // namespace proto_extras
diff --git a/components/proto_extras/protobuf_full_support.h b/components/proto_extras/protobuf_full_support.h
index ef668fc..c01f06b 100644
--- a/components/proto_extras/protobuf_full_support.h
+++ b/components/proto_extras/protobuf_full_support.h
@@ -8,7 +8,6 @@
 #include "base/component_export.h"
 #include "base/values.h"
 #include "third_party/protobuf/src/google/protobuf/message.h"
-#include "third_party/protobuf/src/google/protobuf/unknown_field_set.h"
 
 namespace google::protobuf {
 class UnknownFieldSet;
@@ -19,6 +18,9 @@
 base::DictValue Serialize(
     const google::protobuf::UnknownFieldSet& unknown_fields);
 
+bool MessageDifferencerEquals(const google::protobuf::Message& lhs,
+                              const google::protobuf::Message& rhs);
+
 template <typename MessageType>
   requires std::is_base_of_v<google::protobuf::Message, MessageType>
 void SerializeUnknownFields(const MessageType& message, base::DictValue& dict) {
diff --git a/components/safe_browsing/android/BUILD.gn b/components/safe_browsing/android/BUILD.gn
index db59c34..4fced5f 100644
--- a/components/safe_browsing/android/BUILD.gn
+++ b/components/safe_browsing/android/BUILD.gn
@@ -33,7 +33,7 @@
 java_cpp_features("sb_java_features_srcjar") {
   visibility = [ ":*" ]
   sources = [ "//components/safe_browsing/core/common/features.cc" ]
-  template = "java/src/org/chromium/components/safe_browsing/SafeBrowsingFeatures.java.tmpl"
+  class_name = "org.chromium.components.safe_browsing.SafeBrowsingFeatures"
 }
 
 fuzzable_proto_library("realtimeallowlist_proto") {
@@ -223,5 +223,5 @@
 java_cpp_strings("switches_srcjar") {
   sources =
       [ "//components/safe_browsing/core/common/safebrowsing_switches.cc" ]
-  template = "java_templates/SafeBrowsingSwitches.java.tmpl"
+  class_name = "org.chromium.chrome.browser.safe_browsing.SafeBrowsingSwitches"
 }
diff --git a/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingFeatures.java.tmpl b/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingFeatures.java.tmpl
deleted file mode 100644
index 3db6ec1f..0000000
--- a/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.safe_browsing;
-
-/**
- * Contains constants for names of Safe Browsing features.
- */
-public final class SafeBrowsingFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Prevents instantiation.
-    private SafeBrowsingFeatures() {{}}
-}}
diff --git a/components/safe_browsing/android/java_templates/SafeBrowsingSwitches.java.tmpl b/components/safe_browsing/android/java_templates/SafeBrowsingSwitches.java.tmpl
deleted file mode 100644
index e84fb192..0000000
--- a/components/safe_browsing/android/java_templates/SafeBrowsingSwitches.java.tmpl
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.safe_browsing;
-
-/**
- * Contains all of the command line switches that are specific to the //components/safe_browsing
- * portion of Chrome on Android.
- */
-public abstract class SafeBrowsingSwitches {{
-
-{NATIVE_STRINGS}
-
-  // Prevent instantiation.
-  protected SafeBrowsingSwitches() {{}}
-}}
diff --git a/components/safe_browsing/core/browser/ping_manager.cc b/components/safe_browsing/core/browser/ping_manager.cc
index 999da91..7bf57b51 100644
--- a/components/safe_browsing/core/browser/ping_manager.cc
+++ b/components/safe_browsing/core/browser/ping_manager.cc
@@ -72,6 +72,8 @@
         DANGEROUS_DOWNLOAD_AUTO_DELETED:
     case safe_browsing::ClientSafeBrowsingReportRequest::
         DANGEROUS_DOWNLOAD_PROFILE_CLOSED:
+    case safe_browsing::ClientSafeBrowsingReportRequest::
+        DANGEROUS_DOWNLOAD_WARNING_ANDROID:
       return true;
     default:
       return false;
diff --git a/components/safe_browsing/core/common/proto/csd.proto b/components/safe_browsing/core/common/proto/csd.proto
index 14464cf..c2106d0 100644
--- a/components/safe_browsing/core/common/proto/csd.proto
+++ b/components/safe_browsing/core/common/proto/csd.proto
@@ -1702,6 +1702,7 @@
     URL_UNWANTED = 3;
     URL_CLIENT_SIDE_PHISHING = 4;
     URL_CLIENT_SIDE_MALWARE = 5 [deprecated = true];
+    // See also: DANGEROUS_DOWNLOAD_WARNING_ANDROID.
     DANGEROUS_DOWNLOAD_RECOVERY = 6;
     DANGEROUS_DOWNLOAD_WARNING = 7;
     DANGEROUS_DOWNLOAD_BY_API = 10;
@@ -1729,6 +1730,9 @@
     // Triggered by a redirect to an external app, either through an
     // external protocol scheme (e.g. mailto://) or an Intent.
     EXTERNAL_APP_REDIRECT = 28;
+    // Analogous to DANGEROUS_DOWNLOAD_RECOVERY and DANGEROUS_DOWNLOAD_WARNING,
+    // but used only for download warnings in Chrome on Android.
+    DANGEROUS_DOWNLOAD_WARNING_ANDROID = 29;
   }
   // LINT.ThenChange(//tools/metrics/histograms/metadata/safe_browsing/enums.xml:ClientSafeBrowsingReportType)
 
diff --git a/components/sensitive_content/BUILD.gn b/components/sensitive_content/BUILD.gn
index 228dce8..05cb5a5 100644
--- a/components/sensitive_content/BUILD.gn
+++ b/components/sensitive_content/BUILD.gn
@@ -95,7 +95,8 @@
   java_cpp_features("java_features_srcjar") {
     visibility = [ ":*" ]
     sources = [ "//components/sensitive_content/features.cc" ]
-    template = "//components/sensitive_content/java_templates/SensitiveContentFeatures.java.tmpl"
+    class_name =
+        "org.chromium.components.sensitive_content.SensitiveContentFeatures"
   }
 
   # Used to expose the features to the WebView flag UI (the equivalent of
diff --git a/components/sensitive_content/java_templates/SensitiveContentFeatures.java.tmpl b/components/sensitive_content/java_templates/SensitiveContentFeatures.java.tmpl
deleted file mode 100644
index 03d3d5df..0000000
--- a/components/sensitive_content/java_templates/SensitiveContentFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.sensitive_content;
-
-/**
- * Contains features that are specific to sensitive content component.
- */
-public final class SensitiveContentFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Prevents instantiation.
-    private SensitiveContentFeatures() {{}}
-}}
diff --git a/components/signin/public/android/BUILD.gn b/components/signin/public/android/BUILD.gn
index 5ad511ea..94fd6ad 100644
--- a/components/signin/public/android/BUILD.gn
+++ b/components/signin/public/android/BUILD.gn
@@ -65,7 +65,7 @@
 java_cpp_features("signin_java_features_srcjar") {
   visibility = [ ":*" ]
   sources = [ "//components/signin/public/base/signin_switches.cc" ]
-  template = "java/src/org/chromium/components/signin/SigninFeatures.java.tmpl"
+  class_name = "org.chromium.components.signin.SigninFeatures"
 }
 
 generate_jni("jni_headers") {
@@ -93,7 +93,7 @@
 
 java_cpp_strings("java_constants") {
   sources = [ "//components/signin/public/identity_manager/signin_constants.h" ]
-  template = "java_templates/SigninConstants.java.tmpl"
+  class_name = "org.chromium.components.signin.SigninConstants"
 }
 
 java_cpp_enum("java_enums") {
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/SigninFeatures.java.tmpl b/components/signin/public/android/java/src/org/chromium/components/signin/SigninFeatures.java.tmpl
deleted file mode 100644
index fb9b7fb..0000000
--- a/components/signin/public/android/java/src/org/chromium/components/signin/SigninFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.signin;
-
-/**
- * Contains constants for names of Signin features.
- */
-public final class SigninFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Prevents instantiation.
-    private SigninFeatures() {{}}
-}}
\ No newline at end of file
diff --git a/components/signin/public/android/java_templates/SigninConstants.java.tmpl b/components/signin/public/android/java_templates/SigninConstants.java.tmpl
deleted file mode 100644
index d5fdf8d..0000000
--- a/components/signin/public/android/java_templates/SigninConstants.java.tmpl
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.signin;
-
-/** Signin constants. */
-public class SigninConstants {{
-
-{NATIVE_STRINGS}
-
-}}
diff --git a/components/supervised_user/android/BUILD.gn b/components/supervised_user/android/BUILD.gn
index 51e1ce4..4f615791 100644
--- a/components/supervised_user/android/BUILD.gn
+++ b/components/supervised_user/android/BUILD.gn
@@ -16,12 +16,22 @@
   ]
 }
 
+java_cpp_strings("constants_srcjar") {
+  visibility = [ ":*" ]
+  template = "SupervisedUserConstants.java.tmpl"
+  sources = [ "//components/supervised_user/core/common/supervised_user_shared_constants.cc" ]
+}
+
 android_library("content_filters_observer_bridge_java") {
-  srcjar_deps = [ ":jni_headers" ]
+  srcjar_deps = [
+    ":constants_srcjar",
+    ":jni_headers",
+  ]
   sources = [ "java/src/org/chromium/components/supervised_user/ContentFiltersObserverBridge.java" ]
   deps = [
     "//base:base_java",
     "//build/android:build_java",
+    "//chrome/browser/profiles/android:java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/jni_zero:jni_zero_java",
   ]
diff --git a/components/supervised_user/android/SupervisedUserConstants.java.tmpl b/components/supervised_user/android/SupervisedUserConstants.java.tmpl
new file mode 100644
index 0000000..0b018bd
--- /dev/null
+++ b/components/supervised_user/android/SupervisedUserConstants.java.tmpl
@@ -0,0 +1,16 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.components.supervised_user;
+
+/**
+ * Supervised user constants that are shared between C++ and Java.
+ */
+public final class SupervisedUserConstants {{
+
+{NATIVE_STRINGS}
+
+    // Prevents instantiation.
+    private SupervisedUserConstants() {{}}
+}}
\ No newline at end of file
diff --git a/components/supervised_user/android/java/src/org/chromium/components/supervised_user/ContentFiltersObserverBridge.java b/components/supervised_user/android/java/src/org/chromium/components/supervised_user/ContentFiltersObserverBridge.java
index 21ecca296..b61c9b1e 100644
--- a/components/supervised_user/android/java/src/org/chromium/components/supervised_user/ContentFiltersObserverBridge.java
+++ b/components/supervised_user/android/java/src/org/chromium/components/supervised_user/ContentFiltersObserverBridge.java
@@ -26,7 +26,7 @@
  */
 @NullMarked
 @JNINamespace("supervised_user")
-class ContentFiltersObserverBridge {
+public class ContentFiltersObserverBridge {
 
     // Supervised User Content Filters Observer.
     private static final String TAG = "SUCFiltersObserver";
@@ -86,7 +86,7 @@
         return mIsEnabled;
     }
 
-    private boolean getValue(final String settingsName) {
+    private static boolean getValue(final String settingsName) {
         try {
             // The setting is considered enabled if the setting's value is positive.
             return Settings.Secure.getInt(
diff --git a/components/supervised_user/core/browser/BUILD.gn b/components/supervised_user/core/browser/BUILD.gn
index dcb081e..cb3fc6d9 100644
--- a/components/supervised_user/core/browser/BUILD.gn
+++ b/components/supervised_user/core/browser/BUILD.gn
@@ -35,7 +35,7 @@
     "//components/signin/public/base:test_support",
     "//components/signin/public/identity_manager",
     "//components/signin/public/identity_manager:test_support",
-    "//components/supervised_user/core/common:common",
+    "//components/supervised_user/core/common",
     "//components/supervised_user/test_support",
     "//components/sync:test_support",
     "//components/sync_preferences:test_support",
diff --git a/components/supervised_user/core/common/BUILD.gn b/components/supervised_user/core/common/BUILD.gn
index 58d2d81..89cac8f 100644
--- a/components/supervised_user/core/common/BUILD.gn
+++ b/components/supervised_user/core/common/BUILD.gn
@@ -18,6 +18,7 @@
   sources = [
     "pref_names.h",
     "supervised_user_constants.cc",
+    "supervised_user_shared_constants.cc",
     "supervised_user_constants.h",
     "supervised_users.h",
   ]
diff --git a/components/supervised_user/core/common/supervised_user_constants.cc b/components/supervised_user/core/common/supervised_user_constants.cc
index 6963da0a..0943888 100644
--- a/components/supervised_user/core/common/supervised_user_constants.cc
+++ b/components/supervised_user/core/common/supervised_user_constants.cc
@@ -146,4 +146,5 @@
     "browser_content_filters_enabled";
 const char kSearchContentFiltersSettingName[] =
     "search_content_filters_enabled";
+
 }  // namespace supervised_user
diff --git a/components/supervised_user/core/common/supervised_user_constants.h b/components/supervised_user/core/common/supervised_user_constants.h
index 5ad2f155..e10f6c5 100644
--- a/components/supervised_user/core/common/supervised_user_constants.h
+++ b/components/supervised_user/core/common/supervised_user_constants.h
@@ -253,6 +253,8 @@
 // Name of the Android's secure setting to observe the content filters.
 extern const char kBrowserContentFiltersSettingName[];
 extern const char kSearchContentFiltersSettingName[];
+// Url for the help center article about content filters.
+extern const char kDeviceFiltersHelpCenterUrl[];
 }  // namespace supervised_user
 
 #endif  // COMPONENTS_SUPERVISED_USER_CORE_COMMON_SUPERVISED_USER_CONSTANTS_H_
diff --git a/components/supervised_user/core/common/supervised_user_shared_constants.cc b/components/supervised_user/core/common/supervised_user_shared_constants.cc
new file mode 100644
index 0000000..728d3f7
--- /dev/null
+++ b/components/supervised_user/core/common/supervised_user_shared_constants.cc
@@ -0,0 +1,11 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/supervised_user/core/common/supervised_user_constants.h"
+
+// Defines constants that are exported to Java.
+namespace supervised_user {
+const char kDeviceFiltersHelpCenterUrl[] =
+    "https://support.google.com/android?p=device_supervision_web_filters";
+}  // namespace supervised_user
diff --git a/components/sync/android/BUILD.gn b/components/sync/android/BUILD.gn
index fcdf2e45..bfd70d5 100644
--- a/components/sync/android/BUILD.gn
+++ b/components/sync/android/BUILD.gn
@@ -59,5 +59,5 @@
 
 java_cpp_strings("java_prefs") {
   sources = [ "//components/sync/base/pref_names.h" ]
-  template = "java_templates/SyncPrefNames.java.tmpl"
+  class_name = "org.chromium.components.sync.internal.SyncPrefNames"
 }
diff --git a/components/sync/android/java_templates/SyncPrefNames.java.tmpl b/components/sync/android/java_templates/SyncPrefNames.java.tmpl
deleted file mode 100644
index 987dcbff..0000000
--- a/components/sync/android/java_templates/SyncPrefNames.java.tmpl
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.sync.internal;
-
-/** Names of the prefs used by syncer::SyncPrefs. */
-public class SyncPrefNames {{
-
-{NATIVE_STRINGS}
-
-}}
diff --git a/components/sync/protocol/autofill_specifics.proto b/components/sync/protocol/autofill_specifics.proto
index 3fdfe2c4..5f76a4d 100644
--- a/components/sync/protocol/autofill_specifics.proto
+++ b/components/sync/protocol/autofill_specifics.proto
@@ -613,6 +613,15 @@
   }
 
   optional DeviceDetails device_details = 8;
+
+  enum ActionRequired {
+    ACTION_REQUIRED_UNKNOWN = 0;
+    // The user needs to accept the relevant ToS to make the instrument usable.
+    ACCEPT_TOS = 1;
+  }
+
+  // The action to take to update the instrument.
+  repeated ActionRequired action_required = 10;
 }
 
 // Details for user's linked and unlinked Buy Now Pay Later issuers.
diff --git a/components/sync/protocol/proto_enum_conversions.cc b/components/sync/protocol/proto_enum_conversions.cc
index 7ad098f9..afa59d03 100644
--- a/components/sync/protocol/proto_enum_conversions.cc
+++ b/components/sync/protocol/proto_enum_conversions.cc
@@ -188,6 +188,17 @@
 }
 
 const char* ProtoEnumToString(
+    sync_pb::PaymentInstrument::ActionRequired action_required) {
+  ASSERT_ENUM_BOUNDS(sync_pb::PaymentInstrument, ActionRequired,
+                     ACTION_REQUIRED_UNKNOWN, ACCEPT_TOS);
+  switch (action_required) {
+    ENUM_CASE(sync_pb::PaymentInstrument, ACTION_REQUIRED_UNKNOWN);
+    ENUM_CASE(sync_pb::PaymentInstrument, ACCEPT_TOS);
+  }
+  NOTREACHED();
+}
+
+const char* ProtoEnumToString(
     sync_pb::PowerBookmarkSpecifics::PowerType power_type) {
   ASSERT_ENUM_BOUNDS(sync_pb::PowerBookmarkSpecifics, PowerType,
                      POWER_TYPE_UNSPECIFIED, POWER_TYPE_NOTE);
diff --git a/components/sync/protocol/proto_enum_conversions.h b/components/sync/protocol/proto_enum_conversions.h
index cb85e4d..51a53484 100644
--- a/components/sync/protocol/proto_enum_conversions.h
+++ b/components/sync/protocol/proto_enum_conversions.h
@@ -73,6 +73,9 @@
     sync_pb::PaymentInstrument::SupportedRail supported_rail);
 
 const char* ProtoEnumToString(
+    sync_pb::PaymentInstrument::ActionRequired action_required);
+
+const char* ProtoEnumToString(
     sync_pb::PowerBookmarkSpecifics::PowerType power_type);
 
 const char* ProtoEnumToString(sync_pb::NoteEntity::TargetType target_type);
diff --git a/components/sync/protocol/proto_enum_conversions_unittest.cc b/components/sync/protocol/proto_enum_conversions_unittest.cc
index f2d9ac77..9b10949 100644
--- a/components/sync/protocol/proto_enum_conversions_unittest.cc
+++ b/components/sync/protocol/proto_enum_conversions_unittest.cc
@@ -147,5 +147,9 @@
   TestEnumStringsNonEmpty(sync_pb::WalletMaskedCreditCard::CardBenefitSource);
 }
 
+TEST(ProtoEnumConversionsTest, GetActionRequiredString) {
+  TestEnumStringsNonEmpty(sync_pb::PaymentInstrument::ActionRequired);
+}
+
 }  // namespace
 }  // namespace syncer
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h
index 11f700f..f3f558d 100644
--- a/components/sync/protocol/proto_visitors.h
+++ b/components/sync/protocol/proto_visitors.h
@@ -1729,6 +1729,7 @@
   VISIT(ewallet_details);
   VISIT(device_details);
   VISIT(bnpl_issuer_details);
+  VISIT_REP(action_required);
 }
 
 VISIT_PROTO_FIELDS(const sync_pb::PaymentInstrumentCreationOption& proto) {
diff --git a/components/test/BUILD.gn b/components/test/BUILD.gn
index db5f9db2..8f52d75 100644
--- a/components/test/BUILD.gn
+++ b/components/test/BUILD.gn
@@ -95,6 +95,10 @@
     testonly = true
     filelist_name = "data/language/unit_tests_bundle_data.filelist"
   }
+  bundle_data_from_filelist("optimization_guide_test_bundle_data") {
+    testonly = true
+    filelist_name = "data/optimization_guide/unit_tests_bundle_data.filelist"
+  }
   bundle_data_from_filelist("offline_pages_test_bundle_data") {
     testonly = true
     filelist_name = "data/offline_pages/unit_tests_bundle_data.filelist"
diff --git a/components/test/PRESUBMIT.py b/components/test/PRESUBMIT.py
index 051e97c..9ad9f62 100644
--- a/components/test/PRESUBMIT.py
+++ b/components/test/PRESUBMIT.py
@@ -42,6 +42,9 @@
                 'data/language/unit_tests_bundle_data')
         results += presubmit_support.CheckBundleData(
                 input_api, output_api,
+                'data/optimization_guide/unit_tests_bundle_data')
+        results += presubmit_support.CheckBundleData(
+                input_api, output_api,
                 'data/offline_pages/unit_tests_bundle_data')
         results += presubmit_support.CheckBundleData(
                 input_api, output_api,
diff --git a/components/test/data/optimization_guide/OWNERS b/components/test/data/optimization_guide/OWNERS
new file mode 100644
index 0000000..4e6079c
--- /dev/null
+++ b/components/test/data/optimization_guide/OWNERS
@@ -0,0 +1,2 @@
+# Anyone can update the test bundle data filelist.
+per-file unit_tests_bundle_data.filelist=*
diff --git a/components/test/data/optimization_guide/unit_tests_bundle_data.filelist b/components/test/data/optimization_guide/unit_tests_bundle_data.filelist
new file mode 100644
index 0000000..84467d4
--- /dev/null
+++ b/components/test/data/optimization_guide/unit_tests_bundle_data.filelist
@@ -0,0 +1,40 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+# NOTE: this file is generated by build/ios/update_bundle_filelist.py
+#       If it requires updating, you should get a presubmit error with
+#       instructions on how to regenerate. Otherwise, do not edit.
+//components/test/data/optimization_guide/actionable_elements.html
+//components/test/data/optimization_guide/aria_role.html
+//components/test/data/optimization_guide/bert_page_topics_model.tflite
+//components/test/data/optimization_guide/canvas.html
+//components/test/data/optimization_guide/clickability_reason.html
+//components/test/data/optimization_guide/cross_origin_image.html
+//components/test/data/optimization_guide/data_image.html
+//components/test/data/optimization_guide/deep.html
+//components/test/data/optimization_guide/deep_sparse.html
+//components/test/data/optimization_guide/fenced_frame/basic.html
+//components/test/data/optimization_guide/fenced_frame/basic.html.mock-http-headers
+//components/test/data/optimization_guide/fenced_frame/simple.html
+//components/test/data/optimization_guide/fenced_frame/simple.html.mock-http-headers
+//components/test/data/optimization_guide/for_label.html
+//components/test/data/optimization_guide/i18n_visibility_test_model.tflite
+//components/test/data/optimization_guide/iframe_cross_site.html
+//components/test/data/optimization_guide/iframe_same_site.html
+//components/test/data/optimization_guide/invalid_model.crx3
+//components/test/data/optimization_guide/label_not_actionable.html
+//components/test/data/optimization_guide/page_topics_128_model.tflite
+//components/test/data/optimization_guide/paid_content.html
+//components/test/data/optimization_guide/paragraph.html
+//components/test/data/optimization_guide/paragraph_iframe_data_url.html
+//components/test/data/optimization_guide/paragraph_iframe_partially_offscreen.html
+//components/test/data/optimization_guide/paragraph_iframe_partially_scrolled_offscreen.html
+//components/test/data/optimization_guide/paragraph_iframe_sandbox.html
+//components/test/data/optimization_guide/relative_path.html
+//components/test/data/optimization_guide/scroller.html
+//components/test/data/optimization_guide/simple.html
+//components/test/data/optimization_guide/simple_test.tflite
+//components/test/data/optimization_guide/svg.html
+//components/test/data/optimization_guide/title1.html
+//components/test/data/optimization_guide/video.html
+//components/test/data/optimization_guide/visibility_test_model.tflite
diff --git a/components/test/data/optimization_guide/unit_tests_bundle_data.globlist b/components/test/data/optimization_guide/unit_tests_bundle_data.globlist
new file mode 100644
index 0000000..4bb82455
--- /dev/null
+++ b/components/test/data/optimization_guide/unit_tests_bundle_data.globlist
@@ -0,0 +1,10 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# See build/ios/update_bundle_filelist.py for details on how .globlist
+# files are used to update their .filelist counterparts.
+//components/test/data/optimization_guide/**
+-//components/test/data/optimization_guide/*.filelist
+-//components/test/data/optimization_guide/*.globlist
+-//components/test/data/optimization_guide/OWNERS
diff --git a/components/tpcd/metadata/browser/parser.h b/components/tpcd/metadata/browser/parser.h
index 0b20cb75..d9a68b1 100644
--- a/components/tpcd/metadata/browser/parser.h
+++ b/components/tpcd/metadata/browser/parser.h
@@ -10,6 +10,7 @@
 #include <string>
 #include <vector>
 
+#include "base/functional/callback_helpers.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/observer_list.h"
 #include "base/sequence_checker.h"
diff --git a/components/translate/ios/browser/translate_java_script_feature.mm b/components/translate/ios/browser/translate_java_script_feature.mm
index e000443..94334e1 100644
--- a/components/translate/ios/browser/translate_java_script_feature.mm
+++ b/components/translate/ios/browser/translate_java_script_feature.mm
@@ -5,6 +5,7 @@
 #import "components/translate/ios/browser/translate_java_script_feature.h"
 
 #import "base/check_op.h"
+#import "base/functional/callback_helpers.h"
 #import "base/strings/utf_string_conversions.h"
 #import "components/translate/ios/browser/translate_controller.h"
 #import "ios/web/public/js_messaging/script_message.h"
diff --git a/components/user_education/common/BUILD.gn b/components/user_education/common/BUILD.gn
index 0545ec4..99f74c0 100644
--- a/components/user_education/common/BUILD.gn
+++ b/components/user_education/common/BUILD.gn
@@ -54,6 +54,8 @@
     "new_badge/new_badge_policy.h",
     "new_badge/new_badge_specification.cc",
     "new_badge/new_badge_specification.h",
+    "ntp_promo/ntp_promo_controller.cc",
+    "ntp_promo/ntp_promo_controller.h",
     "ntp_promo/ntp_promo_identifier.h",
     "ntp_promo/ntp_promo_registry.cc",
     "ntp_promo/ntp_promo_registry.h",
@@ -133,6 +135,7 @@
     "feature_promo/impl/precondition_list_provider_unittest.cc",
     "help_bubble/help_bubble_factory_registry_unittest.cc",
     "new_badge/new_badge_controller_unittest.cc",
+    "ntp_promo/ntp_promo_controller_unittest.cc",
     "ntp_promo/ntp_promo_registry_unittest.cc",
     "product_messaging_controller_unittest.cc",
     "session/user_education_session_manager_unittest.cc",
diff --git a/components/user_education/common/ntp_promo/ntp_promo_controller.cc b/components/user_education/common/ntp_promo/ntp_promo_controller.cc
new file mode 100644
index 0000000..2dbb68ac
--- /dev/null
+++ b/components/user_education/common/ntp_promo/ntp_promo_controller.cc
@@ -0,0 +1,69 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/user_education/common/ntp_promo/ntp_promo_controller.h"
+
+#include "components/user_education/common/user_education_data.h"
+// #include "components/user_education/common/user_education_features.h"
+#include "components/user_education/common/user_education_storage_service.h"
+
+namespace user_education {
+
+NtpShowablePromos::NtpShowablePromos() = default;
+NtpShowablePromos::~NtpShowablePromos() = default;
+NtpShowablePromos::NtpShowablePromos(NtpShowablePromos&&) noexcept = default;
+NtpShowablePromos& NtpShowablePromos::operator=(NtpShowablePromos&&) noexcept =
+    default;
+
+NtpShowablePromos::Promo::Promo(NtpPromoIdentifier id,
+                                const NtpPromoContent& content)
+    : id(id), content(content) {}
+
+NtpPromoController::NtpPromoController(
+    NtpPromoRegistry& registry,
+    UserEducationStorageService& storage_service)
+    : registry_(registry), storage_service_(storage_service) {}
+
+NtpPromoController::~NtpPromoController() = default;
+
+NtpShowablePromos NtpPromoController::GetShowablePromos() {
+  NtpShowablePromos showable_promos;
+
+  for (const auto& id : registry_->GetNtpPromoIdentifiers()) {
+    const auto* spec = registry_->GetNtpPromoSpecification(id);
+    // TODO: Could this be null due to modifying Web UI state? Be tolerant?
+    CHECK(spec);
+
+    NtpPromoSpecification::Eligibility eligibility =
+        spec->eligibility_callback().Run(nullptr);
+    if (eligibility == NtpPromoSpecification::Eligibility::kIneligible) {
+      continue;
+    }
+
+    bool completed =
+        (eligibility == NtpPromoSpecification::Eligibility::kCompleted);
+    if (!completed) {
+      // If the promo has ever been completed in the past, considered it
+      // complete even if it's reverted to eligible state.
+      // TODO(crbug.com/425677412): Show only for a period of time after
+      // completion.
+      const auto prefs = storage_service_->ReadNtpPromoData(id);
+      completed = (prefs.has_value() && !prefs.value().completed.is_null());
+    }
+
+    (completed ? showable_promos.completed : showable_promos.pending)
+        .emplace_back(id, spec->content());
+
+    // TODO(crbug.com/425677412): Store completed state if observed here, in
+    // lieu of explicit signals from the promo flows.
+  }
+
+  return showable_promos;
+}
+
+void NtpPromoController::OnPromoClicked(NtpPromoIdentifier id) {
+  registry_->GetNtpPromoSpecification(id)->action_callback().Run(nullptr);
+}
+
+}  // namespace user_education
diff --git a/components/user_education/common/ntp_promo/ntp_promo_controller.h b/components/user_education/common/ntp_promo/ntp_promo_controller.h
new file mode 100644
index 0000000..0e52479f
--- /dev/null
+++ b/components/user_education/common/ntp_promo/ntp_promo_controller.h
@@ -0,0 +1,67 @@
+// Copyright 2024 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_USER_EDUCATION_COMMON_NTP_PROMO_NTP_PROMO_CONTROLLER_H_
+#define COMPONENTS_USER_EDUCATION_COMMON_NTP_PROMO_NTP_PROMO_CONTROLLER_H_
+
+#include <memory>
+
+#include "base/auto_reset.h"
+#include "base/feature_list.h"
+#include "base/memory/raw_ref.h"
+#include "components/user_education/common/feature_promo/feature_promo_registry.h"
+#include "components/user_education/common/ntp_promo/ntp_promo_registry.h"
+#include "components/user_education/common/ntp_promo/ntp_promo_specification.h"
+#include "components/user_education/common/user_education_data.h"
+#include "components/user_education/common/user_education_storage_service.h"
+#include "ui/menus/simple_menu_model.h"
+
+namespace user_education {
+
+// This struct provides ordered sets of pending and completed promos, intended
+// for use by the New Tab Page.
+struct NtpShowablePromos {
+  NtpShowablePromos();
+  ~NtpShowablePromos();
+  NtpShowablePromos(NtpShowablePromos&&) noexcept;
+  NtpShowablePromos& operator=(NtpShowablePromos&&) noexcept;
+
+  struct Promo {
+    Promo(NtpPromoIdentifier id, const NtpPromoContent& content);
+
+    std::string id;
+    NtpPromoContent content;
+  };
+
+  // Lists of promos, in descending priority order. Ie, if the UI chooses to
+  // show only one promo from a list, choose the first one.
+  std::vector<Promo> pending;
+  std::vector<Promo> completed;
+};
+
+// Controls display of New Tab Page promos.
+class NtpPromoController {
+ public:
+  NtpPromoController(const NtpPromoController&) = delete;
+  ~NtpPromoController();
+  void operator=(const NtpPromoController&) = delete;
+
+  NtpPromoController(NtpPromoRegistry& registry,
+                     UserEducationStorageService& storage_service);
+
+  // Provides ordered lists of eligible and completed promos, intended to be
+  // displayed by the NTP.
+  NtpShowablePromos GetShowablePromos();
+
+  // Called in response to an NTP promo activation.
+  void OnPromoClicked(NtpPromoIdentifier id);
+
+ private:
+  const raw_ref<NtpPromoRegistry> registry_;
+  const raw_ref<UserEducationStorageService> storage_service_;
+};
+
+}  // namespace user_education
+
+#endif  // COMPONENTS_USER_EDUCATION_COMMON_NTP_PROMO_NTP_PROMO_CONTROLLER_H_
diff --git a/components/user_education/common/ntp_promo/ntp_promo_controller_unittest.cc b/components/user_education/common/ntp_promo/ntp_promo_controller_unittest.cc
new file mode 100644
index 0000000..783f91e3
--- /dev/null
+++ b/components/user_education/common/ntp_promo/ntp_promo_controller_unittest.cc
@@ -0,0 +1,110 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/user_education/common/ntp_promo/ntp_promo_controller.h"
+
+#include "base/test/mock_callback.h"
+#include "components/user_education/common/ntp_promo/ntp_promo_registry.h"
+#include "components/user_education/common/ntp_promo/ntp_promo_specification.h"
+#include "components/user_education/common/user_education_data.h"
+#include "components/user_education/test/test_user_education_storage_service.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace user_education {
+
+namespace {
+
+using ::testing::_;
+using ::testing::Return;
+
+constexpr char kPromoId[] = "promo";
+
+class NtpPromoControllerTest : public testing::Test {
+ public:
+  NtpPromoControllerTest() : controller_(registry_, storage_service_) {}
+
+ protected:
+  void RegisterPromo(
+      NtpPromoIdentifier id,
+      NtpPromoSpecification::EligibilityCallback eligibility_callback,
+      NtpPromoSpecification::ActionCallback action_callback) {
+    registry_.AddPromo(NtpPromoSpecification(
+        id, NtpPromoContent("", 0, 0), eligibility_callback, action_callback,
+        /*show_after=*/{}, user_education::Metadata()));
+  }
+
+  NtpPromoRegistry registry_;
+  test::TestUserEducationStorageService storage_service_;
+  NtpPromoController controller_;
+};
+
+}  // namespace
+
+// Note: Parameterize these eligibility tests when there are more of them.
+TEST_F(NtpPromoControllerTest, IneligiblePromoHidden) {
+  base::MockRepeatingCallback<NtpPromoSpecification::Eligibility(Profile*)>
+      eligibility_callback;
+  RegisterPromo(kPromoId, eligibility_callback.Get(),
+                NtpPromoSpecification::ActionCallback());
+  EXPECT_CALL(eligibility_callback, Run(_))
+      .WillOnce(Return(NtpPromoSpecification::Eligibility::kIneligible));
+
+  const auto showable_promos = controller_.GetShowablePromos();
+  EXPECT_TRUE(showable_promos.pending.empty());
+  EXPECT_TRUE(showable_promos.completed.empty());
+}
+
+TEST_F(NtpPromoControllerTest, EligiblePromoShows) {
+  base::MockRepeatingCallback<NtpPromoSpecification::Eligibility(Profile*)>
+      eligibility_callback;
+  RegisterPromo(kPromoId, eligibility_callback.Get(),
+                NtpPromoSpecification::ActionCallback());
+  EXPECT_CALL(eligibility_callback, Run(_))
+      .WillOnce(Return(NtpPromoSpecification::Eligibility::kEligible));
+
+  const auto showable_promos = controller_.GetShowablePromos();
+  EXPECT_EQ(showable_promos.pending.size(), 1u);
+  EXPECT_TRUE(showable_promos.completed.empty());
+}
+
+TEST_F(NtpPromoControllerTest, CompletedPromoShows) {
+  base::MockRepeatingCallback<NtpPromoSpecification::Eligibility(Profile*)>
+      eligibility_callback;
+  RegisterPromo(kPromoId, eligibility_callback.Get(),
+                NtpPromoSpecification::ActionCallback());
+  EXPECT_CALL(eligibility_callback, Run(_))
+      .WillOnce(Return(NtpPromoSpecification::Eligibility::kCompleted));
+
+  const auto showable_promos = controller_.GetShowablePromos();
+  EXPECT_TRUE(showable_promos.pending.empty());
+  EXPECT_EQ(showable_promos.completed.size(), 1u);
+}
+
+TEST_F(NtpPromoControllerTest, MarkedCompletePromoShows) {
+  base::MockRepeatingCallback<NtpPromoSpecification::Eligibility(Profile*)>
+      eligibility_callback;
+  RegisterPromo(kPromoId, eligibility_callback.Get(),
+                NtpPromoSpecification::ActionCallback());
+  EXPECT_CALL(eligibility_callback, Run(_))
+      .WillOnce(Return(NtpPromoSpecification::Eligibility::kEligible));
+
+  user_education::KeyedNtpPromoData keyed_data;
+  keyed_data.completed = base::Time::Now();
+  storage_service_.SaveNtpPromoData(kPromoId, keyed_data);
+
+  const auto showable_promos = controller_.GetShowablePromos();
+  EXPECT_TRUE(showable_promos.pending.empty());
+  EXPECT_EQ(showable_promos.completed.size(), 1u);
+}
+
+TEST_F(NtpPromoControllerTest, ClickInvokesPromoAction) {
+  base::MockRepeatingCallback<void(Browser*)> action_callback;
+  RegisterPromo(kPromoId, NtpPromoSpecification::EligibilityCallback(),
+                action_callback.Get());
+  EXPECT_CALL(action_callback, Run(_));
+  controller_.OnPromoClicked(kPromoId);
+}
+
+}  // namespace user_education
diff --git a/components/user_education/common/ntp_promo/ntp_promo_specification.cc b/components/user_education/common/ntp_promo/ntp_promo_specification.cc
index 064ef88..dc239c7 100644
--- a/components/user_education/common/ntp_promo/ntp_promo_specification.cc
+++ b/components/user_education/common/ntp_promo/ntp_promo_specification.cc
@@ -10,9 +10,8 @@
 
 namespace user_education {
 
+NtpPromoContent::NtpPromoContent(const NtpPromoContent&) = default;
 NtpPromoContent::NtpPromoContent(NtpPromoContent&&) noexcept = default;
-NtpPromoSpecification::NtpPromoSpecification(NtpPromoSpecification&&) noexcept =
-    default;
 NtpPromoContent::~NtpPromoContent() = default;
 
 NtpPromoContent::NtpPromoContent(std::string_view icon_name,
@@ -23,6 +22,8 @@
       action_button_text_string_id_(action_button_text_string_id) {}
 
 NtpPromoSpecification::~NtpPromoSpecification() = default;
+NtpPromoSpecification::NtpPromoSpecification(NtpPromoSpecification&&) noexcept =
+    default;
 
 NtpPromoSpecification::NtpPromoSpecification(
     NtpPromoIdentifier id,
diff --git a/components/user_education/common/ntp_promo/ntp_promo_specification.h b/components/user_education/common/ntp_promo/ntp_promo_specification.h
index 31f28cb..8e9a47d7 100644
--- a/components/user_education/common/ntp_promo/ntp_promo_specification.h
+++ b/components/user_education/common/ntp_promo/ntp_promo_specification.h
@@ -26,6 +26,7 @@
 class NtpPromoContent {
  public:
   NtpPromoContent() = delete;
+  NtpPromoContent(const NtpPromoContent&);
   NtpPromoContent(NtpPromoContent&&) noexcept;
   ~NtpPromoContent();
   NtpPromoContent(std::string_view icon_name,
@@ -69,6 +70,10 @@
                         user_education::Metadata);
 
   const NtpPromoContent& content() const { return content_; }
+  EligibilityCallback eligibility_callback() const {
+    return eligibility_callback_;
+  }
+  ActionCallback action_callback() const { return action_callback_; }
   const std::string& id() const { return id_; }
   const base::flat_set<NtpPromoIdentifier>& show_after() const {
     return show_after_;
diff --git a/components/variations/BUILD.gn b/components/variations/BUILD.gn
index 0574ba5..be05767 100644
--- a/components/variations/BUILD.gn
+++ b/components/variations/BUILD.gn
@@ -175,7 +175,7 @@
     # External code should depend on ":variations_java" instead.
     visibility = [ ":*" ]
     sources = [ "variations_switches.cc" ]
-    template = "//components/variations/android/java_templates/VariationsSwitches.java.tmpl"
+    class_name = "org.chromium.components.variations.VariationsSwitches"
   }
 
   android_library("variations_java") {
diff --git a/components/variations/android/java_templates/VariationsSwitches.java.tmpl b/components/variations/android/java_templates/VariationsSwitches.java.tmpl
deleted file mode 100644
index 7dc61ca3..0000000
--- a/components/variations/android/java_templates/VariationsSwitches.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.variations;
-
-/**
- * Contains command line switches that are specific to the variations component.
- */
-public final class VariationsSwitches {{
-
-{NATIVE_STRINGS}
-
-    // Prevents instantiation.
-    private VariationsSwitches() {{}}
-}}
diff --git a/components/viz/BUILD.gn b/components/viz/BUILD.gn
index 31954124..f1d1117 100644
--- a/components/viz/BUILD.gn
+++ b/components/viz/BUILD.gn
@@ -95,7 +95,7 @@
     # External code should depend on ":viz_java" instead.
     visibility = [ ":*" ]
     sources = [ "common/features.cc" ]
-    template = "common/java/src/org/chromium/components/viz/common/VizFeatures.java.tmpl"
+    class_name = "org.chromium.components.viz.common.VizFeatures"
   }
 
   android_library("viz_java") {
diff --git a/components/viz/common/java/src/org/chromium/components/viz/common/VizFeatures.java.tmpl b/components/viz/common/java/src/org/chromium/components/viz/common/VizFeatures.java.tmpl
deleted file mode 100644
index a2691bb..0000000
--- a/components/viz/common/java/src/org/chromium/components/viz/common/VizFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.viz.common;
-
-/**
- * Constants for the names of Viz Features.
- */
-public final class VizFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Prevent instantiation.
-    private VizFeatures() {{}}
-}}
diff --git a/components/viz/service/display/renderer_pixeltest.cc b/components/viz/service/display/renderer_pixeltest.cc
index 9f08df9..a8c8667 100644
--- a/components/viz/service/display/renderer_pixeltest.cc
+++ b/components/viz/service/display/renderer_pixeltest.cc
@@ -440,16 +440,13 @@
     const gfx::Rect& rect,
     const gfx::Rect& visible_rect,
     const gfx::Rect& foreground_rect) {
-  std::unique_ptr<unsigned char, base::AlignedFreeDeleter> memory(
-      static_cast<unsigned char*>(
-          base::AlignedAlloc(rect.size().GetArea() * 2,
-                             media::VideoFrame::kFrameAddressAlignment)));
+  base::AlignedHeapArray<uint8_t> memory = base::AlignedUninit<uint8_t>(
+      rect.size().GetArea() * 2, media::VideoFrame::kFrameAddressAlignment);
   const gfx::Rect video_visible_rect = gfx::Rect(rect.width(), rect.height());
   scoped_refptr<media::VideoFrame> video_frame =
       media::VideoFrame::WrapExternalData(
           media::PIXEL_FORMAT_Y16, rect.size(), video_visible_rect,
-          visible_rect.size(), memory.get(), rect.size().GetArea() * 2,
-          base::TimeDelta());
+          visible_rect.size(), memory, base::TimeDelta());
   DCHECK_EQ(video_frame->rows(0) % 2, 0);
   DCHECK_EQ(video_frame->stride(0) % 2, 0ul);
 
diff --git a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc
index d46a6153..2a4e1f9f 100644
--- a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc
+++ b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc
@@ -273,8 +273,7 @@
       ASSERT_LE(required_bytes_to_hold_planes, mapping.size());
       frame = media::VideoFrame::WrapExternalData(
           info->pixel_format, info->coded_size, info->visible_rect,
-          info->visible_rect.size(), mapping.GetMemoryAs<const uint8_t>(),
-          mapping.size(), info->timestamp);
+          info->visible_rect.size(), mapping, info->timestamp);
       ASSERT_TRUE(frame);
       frame->AddDestructionObserver(
           base::BindOnce([](base::ReadOnlySharedMemoryMapping mapping) {},
diff --git a/components/viz/service/frame_sinks/video_capture/shared_memory_video_frame_pool.cc b/components/viz/service/frame_sinks/video_capture/shared_memory_video_frame_pool.cc
index 5217379..bd9c3e1 100644
--- a/components/viz/service/frame_sinks/video_capture/shared_memory_video_frame_pool.cc
+++ b/components/viz/service/frame_sinks/video_capture/shared_memory_video_frame_pool.cc
@@ -113,10 +113,9 @@
   // and 2) the mapped memory remains valid until the
   // WritableSharedMemoryMapping goes out-of-scope (when the OnceClosure is
   // destroyed).
-  scoped_refptr<VideoFrame> frame = VideoFrame::WrapExternalData(
-      format, size, gfx::Rect(size), size,
-      static_cast<uint8_t*>(pooled_buffer.mapping.memory()),
-      pooled_buffer.mapping.size(), base::TimeDelta());
+  scoped_refptr<VideoFrame> frame =
+      VideoFrame::WrapExternalData(format, size, gfx::Rect(size), size,
+                                   pooled_buffer.mapping, base::TimeDelta());
   CHECK(frame);
   // Sanity-check the assumption being made for SetMarkedBuffer():
   CHECK_EQ(frame->data(0), pooled_buffer.mapping.memory());
diff --git a/components/viz/service/layers/layer_context_impl.cc b/components/viz/service/layers/layer_context_impl.cc
index 96ac7930..114b1c37 100644
--- a/components/viz/service/layers/layer_context_impl.cc
+++ b/components/viz/service/layers/layer_context_impl.cc
@@ -679,6 +679,8 @@
                                  cc::TileDisplayLayerImpl& layer) {
   layer.SetSolidColor(extra->solid_color);
   layer.SetIsBackdropFilterMask(extra->is_backdrop_filter_mask);
+  layer.SetIsDirectlyCompositedImage(extra->is_directly_composited_image);
+  layer.SetNearestNeighbor(extra->nearest_neighbor);
 }
 
 base::expected<void, std::string> UpdateLayer(const mojom::Layer& wire,
diff --git a/components/viz/service/layers/layer_context_impl_unittest.cc b/components/viz/service/layers/layer_context_impl_unittest.cc
index d5cbc738..1187aa576 100644
--- a/components/viz/service/layers/layer_context_impl_unittest.cc
+++ b/components/viz/service/layers/layer_context_impl_unittest.cc
@@ -1753,6 +1753,108 @@
   EXPECT_FALSE(tile_display_layer_impl->is_backdrop_filter_mask_for_testing());
 }
 
+TEST_F(LayerContextImplUpdateDisplayTreeTileDisplayLayerPropertiesTest,
+       UpdateIsDirectlyCompositedImage) {
+  constexpr int kLayerId = 2;
+
+  // Initial update: Create TileDisplayLayer with default properties.
+  auto update1 = CreateDefaultUpdate();
+  AddDefaultLayerToUpdate(update1.get(), cc::mojom::LayerType::kTileDisplay,
+                          kLayerId);
+  EXPECT_TRUE(
+      layer_context_impl_->DoUpdateDisplayTree(std::move(update1)).has_value());
+
+  cc::LayerImpl* layer_impl_base = GetLayerFromActiveTree(kLayerId);
+  ASSERT_NE(nullptr, layer_impl_base);
+  ASSERT_EQ(layer_impl_base->GetLayerType(),
+            cc::mojom::LayerType::kTileDisplay);
+  auto* tile_display_layer_impl =
+      static_cast<cc::TileDisplayLayerImpl*>(layer_impl_base);
+
+  EXPECT_FALSE(tile_display_layer_impl->is_directly_composited_image());
+
+  // Second update: Set is_directly_composited_image to true.
+  auto update2 = CreateDefaultUpdate();
+  auto layer_props2 =
+      CreateManualLayer(kLayerId, cc::mojom::LayerType::kTileDisplay);
+  auto tile_extra2 = mojom::TileDisplayLayerExtra::New();
+  tile_extra2->is_directly_composited_image = true;
+  layer_props2->layer_extra =
+      mojom::LayerExtra::NewTileDisplayLayerExtra(std::move(tile_extra2));
+  update2->layers.push_back(std::move(layer_props2));
+
+  EXPECT_TRUE(
+      layer_context_impl_->DoUpdateDisplayTree(std::move(update2)).has_value());
+
+  EXPECT_TRUE(tile_display_layer_impl->is_directly_composited_image());
+
+  // Third update: Set is_directly_composited_image to false.
+  auto update3 = CreateDefaultUpdate();
+  auto layer_props3 =
+      CreateManualLayer(kLayerId, cc::mojom::LayerType::kTileDisplay);
+  auto tile_extra3 = mojom::TileDisplayLayerExtra::New();
+  tile_extra3->is_directly_composited_image = false;
+  layer_props3->layer_extra =
+      mojom::LayerExtra::NewTileDisplayLayerExtra(std::move(tile_extra3));
+  update3->layers.push_back(std::move(layer_props3));
+
+  EXPECT_TRUE(
+      layer_context_impl_->DoUpdateDisplayTree(std::move(update3)).has_value());
+
+  EXPECT_FALSE(tile_display_layer_impl->is_directly_composited_image());
+}
+
+TEST_F(LayerContextImplUpdateDisplayTreeTileDisplayLayerPropertiesTest,
+       UpdateNearestNeighbor) {
+  constexpr int kLayerId = 2;
+
+  // Initial update: Create TileDisplayLayer with default properties.
+  auto update1 = CreateDefaultUpdate();
+  AddDefaultLayerToUpdate(update1.get(), cc::mojom::LayerType::kTileDisplay,
+                          kLayerId);
+  EXPECT_TRUE(
+      layer_context_impl_->DoUpdateDisplayTree(std::move(update1)).has_value());
+
+  cc::LayerImpl* layer_impl_base = GetLayerFromActiveTree(kLayerId);
+  ASSERT_NE(nullptr, layer_impl_base);
+  ASSERT_EQ(layer_impl_base->GetLayerType(),
+            cc::mojom::LayerType::kTileDisplay);
+  auto* tile_display_layer_impl =
+      static_cast<cc::TileDisplayLayerImpl*>(layer_impl_base);
+
+  EXPECT_FALSE(tile_display_layer_impl->nearest_neighbor());
+
+  // Second update: Set nearest_neighbor to true.
+  auto update2 = CreateDefaultUpdate();
+  auto layer_props2 =
+      CreateManualLayer(kLayerId, cc::mojom::LayerType::kTileDisplay);
+  auto tile_extra2 = mojom::TileDisplayLayerExtra::New();
+  tile_extra2->nearest_neighbor = true;
+  layer_props2->layer_extra =
+      mojom::LayerExtra::NewTileDisplayLayerExtra(std::move(tile_extra2));
+  update2->layers.push_back(std::move(layer_props2));
+
+  EXPECT_TRUE(
+      layer_context_impl_->DoUpdateDisplayTree(std::move(update2)).has_value());
+
+  EXPECT_TRUE(tile_display_layer_impl->nearest_neighbor());
+
+  // Third update: Set nearest_neighbor to false.
+  auto update3 = CreateDefaultUpdate();
+  auto layer_props3 =
+      CreateManualLayer(kLayerId, cc::mojom::LayerType::kTileDisplay);
+  auto tile_extra3 = mojom::TileDisplayLayerExtra::New();
+  tile_extra3->nearest_neighbor = false;
+  layer_props3->layer_extra =
+      mojom::LayerExtra::NewTileDisplayLayerExtra(std::move(tile_extra3));
+  update3->layers.push_back(std::move(layer_props3));
+
+  EXPECT_TRUE(
+      layer_context_impl_->DoUpdateDisplayTree(std::move(update3)).has_value());
+
+  EXPECT_FALSE(tile_display_layer_impl->nearest_neighbor());
+}
+
 TEST_F(LayerContextImplUpdateDisplayTreeTilingTest, TilingAndTileLifecycle) {
   constexpr int kLayerId = 2;
   constexpr float kScaleKey1 = 1.0f;
diff --git a/content/browser/accessibility/snapshot_ax_tree_browsertest.cc b/content/browser/accessibility/snapshot_ax_tree_browsertest.cc
index 9c9e0400..c6f7d1c50 100644
--- a/content/browser/accessibility/snapshot_ax_tree_browsertest.cc
+++ b/content/browser/accessibility/snapshot_ax_tree_browsertest.cc
@@ -509,19 +509,10 @@
   // element to element is possible by walking the snapshots in parallel.
 
   auto total_attribute_count = [](const ui::AXNodeData& node_data) {
-    size_t bool_attr_size = 0;
-    if (auto bool_vector =
-            std::get_if<std::vector<std::pair<ax::mojom::BoolAttribute, bool>>>(
-                &node_data.bool_attributes)) {
-      bool_attr_size = bool_vector->size();
-    } else if (auto bool_bitset =
-                   std::get_if<ui::AXBitset<ax::mojom::BoolAttribute>>(
-                       &node_data.bool_attributes)) {
-      bool_attr_size = bool_bitset->size();
-    }
     return node_data.string_attributes.size() +
            node_data.int_attributes.size() + node_data.float_attributes.size() +
-           bool_attr_size + node_data.intlist_attributes.size() +
+           node_data.bool_attributes.size() +
+           node_data.intlist_attributes.size() +
            node_data.stringlist_attributes.size() +
            node_data.html_attributes.size();
   };
diff --git a/content/browser/devtools/devtools_video_consumer.cc b/content/browser/devtools/devtools_video_consumer.cc
index cb1e5f4..3e4467a 100644
--- a/content/browser/devtools/devtools_video_consumer.cc
+++ b/content/browser/devtools/devtools_video_consumer.cc
@@ -178,7 +178,7 @@
   // portion of the frame that contains content is used.
   scoped_refptr<media::VideoFrame> frame = media::VideoFrame::WrapExternalData(
       info->pixel_format, info->coded_size, content_rect, content_rect.size(),
-      mapping_memory.data(), mapping_memory.size(), info->timestamp);
+      mapping_memory, info->timestamp);
   if (!frame) {
     DLOG(ERROR) << "Unable to create VideoFrame wrapper around the shmem.";
     return;
diff --git a/content/browser/media/capture/fake_video_capture_stack.cc b/content/browser/media/capture/fake_video_capture_stack.cc
index 97d9cef..feeca83 100644
--- a/content/browser/media/capture/fake_video_capture_stack.cc
+++ b/content/browser/media/capture/fake_video_capture_stack.cc
@@ -148,8 +148,7 @@
     auto video_frame = media::VideoFrame::WrapExternalData(
         frame.frame_info->pixel_format, frame.frame_info->coded_size,
         frame.frame_info->visible_rect, frame.frame_info->visible_rect.size(),
-        mapping.GetMemoryAs<const uint8_t>(), mapping.size(),
-        frame.frame_info->timestamp);
+        mapping, frame.frame_info->timestamp);
     CHECK(video_frame);
 
     video_frame->set_metadata(frame.frame_info->metadata);
diff --git a/content/browser/preloading/prefetch/prefetch_features.cc b/content/browser/preloading/prefetch/prefetch_features.cc
index ec129f30..e8009a8e 100644
--- a/content/browser/preloading/prefetch/prefetch_features.cc
+++ b/content/browser/preloading/prefetch/prefetch_features.cc
@@ -101,4 +101,12 @@
 BASE_FEATURE(kPrefetchCanaryCheckerParams,
              "PrefetchCanaryCheckerParams",
              base::FEATURE_ENABLED_BY_DEFAULT);
+
+BASE_FEATURE(kPrefetchMultipleActiveSetSizeLimitForBase,
+             "PrefetchMultipleActiveSetSizeLimitForBase",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+const base::FeatureParam<size_t>
+    kPrefetchMultipleActiveSetSizeLimitForBaseValue{
+        &kPrefetchMultipleActiveSetSizeLimitForBase,
+        "prefetch_multiple_active_set_size_limit_for_base_value", 2};
 }  // namespace features
diff --git a/content/browser/preloading/prefetch/prefetch_features.h b/content/browser/preloading/prefetch/prefetch_features.h
index 0bd5037a..502903e0 100644
--- a/content/browser/preloading/prefetch/prefetch_features.h
+++ b/content/browser/preloading/prefetch/prefetch_features.h
@@ -116,6 +116,10 @@
 // Controls field trials parameters for prefetch canary checker.
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kPrefetchCanaryCheckerParams);
 
+// Allows multiple base limit on `PrefetchScheduler`.
+CONTENT_EXPORT BASE_DECLARE_FEATURE(kPrefetchMultipleActiveSetSizeLimitForBase);
+CONTENT_EXPORT extern const base::FeatureParam<size_t>
+    kPrefetchMultipleActiveSetSizeLimitForBaseValue;
 }  // namespace features
 
 #endif  // CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_FEATURES_H_
diff --git a/content/browser/preloading/prefetch/prefetch_params.cc b/content/browser/preloading/prefetch/prefetch_params.cc
index 1920bdd..b6fdf23 100644
--- a/content/browser/preloading/prefetch/prefetch_params.cc
+++ b/content/browser/preloading/prefetch/prefetch_params.cc
@@ -300,7 +300,9 @@
          features::kPrerender2FallbackPrefetchSchedulerPolicy.Get() !=
              features::Prerender2FallbackPrefetchSchedulerPolicy::kNotUse ||
          base::FeatureList::IsEnabled(
-             features::kWebViewPrefetchHighestPrefetchPriority);
+             features::kWebViewPrefetchHighestPrefetchPriority) ||
+         base::FeatureList::IsEnabled(
+             features::kPrefetchMultipleActiveSetSizeLimitForBase);
 }
 
 }  // namespace content
diff --git a/content/browser/preloading/prefetch/prefetch_scheduler.cc b/content/browser/preloading/prefetch/prefetch_scheduler.cc
index cfd09ba..b398fac 100644
--- a/content/browser/preloading/prefetch/prefetch_scheduler.cc
+++ b/content/browser/preloading/prefetch/prefetch_scheduler.cc
@@ -26,6 +26,11 @@
     return features::kPrefetchSchedulerTestingActiveSetSizeLimitForBase.Get();
   }
 
+  if (base::FeatureList::IsEnabled(
+          features::kPrefetchMultipleActiveSetSizeLimitForBase)) {
+    return features::kPrefetchMultipleActiveSetSizeLimitForBaseValue.Get();
+  }
+
   return 1;
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_delegate.h b/content/browser/renderer_host/render_widget_host_delegate.h
index 09eadc0..db4ab8d9 100644
--- a/content/browser/renderer_host/render_widget_host_delegate.h
+++ b/content/browser/renderer_host/render_widget_host_delegate.h
@@ -15,7 +15,6 @@
 #include "build/build_config.h"
 #include "components/input/render_input_router.mojom.h"
 #include "components/viz/common/vertical_scroll_direction.h"
-#include "content/browser/renderer_host/render_widget_host_view_child_frame.h"
 #include "content/common/content_export.h"
 #include "content/public/common/drop_data.h"
 #include "services/metrics/public/cpp/ukm_recorder.h"
@@ -56,6 +55,7 @@
 
 class RenderFrameProxyHost;
 class RenderWidgetHostImpl;
+class RenderWidgetHostViewBase;
 class RenderViewHostDelegateView;
 class TextInputManager;
 class VisibleTimeRequestTrigger;
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc
index 0c03e9b6..6ae17dd 100644
--- a/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -51,6 +51,7 @@
 #include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
+#include "content/browser/renderer_host/render_widget_host_view_child_frame.h"
 #include "content/browser/renderer_host/text_input_manager.h"
 #include "content/browser/web_contents/web_contents_view.h"
 #include "content/common/content_navigation_policy.h"
diff --git a/content/browser/webid/fedcm_accounts_fetcher.cc b/content/browser/webid/fedcm_accounts_fetcher.cc
index 646e97e..177040d 100644
--- a/content/browser/webid/fedcm_accounts_fetcher.cc
+++ b/content/browser/webid/fedcm_accounts_fetcher.cc
@@ -364,6 +364,8 @@
   }
   RecordReadyToShowAccountsSize(accounts.size());
   ComputeLoginStates(idp_info->provider->config->config_url, accounts);
+  ComputeAccountFields(GetDisclosureFields(idp_info->provider->fields),
+                       accounts);
 
   OnAccountsFetchSucceeded(std::move(idp_info), status, std::move(accounts));
 }
@@ -597,6 +599,20 @@
   }
 }
 
+void FedCmAccountsFetcher::ComputeAccountFields(
+    const std::vector<IdentityRequestDialogDisclosureField>& rp_fields,
+    std::vector<IdentityRequestAccountPtr>& accounts) {
+  for (const auto& account : accounts) {
+    if (account->login_state == LoginState::kSignIn) {
+      // We only show fields for signups.
+      continue;
+    }
+    // TODO(crbug.com/412969669): Don't include fields that the IDP did not
+    // include in the accounts response.
+    account->fields = rp_fields;
+  }
+}
+
 void FedCmAccountsFetcher::HandleAccountsFetchFailure(
     std::unique_ptr<IdentityProviderInfo> idp_info,
     std::optional<bool> old_idp_signin_status,
diff --git a/content/browser/webid/fedcm_accounts_fetcher.h b/content/browser/webid/fedcm_accounts_fetcher.h
index c84fcf7..5e6a496 100644
--- a/content/browser/webid/fedcm_accounts_fetcher.h
+++ b/content/browser/webid/fedcm_accounts_fetcher.h
@@ -128,6 +128,10 @@
   void ComputeLoginStates(const GURL& idp_config_url,
                           std::vector<IdentityRequestAccountPtr>& accounts);
 
+  void ComputeAccountFields(
+      const std::vector<IdentityRequestDialogDisclosureField>& rp_fields,
+      std::vector<IdentityRequestAccountPtr>& accounts);
+
   // Updates the IdpSigninStatus in case of accounts fetch failure and shows a
   // failure UI if applicable.
   void HandleAccountsFetchFailure(
diff --git a/content/browser/webtransport/web_transport_connector_impl.cc b/content/browser/webtransport/web_transport_connector_impl.cc
index 09352cd..26cb674 100644
--- a/content/browser/webtransport/web_transport_connector_impl.cc
+++ b/content/browser/webtransport/web_transport_connector_impl.cc
@@ -74,6 +74,15 @@
   ~InterceptingHandshakeClient() override = default;
 
   // WebTransportHandshakeClient implementation:
+  void OnBeforeConnect(const net::IPEndPoint& server_address) override {
+    if (tracker_) {
+      tracker_->OnBeforeConnect(server_address);
+    }
+
+    // Here we pass an invalid IPEndPoint instance because it is dangerous to
+    // pass the error details to the initiator renderer.
+    remote_->OnBeforeConnect(net::IPEndPoint());
+  }
   void OnConnectionEstablished(
       mojo::PendingRemote<network::mojom::WebTransport> transport,
       mojo::PendingReceiver<network::mojom::WebTransportClient> client,
diff --git a/content/browser/webtransport/web_transport_throttle_context.cc b/content/browser/webtransport/web_transport_throttle_context.cc
index 75c9607a..4ebe86fd 100644
--- a/content/browser/webtransport/web_transport_throttle_context.cc
+++ b/content/browser/webtransport/web_transport_throttle_context.cc
@@ -7,29 +7,138 @@
 #include "base/check.h"
 #include "base/check_op.h"
 #include "base/command_line.h"
+#include "base/feature_list.h"
 #include "base/functional/callback.h"
 #include "base/logging.h"
 #include "base/rand_util.h"
 #include "components/network_session_configurator/common/network_switches.h"
+#include "net/base/features.h"
 
 namespace content {
 
 namespace {
 
+bool IsFineGrainedThrottlingEnabled() {
+  return base::FeatureList::IsEnabled(
+      net::features::kWebTransportFineGrainedThrottling);
+}
+
 bool ShouldQueueHandshakeFailurePenalty() {
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   return !command_line ||
          !command_line->HasSwitch(switches::kWebTransportDeveloperMode);
 }
 
+std::optional<net::IPAddress> GetSubnetAddress(
+    const net::IPEndPoint& endpoint) {
+  // We don't have a way to get the actual subnet mask, so assuming /24 and /64
+  // for IPv4 and IPv6 respectively.
+  const auto& address = endpoint.address();
+  if (!address.IsValid()) {
+    return std::nullopt;
+  }
+  size_t size = address.IsIPv4() ? 4 : 16;
+  size_t prefix_bytes = address.IsIPv4() ? 3 : 8;
+  base::span<const uint8_t> raw_bytes = address.bytes();
+  std::array<uint8_t, 16> subnet_bytes = {};
+  DCHECK_GE(raw_bytes.size(), prefix_bytes);
+  base::span(subnet_bytes).copy_prefix_from(raw_bytes.first(prefix_bytes));
+
+  return net::IPAddress(base::span<uint8_t>(subnet_bytes).first(size));
+}
+
 }  // namespace
 
+static constexpr base::TimeDelta kFailureForgivenessDuration =
+    base::Minutes(15);
+
 WebTransportThrottleContext::PenaltyManager::PenaltyManager(
     WebTransportThrottleContext* throttle_context)
     : throttle_context_(throttle_context) {}
 
 WebTransportThrottleContext::PenaltyManager::~PenaltyManager() = default;
 
+void WebTransportThrottleContext::PenaltyManager::CleanupFailedHandshakes() {
+  auto threshold = base::TimeTicks::Now() - kFailureForgivenessDuration;
+  std::erase_if(failed_handshakes_, [threshold](const auto& item) {
+    const auto& [_, last_failure_time] = item;
+    return last_failure_time <= threshold;
+  });
+
+  if (failed_handshakes_.empty()) {
+    failed_handshakes_timer_.Stop();
+  }
+}
+
+bool WebTransportThrottleContext::PenaltyManager::FailedHandshakeNeedsPenalty(
+    const net::IPAddress ip_address) {
+  auto now = base::TimeTicks::Now();
+  auto insert_result = failed_handshakes_.try_emplace(ip_address, now);
+  // The first failure doesn't cause penalty.
+  if (insert_result.second) {
+    return false;
+  }
+  auto it = insert_result.first;
+  auto threshold = now - kFailureForgivenessDuration;
+  // An obsolete failure doesn't cause penalty
+  bool needs_penalty = it->second > threshold;
+  failed_handshakes_[ip_address] = now;
+  return needs_penalty;
+}
+
+base::TimeDelta
+WebTransportThrottleContext::PenaltyManager::ComputeHandshakePenalty(
+    const std::optional<net::IPEndPoint>& server_address) {
+  DVLOG(1) << "WebTransportThrottleContext::ComputeHandshakePenalty() this="
+           << this;
+
+  if (!failed_handshakes_timer_.IsRunning()) {
+    failed_handshakes_timer_.Start(
+        FROM_HERE, base::Minutes(5),
+        base::BindRepeating(&PenaltyManager::CleanupFailedHandshakes,
+                            base::Unretained(this)));
+  }
+
+  if (!server_address) {
+    // TODO(https://crbug.com/40069954): Some decentralized apps may need to
+    // cancel requests to unresponsive hosts, so this penalty could cause too
+    // much impact on those use cases. Usually well-behaving apps might refer to
+    // hosts by plain IPs thather than DNS names, hence we can reduce the impact
+    // by checking GURL::HostIsIPAddress().
+    if (FailedHandshakeNeedsPenalty(net::IPAddress())) {
+      DVLOG(1)
+          << "Return max penalty when several requests are cancelled abruptly.";
+      return base::Minutes(5);
+    }
+    DVLOG(1) << "Return min penalty for a requested cancelled before the "
+                "handshake was completed.";
+    return base::Milliseconds(50);
+  }
+
+  DVLOG(1) << " server_address=" << server_address->address().ToString();
+
+  if (FailedHandshakeNeedsPenalty(server_address->address())) {
+    DVLOG(1) << "Return max penalty for a request targetting the same address "
+                "and failed several times.";
+    return base::Minutes(5);
+  }
+
+  auto net_address = GetSubnetAddress(*server_address);
+  if (net_address) {
+    DVLOG(1) << " subnet_address=" << net_address->ToString();
+
+    if (FailedHandshakeNeedsPenalty(*net_address)) {
+      DVLOG(1) << "Return mid penalty for a request targetting the same subnet "
+                  "and failed several times.";
+      return base::Minutes(2);
+    }
+  }
+
+  DVLOG(1)
+      << "Return default penalty for a request that failed for the first time.";
+  return base::Milliseconds(100);
+}
+
 void WebTransportThrottleContext::PenaltyManager::QueuePending(
     base::TimeDelta after) {
   DVLOG(1) << "WebTransportThrottleContext::QueuePending() this=" << this
@@ -99,7 +208,17 @@
 
 WebTransportThrottleContext::Tracker::~Tracker() {
   if (throttle_context_) {
-    throttle_context_->MaybeQueueHandshakeFailurePenalty();
+    throttle_context_->MaybeQueueHandshakeFailurePenalty(std::nullopt);
+  }
+}
+
+void WebTransportThrottleContext::Tracker::OnBeforeConnect(
+    const net::IPEndPoint& server_address) {
+  DVLOG(1) << "WebTransportThrottleContext::Tracker::OnBeforeConnect()"
+           << " this=" << this;
+
+  if (server_address.address().IsValid()) {
+    server_address_ = server_address;
   }
 }
 
@@ -126,7 +245,7 @@
 
   DVLOG(1) << "    pending_handshakes_= "
            << throttle_context_->penalty_mgr_.PendingHandshakes();
-  throttle_context_->MaybeQueueHandshakeFailurePenalty();
+  throttle_context_->MaybeQueueHandshakeFailurePenalty(server_address_);
   throttle_context_ = nullptr;
 }
 
@@ -169,9 +288,14 @@
   return ThrottleResult::kOk;
 }
 
-void WebTransportThrottleContext::MaybeQueueHandshakeFailurePenalty() {
+void WebTransportThrottleContext::MaybeQueueHandshakeFailurePenalty(
+    const std::optional<net::IPEndPoint>& server_address) {
   if (should_queue_handshake_failure_penalty_) {
-    penalty_mgr_.QueuePending(base::Minutes(5));
+    auto penalty = base::Minutes(5);
+    if (IsFineGrainedThrottlingEnabled()) {
+      penalty = penalty_mgr_.ComputeHandshakePenalty(server_address);
+    }
+    penalty_mgr_.QueuePending(penalty);
     return;
   }
   CHECK_GE(penalty_mgr_.PendingHandshakes(), 0);
diff --git a/content/browser/webtransport/web_transport_throttle_context.h b/content/browser/webtransport/web_transport_throttle_context.h
index 65192a8d..117bbcece 100644
--- a/content/browser/webtransport/web_transport_throttle_context.h
+++ b/content/browser/webtransport/web_transport_throttle_context.h
@@ -19,6 +19,7 @@
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "content/common/content_export.h"
+#include "net/base/ip_endpoint.h"
 
 namespace content {
 
@@ -43,6 +44,10 @@
     // like handshake failure.
     ~Tracker();
 
+    // Collects information about a WebTransport handshake that is about to
+    // start.
+    void OnBeforeConnect(const net::IPEndPoint& server_address);
+
     // Records the successful end of a WebTransport handshake.
     void OnHandshakeEstablished();
 
@@ -51,6 +56,7 @@
 
    private:
     base::WeakPtr<WebTransportThrottleContext> throttle_context_;
+    net::IPEndPoint server_address_;
   };
 
   using ThrottleDoneCallback =
@@ -78,7 +84,8 @@
 
   // Called when a handshake fails. Adds handshake delays unless it is
   // explicitly suppressed.
-  void MaybeQueueHandshakeFailurePenalty();
+  void MaybeQueueHandshakeFailurePenalty(
+      const std::optional<net::IPEndPoint>& server_address);
 
   void OnPendingQueueReady();
 
@@ -87,11 +94,16 @@
  private:
   class PenaltyManager final {
    public:
+    using FailedHandshakesMap = std::map<net::IPAddress, base::TimeTicks>;
+
     explicit PenaltyManager(WebTransportThrottleContext*);
     PenaltyManager(const PenaltyManager&) = delete;
     PenaltyManager& operator=(const PenaltyManager&) = delete;
     ~PenaltyManager();
 
+    base::TimeDelta ComputeHandshakePenalty(
+        const std::optional<net::IPEndPoint>& server_address);
+
     // Queues a pending handshake to be considered complete after `after`.
     void QueuePending(base::TimeDelta after);
 
@@ -119,6 +131,14 @@
     // after `after` has passed.
     void StartPendingQueueTimer(base::TimeDelta after);
 
+    // Removes any obsolete item in the failed_handshakes_ map.
+    void CleanupFailedHandshakes();
+
+    // Checks if there is a previous, non-obsolete, item in the
+    // failed_handshakes_ map for the given ip address and updates
+    // the map with the current time.
+    bool FailedHandshakeNeedsPenalty(const net::IPAddress ip_address);
+
     const raw_ptr<WebTransportThrottleContext> throttle_context_;
 
     int pending_handshakes_ = 0;
@@ -136,6 +156,11 @@
     // `pending_queue_`. The timer doesn't run when `throttled_connections_` is
     // empty.
     base::OneShotTimer pending_queue_timer_;
+
+    FailedHandshakesMap failed_handshakes_;
+
+    // A timer to cleanup the obsolete failed_handshakes.
+    base::RepeatingTimer failed_handshakes_timer_;
   };
 
   // Starts a connection immediately if there are none pending, or sets a timer
diff --git a/content/browser/webtransport/web_transport_throttle_context_unittest.cc b/content/browser/webtransport/web_transport_throttle_context_unittest.cc
index c83cbd68..6c1adae0 100644
--- a/content/browser/webtransport/web_transport_throttle_context_unittest.cc
+++ b/content/browser/webtransport/web_transport_throttle_context_unittest.cc
@@ -7,7 +7,9 @@
 #include "base/check_op.h"
 #include "base/run_loop.h"
 #include "base/test/bind.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
+#include "net/base/features.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace content {
@@ -19,6 +21,13 @@
 
 class WebTransportThrottleContextTest : public testing::Test {
  public:
+  WebTransportThrottleContextTest() {
+    feature_list_.InitWithFeatures(
+        /*enabled_features=*/{net::features::
+                                  kWebTransportFineGrainedThrottling},
+        /*disabled_features=*/{});
+  }
+
   WebTransportThrottleContext& context() { return context_; }
 
   void FastForwardBy(base::TimeDelta delta) {
@@ -30,6 +39,56 @@
       base::RunLoop run_loop;
       auto result = context().PerformThrottle(base::BindLambdaForTesting(
           [&run_loop, this](std::unique_ptr<Tracker> tracker) {
+            std::optional<net::IPAddress> address =
+                net::IPAddress::FromIPLiteral("192.168.1.18");
+            net::IPEndPoint end_point(*address, 80);
+            tracker->OnBeforeConnect(end_point);
+            trackers_.push(std::move(tracker));
+            run_loop.Quit();
+          }));
+      EXPECT_EQ(ThrottleResult::kOk, result);
+      run_loop.Run();
+    }
+  }
+
+  void CreatePendingWithoutConnect(int count) {
+    for (int i = 0; i < count; ++i) {
+      base::RunLoop run_loop;
+      auto result = context().PerformThrottle(base::BindLambdaForTesting(
+          [&run_loop, this](std::unique_ptr<Tracker> tracker) {
+            trackers_.push(std::move(tracker));
+            run_loop.Quit();
+          }));
+      EXPECT_EQ(ThrottleResult::kOk, result);
+      run_loop.Run();
+    }
+  }
+
+  void CreatePendingSameSubnet(int count) {
+    for (int i = 0; i < count; ++i) {
+      base::RunLoop run_loop;
+      auto result = context().PerformThrottle(base::BindLambdaForTesting(
+          [&run_loop, &i, this](std::unique_ptr<Tracker> tracker) {
+            std::optional<net::IPAddress> address =
+                net::IPAddress::FromIPLiteral("192.168.1." +
+                                              base::NumberToString(i + 1));
+            net::IPEndPoint end_point(*address, 80);
+            tracker->OnBeforeConnect(end_point);
+            trackers_.push(std::move(tracker));
+            run_loop.Quit();
+          }));
+      EXPECT_EQ(ThrottleResult::kOk, result);
+      run_loop.Run();
+    }
+  }
+
+  void CreatePendingInvalidEndPoint(int count) {
+    for (int i = 0; i < count; ++i) {
+      base::RunLoop run_loop;
+      auto result = context().PerformThrottle(base::BindLambdaForTesting(
+          [&run_loop, this](std::unique_ptr<Tracker> tracker) {
+            net::IPEndPoint end_point;
+            tracker->OnBeforeConnect(end_point);
             trackers_.push(std::move(tracker));
             run_loop.Quit();
           }));
@@ -56,7 +115,15 @@
     }
   }
 
+  void CloseAbruptly(int count) {
+    DCHECK_LE(count, static_cast<int>(trackers_.size()));
+    for (int i = 0; i < count; ++i) {
+      trackers_.pop();
+    }
+  }
+
  protected:
+  base::test::ScopedFeatureList feature_list_;
   base::test::TaskEnvironment task_environment_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
 
@@ -178,10 +245,27 @@
   EXPECT_TRUE(callback.called());
 }
 
-TEST_F(WebTransportThrottleContextTest, FailedRemainsPendingFor3m) {
-  CreatePending(1);
+TEST_F(WebTransportThrottleContextTest, CancelledOnceRemainsPendingFor50ms) {
+  CreatePendingWithoutConnect(1);
 
-  FailPending(1);
+  CloseAbruptly(1);
+
+  // The delay should be more than 99ms.
+  FastForwardBy(base::Milliseconds(49));
+  CallTrackingCallback callback;
+  const auto result = context().PerformThrottle(callback.Callback());
+  EXPECT_EQ(result, ThrottleResult::kOk);
+  EXPECT_FALSE(callback.called());
+
+  // The delay should be less than 51 milliseconds.
+  FastForwardBy(base::Milliseconds(2));
+  EXPECT_TRUE(callback.called());
+}
+
+TEST_F(WebTransportThrottleContextTest, CancelledRemainsPendingFor5m) {
+  CreatePendingWithoutConnect(2);
+
+  CloseAbruptly(2);
 
   // The delay should be more than 299 seconds.
   FastForwardBy(base::Seconds(299));
@@ -191,7 +275,114 @@
   EXPECT_FALSE(callback.called());
 
   // The delay should be less than 301 seconds.
+  FastForwardBy(base::Seconds(2));
+  EXPECT_TRUE(callback.called());
+}
+
+TEST_F(WebTransportThrottleContextTest, FailedRemainsPendingFor100ms) {
+  CreatePending(1);
+
+  FailPending(1);
+
+  // The delay should be more than 99ms.
+  FastForwardBy(base::Milliseconds(99));
+  CallTrackingCallback callback;
+  const auto result = context().PerformThrottle(callback.Callback());
+  EXPECT_EQ(result, ThrottleResult::kOk);
+  EXPECT_FALSE(callback.called());
+
+  // The delay should be less than 101 milliseconds.
+  FastForwardBy(base::Milliseconds(2));
+  EXPECT_TRUE(callback.called());
+}
+
+TEST_F(WebTransportThrottleContextTest, FailedSameHostRemainsPendingFor5m) {
+  CreatePending(2);
+
+  FailPending(2);
+
+  // The delay should be more than 299 seconds.
+  FastForwardBy(base::Seconds(299));
+  CallTrackingCallback callback;
+  const auto result = context().PerformThrottle(callback.Callback());
+  EXPECT_EQ(result, ThrottleResult::kOk);
+  EXPECT_FALSE(callback.called());
+
+  // The delay should be less than 301 seconds.
+  FastForwardBy(base::Seconds(2));
+  EXPECT_TRUE(callback.called());
+}
+
+TEST_F(WebTransportThrottleContextTest, RemovedObsoleteAfter15m) {
+  CreatePending(2);
+
+  FailPending(2);
+
+  // Ensure the throttling is done after 300 seconds.
+  CallTrackingCallback callback1;
+  const auto result1 = context().PerformThrottle(callback1.Callback());
   FastForwardBy(base::Seconds(301));
+  EXPECT_EQ(result1, ThrottleResult::kOk);
+  EXPECT_TRUE(callback1.called());
+
+  // One new failure before the previous ones become obsolete.
+  FastForwardBy(base::Seconds(598));
+  CreatePending(1);
+  FailPending(1);
+
+  // Previous failures still hold, hence a single new failure requires 300
+  // seconds.
+  FastForwardBy(base::Seconds(299));
+  CallTrackingCallback callback2;
+  const auto result2 = context().PerformThrottle(callback2.Callback());
+  EXPECT_EQ(result2, ThrottleResult::kOk);
+  EXPECT_FALSE(callback2.called());
+
+  // One New failure after the previous ones become obsolete
+  FastForwardBy(base::Seconds(601));
+  CreatePending(1);
+  FailPending(1);
+
+  // The delay should be less than 100ms.
+  FastForwardBy(base::Milliseconds(101));
+  CallTrackingCallback callback3;
+  const auto result3 = context().PerformThrottle(callback3.Callback());
+  EXPECT_EQ(result3, ThrottleResult::kOk);
+  EXPECT_TRUE(callback3.called());
+}
+
+TEST_F(WebTransportThrottleContextTest,
+       FailedInvalidEndPointRemainsPendingFor5m) {
+  CreatePendingInvalidEndPoint(2);
+
+  FailPending(2);
+
+  // The delay should be more than 299 seconds.
+  FastForwardBy(base::Seconds(299));
+  CallTrackingCallback callback;
+  const auto result = context().PerformThrottle(callback.Callback());
+  EXPECT_EQ(result, ThrottleResult::kOk);
+  EXPECT_FALSE(callback.called());
+
+  // The delay should be less than 301 seconds.
+  FastForwardBy(base::Seconds(2));
+  EXPECT_TRUE(callback.called());
+}
+
+TEST_F(WebTransportThrottleContextTest, FailedSameSubnetRemainsPendingFor2m) {
+  CreatePendingSameSubnet(2);
+
+  FailPending(2);
+
+  // The delay should be more than 119 seconds.
+  FastForwardBy(base::Seconds(119));
+  CallTrackingCallback callback;
+  const auto result = context().PerformThrottle(callback.Callback());
+  EXPECT_EQ(result, ThrottleResult::kOk);
+  EXPECT_FALSE(callback.called());
+
+  // The delay should be less than 121 seconds.
+  FastForwardBy(base::Seconds(2));
   EXPECT_TRUE(callback.called());
 }
 
diff --git a/content/public/browser/identity_request_account.h b/content/public/browser/identity_request_account.h
index c02d46c..4e58619 100644
--- a/content/public/browser/identity_request_account.h
+++ b/content/public/browser/identity_request_account.h
@@ -21,6 +21,17 @@
 
 class IdentityProviderData;
 
+// A Java counterpart will be generated for this enum.
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.content.webid
+// GENERATED_JAVA_CLASS_NAME_OVERRIDE: IdentityRequestDialogDisclosureField
+enum class IdentityRequestDialogDisclosureField : int32_t {
+  kName,
+  kEmail,
+  kPicture,
+  kPhoneNumber,
+  kUsername
+};
+
 // Represents a federated user account which is used when displaying the FedCM
 // account selector.
 class CONTENT_EXPORT IdentityRequestAccount
@@ -90,6 +101,11 @@
   std::vector<std::string> domain_hints;
   std::vector<std::string> labels;
 
+  // The list of fields the UI should prompt the user for. This is based on the
+  // fields that the RP requested and affected by the login state and the
+  // actual available fields in the IDP accounts response.
+  std::vector<IdentityRequestDialogDisclosureField> fields;
+
   // The account login state. Unlike the other fields this one can be populated
   // either by the IDP or by the browser based on its stored permission grants.
   std::optional<LoginState> login_state;
diff --git a/content/public/browser/identity_request_dialog_controller.h b/content/public/browser/identity_request_dialog_controller.h
index 3a360ab6..874aba18 100644
--- a/content/public/browser/identity_request_dialog_controller.h
+++ b/content/public/browser/identity_request_dialog_controller.h
@@ -22,17 +22,6 @@
 namespace content {
 class WebContents;
 
-// A Java counterpart will be generated for this enum.
-// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.content.webid
-// GENERATED_JAVA_CLASS_NAME_OVERRIDE: IdentityRequestDialogDisclosureField
-enum class IdentityRequestDialogDisclosureField {
-  kName,
-  kEmail,
-  kPicture,
-  kPhoneNumber,
-  kUsername
-};
-
 // The client metadata that will be used to display a FedCM dialog. This data is
 // extracted from the client metadata endpoint from the FedCM API, where
 // 'client' is essentially the relying party which invoked the API.
diff --git a/content/public/common/BUILD.gn b/content/public/common/BUILD.gn
index 35fc766..8634008 100644
--- a/content/public/common/BUILD.gn
+++ b/content/public/common/BUILD.gn
@@ -454,7 +454,7 @@
     # External code should depend on ":common_java" instead.
     visibility = [ ":*" ]
     sources = [ "//content/public/common/content_features.cc" ]
-    template = "//content/public/common/android/java_templates/ContentFeatures.java.tmpl"
+    class_name = "org.chromium.content_public.common.ContentFeatures"
   }
 
   android_library("common_java") {
diff --git a/content/public/common/android/java_templates/ContentFeatures.java.tmpl b/content/public/common/android/java_templates/ContentFeatures.java.tmpl
deleted file mode 100644
index 56563b4..0000000
--- a/content/public/common/android/java_templates/ContentFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.content_public.common;
-
-/**
- * Constants for the names of Content Features.
- */
-public final class ContentFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Do not instantiate this class.
-    private ContentFeatures() {{}}
-}}
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index 11746ec..5f1ce47 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -120,6 +120,8 @@
     "renderer_blink_platform_impl.h",
     "renderer_main.cc",
     "renderer_main_platform_delegate.h",
+    "renderer_navigation_metrics_manager.cc",
+    "renderer_navigation_metrics_manager.h",
     "sad_plugin.cc",
     "sad_plugin.h",
     "service_worker/controller_service_worker_connector.cc",
@@ -390,142 +392,6 @@
     }
   }
 
-  if (enable_ppapi) {
-    sources += [
-      "pepper/audio_helper.cc",
-      "pepper/audio_helper.h",
-      "pepper/content_renderer_pepper_host_factory.cc",
-      "pepper/content_renderer_pepper_host_factory.h",
-      "pepper/event_conversion.cc",
-      "pepper/event_conversion.h",
-      "pepper/host_array_buffer_var.cc",
-      "pepper/host_array_buffer_var.h",
-      "pepper/host_dispatcher_wrapper.cc",
-      "pepper/host_dispatcher_wrapper.h",
-      "pepper/host_globals.cc",
-      "pepper/host_globals.h",
-      "pepper/host_resource_var.cc",
-      "pepper/host_resource_var.h",
-      "pepper/host_var_tracker.cc",
-      "pepper/host_var_tracker.h",
-      "pepper/message_channel.cc",
-      "pepper/message_channel.h",
-      "pepper/pepper_audio_controller.cc",
-      "pepper/pepper_audio_controller.h",
-      "pepper/pepper_audio_input_host.cc",
-      "pepper/pepper_audio_input_host.h",
-      "pepper/pepper_audio_output_host.cc",
-      "pepper/pepper_audio_output_host.h",
-      "pepper/pepper_browser_connection.cc",
-      "pepper/pepper_browser_connection.h",
-      "pepper/pepper_camera_device_host.cc",
-      "pepper/pepper_camera_device_host.h",
-      "pepper/pepper_device_enumeration_host_helper.cc",
-      "pepper/pepper_device_enumeration_host_helper.h",
-      "pepper/pepper_file_chooser_host.cc",
-      "pepper/pepper_file_chooser_host.h",
-      "pepper/pepper_file_ref_renderer_host.cc",
-      "pepper/pepper_file_ref_renderer_host.h",
-      "pepper/pepper_file_system_host.cc",
-      "pepper/pepper_file_system_host.h",
-      "pepper/pepper_graphics_2d_host.cc",
-      "pepper/pepper_graphics_2d_host.h",
-      "pepper/pepper_hung_plugin_filter.cc",
-      "pepper/pepper_hung_plugin_filter.h",
-      "pepper/pepper_in_process_resource_creation.cc",
-      "pepper/pepper_in_process_resource_creation.h",
-      "pepper/pepper_in_process_router.cc",
-      "pepper/pepper_in_process_router.h",
-      "pepper/pepper_media_device_manager.cc",
-      "pepper/pepper_media_device_manager.h",
-      "pepper/pepper_media_stream_audio_track_host.cc",
-      "pepper/pepper_media_stream_audio_track_host.h",
-      "pepper/pepper_media_stream_track_host_base.cc",
-      "pepper/pepper_media_stream_track_host_base.h",
-      "pepper/pepper_media_stream_video_track_host.cc",
-      "pepper/pepper_media_stream_video_track_host.h",
-      "pepper/pepper_platform_audio_input.cc",
-      "pepper/pepper_platform_audio_input.h",
-      "pepper/pepper_platform_audio_output.cc",
-      "pepper/pepper_platform_audio_output.h",
-      "pepper/pepper_platform_audio_output_dev.cc",
-      "pepper/pepper_platform_audio_output_dev.h",
-      "pepper/pepper_platform_camera_device.cc",
-      "pepper/pepper_platform_camera_device.h",
-      "pepper/pepper_platform_video_capture.cc",
-      "pepper/pepper_platform_video_capture.h",
-      "pepper/pepper_plugin_instance_impl.cc",
-      "pepper/pepper_plugin_instance_impl.h",
-      "pepper/pepper_plugin_registry.cc",
-      "pepper/pepper_plugin_registry.h",
-      "pepper/pepper_proxy_channel_delegate_impl.cc",
-      "pepper/pepper_proxy_channel_delegate_impl.h",
-      "pepper/pepper_try_catch.cc",
-      "pepper/pepper_try_catch.h",
-      "pepper/pepper_url_loader_host.cc",
-      "pepper/pepper_url_loader_host.h",
-      "pepper/pepper_video_capture_host.cc",
-      "pepper/pepper_video_capture_host.h",
-      "pepper/pepper_video_decoder_host.cc",
-      "pepper/pepper_video_decoder_host.h",
-      "pepper/pepper_video_encoder_host.cc",
-      "pepper/pepper_video_encoder_host.h",
-      "pepper/pepper_webplugin_impl.cc",
-      "pepper/pepper_webplugin_impl.h",
-      "pepper/pepper_websocket_host.cc",
-      "pepper/pepper_websocket_host.h",
-      "pepper/plugin_module.cc",
-      "pepper/plugin_module.h",
-      "pepper/plugin_object.cc",
-      "pepper/plugin_object.h",
-      "pepper/ppapi_preferences_builder.cc",
-      "pepper/ppapi_preferences_builder.h",
-      "pepper/ppb_audio_impl.cc",
-      "pepper/ppb_audio_impl.h",
-      "pepper/ppb_buffer_impl.cc",
-      "pepper/ppb_buffer_impl.h",
-      "pepper/ppb_graphics_3d_impl.cc",
-      "pepper/ppb_graphics_3d_impl.h",
-      "pepper/ppb_image_data_impl.cc",
-      "pepper/ppb_image_data_impl.h",
-      "pepper/ppb_proxy_impl.cc",
-      "pepper/ppb_proxy_impl.h",
-      "pepper/ppb_var_deprecated_impl.cc",
-      "pepper/ppb_var_deprecated_impl.h",
-      "pepper/renderer_ppapi_host_impl.cc",
-      "pepper/renderer_ppapi_host_impl.h",
-      "pepper/renderer_restrict_dispatch_group.h",
-      "pepper/resource_converter.cc",
-      "pepper/resource_converter.h",
-      "pepper/resource_creation_impl.cc",
-      "pepper/resource_creation_impl.h",
-      "pepper/url_request_info_util.cc",
-      "pepper/url_request_info_util.h",
-      "pepper/url_response_info_util.cc",
-      "pepper/url_response_info_util.h",
-      "pepper/v8_var_converter.cc",
-      "pepper/v8_var_converter.h",
-      "pepper/v8object_var.cc",
-      "pepper/v8object_var.h",
-      "pepper/video_decoder_shim.cc",
-      "pepper/video_decoder_shim.h",
-      "pepper/video_encoder_shim.cc",
-      "pepper/video_encoder_shim.h",
-    ]
-
-    deps += [
-      "//components/nacl/common:buildflags",
-      "//ppapi/host",
-      "//ppapi/proxy",
-      "//ppapi/shared_impl",
-      "//printing/mojom",
-      "//third_party/libvpx",
-      "//third_party/opus",
-      "//ui/base/cursor",
-      "//ui/base/cursor/mojom:cursor_type",
-    ]
-  }
-
   if (is_win) {
     sources += [
       "media/win/dcomp_texture_factory.cc",
diff --git a/content/renderer/agent_scheduling_group.cc b/content/renderer/agent_scheduling_group.cc
index 4544a43..129dfc3a 100644
--- a/content/renderer/agent_scheduling_group.cc
+++ b/content/renderer/agent_scheduling_group.cc
@@ -13,6 +13,7 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/task/thread_pool.h"
 #include "base/threading/sequence_bound.h"
+#include "base/timer/elapsed_timer.h"
 #include "base/types/pass_key.h"
 #include "content/common/agent_scheduling_group.mojom.h"
 #include "content/public/common/content_client.h"
@@ -20,6 +21,7 @@
 #include "content/public/renderer/content_renderer_client.h"
 #include "content/renderer/render_frame_impl.h"
 #include "content/renderer/render_thread_impl.h"
+#include "content/renderer/renderer_navigation_metrics_manager.h"
 #include "ipc/ipc_channel_mojo.h"
 #include "ipc/ipc_listener.h"
 #include "ipc/ipc_sync_channel.h"
@@ -264,13 +266,19 @@
 }
 
 void AgentSchedulingGroup::CreateView(mojom::CreateViewParamsPtr params) {
+  base::ElapsedTimer timer;
   RenderThreadImpl& renderer = ToImpl(*render_thread_);
   renderer.SetScrollAnimatorEnabled(
       params->web_preferences.enable_scroll_animator, PassKey());
 
+  const auto navigation_metrics_token = params->navigation_metrics_token;
   CreateWebView(std::move(params),
                 /*was_created_by_renderer=*/false,
                 /*base_url=*/blink::WebURL());
+
+  RendererNavigationMetricsManager::Instance().AddCreateViewEvent(
+      navigation_metrics_token, timer.start_time(), timer.Elapsed());
+  // Add any new code above the AddCreateViewEvent call.
 }
 
 blink::WebView* AgentSchedulingGroup::CreateWebView(
diff --git a/content/renderer/pepper/DEPS b/content/renderer/pepper/DEPS
deleted file mode 100644
index 00b7992..0000000
--- a/content/renderer/pepper/DEPS
+++ /dev/null
@@ -1,14 +0,0 @@
-include_rules = [
-  "+components/nacl/common/buildflags.h",
-  "+ppapi/c",
-  "+ppapi/shared_impl",
-  "+ppapi/thunk",
-  "+printing",
-  "+third_party/blink/public/common",
-  "+third_party/libvpx",
-  "+third_party/libyuv",
-  "+third_party/opus",
-  "+ui/base/ime",
-  "+ui/base/range",
-  "+ui/events/keycodes/keyboard_codes.h",
-]
diff --git a/content/renderer/pepper/DIR_METADATA b/content/renderer/pepper/DIR_METADATA
deleted file mode 100644
index c8a2012..0000000
--- a/content/renderer/pepper/DIR_METADATA
+++ /dev/null
@@ -1,7 +0,0 @@
-monorail: {
-  component: "Internals>Plugins>Pepper"
-}
-team_email: "pepper-dev@chromium.org"
-buganizer_public: {
-  component_id: 1456989
-}
diff --git a/content/renderer/pepper/OWNERS b/content/renderer/pepper/OWNERS
deleted file mode 100644
index 73093be..0000000
--- a/content/renderer/pepper/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-file://ppapi/OWNERS
-
diff --git a/content/renderer/pepper/audio_helper.cc b/content/renderer/pepper/audio_helper.cc
deleted file mode 100644
index 6a1dd8e..0000000
--- a/content/renderer/pepper/audio_helper.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/audio_helper.h"
-
-#include <memory>
-
-#include "base/check.h"
-#include "content/common/pepper_file_util.h"
-#include "ppapi/c/pp_completion_callback.h"
-#include "ppapi/c/pp_errors.h"
-
-using ppapi::TrackedCallback;
-
-namespace content {
-
-// AudioHelper -----------------------------------------------------------------
-
-AudioHelper::AudioHelper() {}
-
-AudioHelper::~AudioHelper() {}
-
-int32_t AudioHelper::GetSyncSocketImpl(int* sync_socket) {
-  if (socket_for_create_callback_) {
-    *sync_socket = IntegerFromSyncSocketHandle(
-        socket_for_create_callback_->handle());
-    return PP_OK;
-  }
-  return PP_ERROR_FAILED;
-}
-
-int32_t AudioHelper::GetSharedMemoryImpl(base::UnsafeSharedMemoryRegion** shm) {
-  if (shared_memory_for_create_callback_.IsValid()) {
-    *shm = &shared_memory_for_create_callback_;
-    return PP_OK;
-  }
-  return PP_ERROR_FAILED;
-}
-
-void AudioHelper::StreamCreated(
-    base::UnsafeSharedMemoryRegion shared_memory_region,
-    base::SyncSocket::ScopedHandle socket_handle) {
-  if (TrackedCallback::IsPending(create_callback_)) {
-    // Trusted side of proxy can specify a callback to receive handles. In
-    // this case we don't need to map any data or start the thread since it
-    // will be handled by the proxy.
-    shared_memory_for_create_callback_ = std::move(shared_memory_region);
-    socket_for_create_callback_ =
-        std::make_unique<base::SyncSocket>(std::move(socket_handle));
-
-    create_callback_->Run(PP_OK);
-
-    // It might be nice to close the handles here to free up some system
-    // resources, but we can't since there's a race condition. The handles must
-    // be valid until they're sent over IPC, which is done from the I/O thread
-    // which will often get done after this code executes. We could do
-    // something more elaborate like an ACK from the plugin or post a task to
-    // the I/O thread and back, but this extra complexity doesn't seem worth it
-    // just to clean up these handles faster.
-  } else {
-    OnSetStreamInfo(std::move(shared_memory_region), std::move(socket_handle));
-  }
-}
-
-void AudioHelper::SetCreateCallback(
-    scoped_refptr<ppapi::TrackedCallback> create_callback) {
-  DCHECK(!TrackedCallback::IsPending(create_callback_));
-  create_callback_ = create_callback;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/audio_helper.h b/content/renderer/pepper/audio_helper.h
deleted file mode 100644
index 30b9785..0000000
--- a/content/renderer/pepper/audio_helper.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_AUDIO_HELPER_H_
-#define CONTENT_RENDERER_PEPPER_AUDIO_HELPER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "base/sync_socket.h"
-#include "ppapi/c/pp_completion_callback.h"
-#include "ppapi/shared_impl/resource.h"
-#include "ppapi/shared_impl/scoped_pp_resource.h"
-#include "ppapi/shared_impl/tracked_callback.h"
-
-namespace content {
-
-class AudioHelper {
- public:
-  AudioHelper();
-
-  AudioHelper(const AudioHelper&) = delete;
-  AudioHelper& operator=(const AudioHelper&) = delete;
-
-  virtual ~AudioHelper();
-
-  // Called when the stream is created.
-  void StreamCreated(base::UnsafeSharedMemoryRegion shared_memory_region,
-                     base::SyncSocket::ScopedHandle socket);
-
-  void SetCreateCallback(scoped_refptr<ppapi::TrackedCallback> create_callback);
-
- protected:
-  // TODO(viettrungluu): This is all very poorly thought out. Refactor.
-
-  // To be called by implementations of |PPB_Audio_API|/|PPB_AudioInput_API|.
-  int32_t GetSyncSocketImpl(int* sync_socket);
-  int32_t GetSharedMemoryImpl(base::UnsafeSharedMemoryRegion** shm);
-
-  // To be implemented by subclasses to call their |SetStreamInfo()|.
-  virtual void OnSetStreamInfo(
-      base::UnsafeSharedMemoryRegion shared_memory_region,
-      base::SyncSocket::ScopedHandle socket_handle) = 0;
-
- private:
-  scoped_refptr<ppapi::TrackedCallback> create_callback_;
-
-  // When a create callback is being issued, these will save the info for
-  // querying from the callback. The proxy uses this to get the handles to the
-  // other process instead of mapping them in the renderer. These will be
-  // invalid all other times.
-  base::UnsafeSharedMemoryRegion shared_memory_for_create_callback_;
-  std::unique_ptr<base::SyncSocket> socket_for_create_callback_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_AUDIO_HELPER_H_
diff --git a/content/renderer/pepper/content_renderer_pepper_host_factory.cc b/content/renderer/pepper/content_renderer_pepper_host_factory.cc
deleted file mode 100644
index 670a243..0000000
--- a/content/renderer/pepper/content_renderer_pepper_host_factory.cc
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/content_renderer_pepper_host_factory.h"
-
-#include <utility>
-
-#include "base/check.h"
-#include "base/memory/ptr_util.h"
-#include "base/notreached.h"
-#include "base/strings/string_util.h"
-#include "build/build_config.h"
-#include "content/common/content_switches_internal.h"
-#include "content/public/common/content_client.h"
-#include "content/public/renderer/content_renderer_client.h"
-#include "content/renderer/pepper/pepper_audio_input_host.h"
-#include "content/renderer/pepper/pepper_audio_output_host.h"
-#include "content/renderer/pepper/pepper_camera_device_host.h"
-#include "content/renderer/pepper/pepper_file_chooser_host.h"
-#include "content/renderer/pepper/pepper_file_ref_renderer_host.h"
-#include "content/renderer/pepper/pepper_file_system_host.h"
-#include "content/renderer/pepper/pepper_graphics_2d_host.h"
-#include "content/renderer/pepper/pepper_media_stream_video_track_host.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/pepper_url_loader_host.h"
-#include "content/renderer/pepper/pepper_video_capture_host.h"
-#include "content/renderer/pepper/pepper_video_decoder_host.h"
-#include "content/renderer/pepper/pepper_video_encoder_host.h"
-#include "content/renderer/pepper/pepper_websocket_host.h"
-#include "content/renderer/pepper/ppb_image_data_impl.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "media/media_buildflags.h"
-#include "ppapi/host/resource_host.h"
-#include "ppapi/proxy/ppapi_message_utils.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/proxy/serialized_structs.h"
-#include "ppapi/shared_impl/ppb_image_data_shared.h"
-#include "third_party/blink/public/platform/web_url.h"
-#include "third_party/blink/public/web/web_document.h"
-#include "third_party/blink/public/web/web_plugin_container.h"
-
-using ppapi::host::ResourceHost;
-using ppapi::UnpackMessage;
-
-namespace content {
-
-namespace {
-
-static bool CanUseCameraDeviceAPI(RendererPpapiHost* host,
-                                  PP_Instance instance) {
-  blink::WebPluginContainer* container =
-      host->GetContainerForInstance(instance);
-  if (!container)
-    return false;
-
-  GURL document_url = container->GetDocument().Url();
-  ContentRendererClient* content_renderer_client =
-      GetContentClient()->renderer();
-  return content_renderer_client->IsPluginAllowedToUseCameraDeviceAPI(
-      document_url);
-}
-
-}  // namespace
-
-ContentRendererPepperHostFactory::ContentRendererPepperHostFactory(
-    RendererPpapiHostImpl* host)
-    : host_(host) {}
-
-ContentRendererPepperHostFactory::~ContentRendererPepperHostFactory() {}
-
-std::unique_ptr<ResourceHost>
-ContentRendererPepperHostFactory::CreateResourceHost(
-    ppapi::host::PpapiHost* host,
-    PP_Resource resource,
-    PP_Instance instance,
-    const IPC::Message& message) {
-  DCHECK(host == host_->GetPpapiHost());
-
-  // Make sure the plugin is giving us a valid instance for this resource.
-  if (!host_->IsValidInstance(instance))
-    return nullptr;
-
-  PepperPluginInstanceImpl* instance_impl =
-      host_->GetPluginInstanceImpl(instance);
-  if (!instance_impl->render_frame())
-    return nullptr;
-
-  // Public interfaces.
-  switch (message.type()) {
-    case PpapiHostMsg_FileRef_CreateForFileAPI::ID: {
-      PP_Resource file_system;
-      std::string internal_path;
-      if (!UnpackMessage<PpapiHostMsg_FileRef_CreateForFileAPI>(
-              message, &file_system, &internal_path)) {
-        NOTREACHED();
-      }
-      return std::make_unique<PepperFileRefRendererHost>(
-          host_, instance, resource, file_system, internal_path);
-    }
-    case PpapiHostMsg_FileSystem_Create::ID: {
-      PP_FileSystemType file_system_type;
-      if (!UnpackMessage<PpapiHostMsg_FileSystem_Create>(message,
-                                                         &file_system_type)) {
-        NOTREACHED();
-      }
-      return std::make_unique<PepperFileSystemHost>(host_, instance, resource,
-                                                    file_system_type);
-    }
-    case PpapiHostMsg_Graphics2D_Create::ID: {
-      PP_Size size;
-      PP_Bool is_always_opaque;
-      if (!UnpackMessage<PpapiHostMsg_Graphics2D_Create>(
-              message, &size, &is_always_opaque)) {
-        NOTREACHED();
-      }
-      ppapi::PPB_ImageData_Shared::ImageDataType image_type =
-          ppapi::PPB_ImageData_Shared::PLATFORM;
-#if BUILDFLAG(IS_WIN)
-      // We use the SIMPLE image data type as the PLATFORM image data type
-      // calls GDI functions to create DIB sections etc which fail in Win32K
-      // lockdown mode.
-      image_type = ppapi::PPB_ImageData_Shared::SIMPLE;
-#endif
-      scoped_refptr<PPB_ImageData_Impl> image_data(new PPB_ImageData_Impl(
-          instance, image_type));
-      return base::WrapUnique(PepperGraphics2DHost::Create(
-          host_, instance, resource, size, is_always_opaque, image_data));
-    }
-    case PpapiHostMsg_URLLoader_Create::ID:
-      return std::make_unique<PepperURLLoaderHost>(host_, false, instance,
-                                                   resource);
-    case PpapiHostMsg_VideoDecoder_Create::ID:
-      return std::make_unique<PepperVideoDecoderHost>(host_, instance,
-                                                      resource);
-    case PpapiHostMsg_VideoEncoder_Create::ID:
-      return std::make_unique<PepperVideoEncoderHost>(host_, instance,
-                                                      resource);
-    case PpapiHostMsg_WebSocket_Create::ID:
-      return std::make_unique<PepperWebSocketHost>(host_, instance, resource);
-    case PpapiHostMsg_MediaStreamVideoTrack_Create::ID:
-      return std::make_unique<PepperMediaStreamVideoTrackHost>(host_, instance,
-                                                               resource);
-  }
-
-  // Dev interfaces.
-  if (GetPermissions().HasPermission(ppapi::PERMISSION_DEV)) {
-    switch (message.type()) {
-      case PpapiHostMsg_AudioInput_Create::ID:
-        return std::make_unique<PepperAudioInputHost>(host_, instance,
-                                                      resource);
-      case PpapiHostMsg_AudioOutput_Create::ID:
-        return std::make_unique<PepperAudioOutputHost>(host_, instance,
-                                                       resource);
-      case PpapiHostMsg_FileChooser_Create::ID:
-        return std::make_unique<PepperFileChooserHost>(host_, instance,
-                                                       resource);
-      case PpapiHostMsg_VideoCapture_Create::ID: {
-        std::unique_ptr<PepperVideoCaptureHost> video_host(
-            new PepperVideoCaptureHost(host_, instance, resource));
-        return video_host->Init() ? std::move(video_host) : nullptr;
-      }
-    }
-  }
-
-  // Permissions of the following interfaces are available for whitelisted apps
-  // which may not have access to the other private interfaces.
-  if (message.type() == PpapiHostMsg_CameraDevice_Create::ID) {
-    if (!GetPermissions().HasPermission(ppapi::PERMISSION_PRIVATE) &&
-        !CanUseCameraDeviceAPI(host_, instance))
-      return nullptr;
-    std::unique_ptr<PepperCameraDeviceHost> camera_host(
-        new PepperCameraDeviceHost(host_, instance, resource));
-    return camera_host->Init() ? std::move(camera_host) : nullptr;
-  }
-
-  return nullptr;
-}
-
-const ppapi::PpapiPermissions&
-ContentRendererPepperHostFactory::GetPermissions() const {
-  return host_->GetPpapiHost()->permissions();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/content_renderer_pepper_host_factory.h b/content/renderer/pepper/content_renderer_pepper_host_factory.h
deleted file mode 100644
index 6441651..0000000
--- a/content/renderer/pepper/content_renderer_pepper_host_factory.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_CONTENT_RENDERER_PEPPER_HOST_FACTORY_H_
-#define CONTENT_RENDERER_PEPPER_CONTENT_RENDERER_PEPPER_HOST_FACTORY_H_
-
-#include "base/memory/raw_ptr.h"
-#include "ppapi/host/host_factory.h"
-#include "ppapi/shared_impl/ppapi_permissions.h"
-
-namespace ppapi {
-class PpapiPermissions;
-}
-
-namespace content {
-class RendererPpapiHostImpl;
-
-class ContentRendererPepperHostFactory : public ppapi::host::HostFactory {
- public:
-  explicit ContentRendererPepperHostFactory(RendererPpapiHostImpl* host);
-
-  ContentRendererPepperHostFactory(const ContentRendererPepperHostFactory&) =
-      delete;
-  ContentRendererPepperHostFactory& operator=(
-      const ContentRendererPepperHostFactory&) = delete;
-
-  ~ContentRendererPepperHostFactory() override;
-
-  std::unique_ptr<ppapi::host::ResourceHost> CreateResourceHost(
-      ppapi::host::PpapiHost* host,
-      PP_Resource resource,
-      PP_Instance instance,
-      const IPC::Message& message) override;
-
- private:
-  const ppapi::PpapiPermissions& GetPermissions() const;
-
-  // Non-owning pointer.
-  raw_ptr<RendererPpapiHostImpl> host_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_CONTENT_RENDERER_PEPPER_HOST_FACTORY_H_
diff --git a/content/renderer/pepper/event_conversion.cc b/content/renderer/pepper/event_conversion.cc
deleted file mode 100644
index 7af3c11..0000000
--- a/content/renderer/pepper/event_conversion.cc
+++ /dev/null
@@ -1,815 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/event_conversion.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <string_view>
-
-#include "base/check_op.h"
-#include "base/feature_list.h"
-#include "base/i18n/char_iterator.h"
-#include "base/notreached.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversion_utils.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build/build_config.h"
-#include "components/input/web_touch_event_traits.h"
-#include "content/public/common/content_features.h"
-#include "device/gamepad/public/cpp/gamepads.h"
-#include "ppapi/c/pp_input_event.h"
-#include "ppapi/shared_impl/ppb_input_event_shared.h"
-#include "third_party/blink/public/common/input/web_input_event.h"
-#include "third_party/blink/public/common/input/web_keyboard_event.h"
-#include "third_party/blink/public/common/input/web_mouse_wheel_event.h"
-#include "third_party/blink/public/common/input/web_pointer_event.h"
-#include "third_party/blink/public/common/input/web_touch_event.h"
-#include "ui/events/keycodes/dom/keycode_converter.h"
-
-#if BUILDFLAG(IS_WIN)
-#include <windows.h>
-#endif
-
-using ppapi::InputEventData;
-using ppapi::TouchPointWithTilt;
-using blink::WebInputEvent;
-using blink::WebKeyboardEvent;
-using blink::WebMouseEvent;
-using blink::WebMouseWheelEvent;
-using blink::WebPointerEvent;
-using blink::WebTouchEvent;
-using blink::WebTouchPoint;
-
-namespace content {
-
-namespace {
-
-// Verify the modifier flags WebKit uses match the Pepper ones. If these start
-// not matching, we'll need to write conversion code to preserve the Pepper
-// values (since plugins will be depending on them).
-static_assert(static_cast<int>(PP_INPUTEVENT_MODIFIER_SHIFTKEY) ==
-                  static_cast<int>(WebInputEvent::kShiftKey),
-              "ShiftKey should match");
-static_assert(static_cast<int>(PP_INPUTEVENT_MODIFIER_CONTROLKEY) ==
-                  static_cast<int>(WebInputEvent::kControlKey),
-              "ControlKey should match");
-static_assert(static_cast<int>(PP_INPUTEVENT_MODIFIER_ALTKEY) ==
-                  static_cast<int>(WebInputEvent::kAltKey),
-              "AltKey should match");
-static_assert(static_cast<int>(PP_INPUTEVENT_MODIFIER_METAKEY) ==
-                  static_cast<int>(WebInputEvent::kMetaKey),
-              "MetaKey should match");
-static_assert(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISKEYPAD) ==
-                  static_cast<int>(WebInputEvent::kIsKeyPad),
-              "KeyPad should match");
-static_assert(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT) ==
-                  static_cast<int>(WebInputEvent::kIsAutoRepeat),
-              "AutoRepeat should match");
-static_assert(static_cast<int>(PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN) ==
-                  static_cast<int>(WebInputEvent::kLeftButtonDown),
-              "LeftButton should match");
-static_assert(static_cast<int>(PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN) ==
-                  static_cast<int>(WebInputEvent::kMiddleButtonDown),
-              "MiddleButton should match");
-static_assert(static_cast<int>(PP_INPUTEVENT_MODIFIER_RIGHTBUTTONDOWN) ==
-                  static_cast<int>(WebInputEvent::kRightButtonDown),
-              "RightButton should match");
-static_assert(static_cast<int>(PP_INPUTEVENT_MODIFIER_CAPSLOCKKEY) ==
-                  static_cast<int>(WebInputEvent::kCapsLockOn),
-              "CapsLock should match");
-static_assert(static_cast<int>(PP_INPUTEVENT_MODIFIER_NUMLOCKKEY) ==
-                  static_cast<int>(WebInputEvent::kNumLockOn),
-              "NumLock should match");
-static_assert(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISLEFT) ==
-                  static_cast<int>(WebInputEvent::kIsLeft),
-              "IsLeft should match");
-static_assert(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISRIGHT) ==
-                  static_cast<int>(WebInputEvent::kIsRight),
-              "IsRight should match");
-
-PP_InputEvent_Type ConvertEventTypes(const WebInputEvent& event) {
-  switch (event.GetType()) {
-    case WebInputEvent::Type::kMouseDown:
-      return PP_INPUTEVENT_TYPE_MOUSEDOWN;
-    case WebInputEvent::Type::kMouseUp:
-      return PP_INPUTEVENT_TYPE_MOUSEUP;
-    case WebInputEvent::Type::kMouseMove:
-      return PP_INPUTEVENT_TYPE_MOUSEMOVE;
-    case WebInputEvent::Type::kMouseEnter:
-      return PP_INPUTEVENT_TYPE_MOUSEENTER;
-    case WebInputEvent::Type::kMouseLeave:
-      return PP_INPUTEVENT_TYPE_MOUSELEAVE;
-    case WebInputEvent::Type::kContextMenu:
-      return PP_INPUTEVENT_TYPE_CONTEXTMENU;
-    case WebInputEvent::Type::kMouseWheel:
-      return PP_INPUTEVENT_TYPE_WHEEL;
-    case WebInputEvent::Type::kRawKeyDown:
-      // In the past blink has always returned kKeyDown passed into plugins
-      // although PPAPI had a RAWKEYDOWN definition. However implementations are
-      // broken now that blink passes kRawKeyDown so convert it to a keydown.
-      return PP_INPUTEVENT_TYPE_KEYDOWN;
-    case WebInputEvent::Type::kKeyDown:
-      return PP_INPUTEVENT_TYPE_KEYDOWN;
-    case WebInputEvent::Type::kKeyUp:
-      return PP_INPUTEVENT_TYPE_KEYUP;
-    case WebInputEvent::Type::kChar:
-      return PP_INPUTEVENT_TYPE_CHAR;
-    case WebInputEvent::Type::kTouchStart:
-      return PP_INPUTEVENT_TYPE_TOUCHSTART;
-    case WebInputEvent::Type::kTouchMove:
-      return PP_INPUTEVENT_TYPE_TOUCHMOVE;
-    case WebInputEvent::Type::kTouchEnd:
-      return PP_INPUTEVENT_TYPE_TOUCHEND;
-    case WebInputEvent::Type::kTouchCancel:
-      return PP_INPUTEVENT_TYPE_TOUCHCANCEL;
-    case WebInputEvent::Type::kUndefined:
-    default:
-      return PP_INPUTEVENT_TYPE_UNDEFINED;
-  }
-}
-
-// Converts WebInputEvent::Modifiers flags to PP_InputEvent_Modifier.
-int ConvertEventModifiers(int modifiers) {
-  return modifiers & (PP_INPUTEVENT_MODIFIER_SHIFTKEY |
-                      PP_INPUTEVENT_MODIFIER_CONTROLKEY |
-                      PP_INPUTEVENT_MODIFIER_ALTKEY |
-                      PP_INPUTEVENT_MODIFIER_METAKEY |
-                      PP_INPUTEVENT_MODIFIER_ISKEYPAD |
-                      PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT |
-                      PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN |
-                      PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN |
-                      PP_INPUTEVENT_MODIFIER_RIGHTBUTTONDOWN |
-                      PP_INPUTEVENT_MODIFIER_CAPSLOCKKEY |
-                      PP_INPUTEVENT_MODIFIER_NUMLOCKKEY |
-                      PP_INPUTEVENT_MODIFIER_ISLEFT |
-                      PP_INPUTEVENT_MODIFIER_ISRIGHT);
-}
-
-// Generates a PP_InputEvent with the fields common to all events, as well as
-// the event type from the given web event. Event-specific fields will be zero
-// initialized.
-InputEventData GetEventWithCommonFieldsAndType(const WebInputEvent& web_event) {
-  InputEventData result;
-  result.event_type = ConvertEventTypes(web_event);
-  result.event_time_stamp = web_event.TimeStamp().since_origin().InSecondsF();
-  return result;
-}
-
-void AppendKeyEvent(const WebInputEvent& event,
-                    std::vector<InputEventData>* result_events) {
-  const WebKeyboardEvent& key_event =
-      static_cast<const WebKeyboardEvent&>(event);
-  InputEventData result = GetEventWithCommonFieldsAndType(event);
-  result.event_modifiers = ConvertEventModifiers(key_event.GetModifiers());
-  result.key_code = key_event.windows_key_code;
-  result.code = ui::KeycodeConverter::DomCodeToCodeString(
-      static_cast<ui::DomCode>(key_event.dom_code));
-  result_events->push_back(result);
-}
-
-void AppendCharEvent(const WebInputEvent& event,
-                     std::vector<InputEventData>* result_events) {
-  const WebKeyboardEvent& key_event =
-      static_cast<const WebKeyboardEvent&>(event);
-
-  // This is a bit complex, the input event will normally just have one 16-bit
-  // character in it, but may be zero or more than one. The text array is
-  // just padded with 0 values for the unused ones, but is not necessarily
-  // null-terminated.
-  const std::u16string_view key_event_text_view(
-      key_event.text.begin(), std::ranges::find(key_event.text, 0));
-
-  // Make a separate InputEventData for each Unicode character in the input.
-  for (base::i18n::UTF16CharIterator iter(key_event_text_view); !iter.end();
-       iter.Advance()) {
-    InputEventData result = GetEventWithCommonFieldsAndType(event);
-    result.event_modifiers = ConvertEventModifiers(key_event.GetModifiers());
-    base::WriteUnicodeCharacter(iter.get(), &result.character_text);
-
-    result_events->push_back(result);
-  }
-}
-
-void AppendMouseEvent(const WebInputEvent& event,
-                      std::vector<InputEventData>* result_events) {
-  static_assert(static_cast<int>(WebMouseEvent::Button::kNoButton) ==
-                    static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_NONE),
-                "MouseNone should match");
-  static_assert(static_cast<int>(WebMouseEvent::Button::kLeft) ==
-                    static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_LEFT),
-                "MouseLeft should match");
-  static_assert(static_cast<int>(WebMouseEvent::Button::kRight) ==
-                    static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_RIGHT),
-                "MouseRight should match");
-  static_assert(static_cast<int>(WebMouseEvent::Button::kMiddle) ==
-                    static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_MIDDLE),
-                "MouseMiddle should match");
-
-  const WebMouseEvent& mouse_event = static_cast<const WebMouseEvent&>(event);
-  InputEventData result = GetEventWithCommonFieldsAndType(event);
-  result.event_modifiers = ConvertEventModifiers(mouse_event.GetModifiers());
-  if (mouse_event.GetType() == WebInputEvent::Type::kMouseDown ||
-      mouse_event.GetType() == WebInputEvent::Type::kMouseMove ||
-      mouse_event.GetType() == WebInputEvent::Type::kMouseUp) {
-    switch (mouse_event.button) {
-      case WebMouseEvent::Button::kNoButton:
-      case WebMouseEvent::Button::kLeft:
-      case WebMouseEvent::Button::kRight:
-      case WebMouseEvent::Button::kMiddle:
-        result.mouse_button =
-            static_cast<PP_InputEvent_MouseButton>(mouse_event.button);
-        break;
-      default:
-        return;
-    }
-  }
-  result.mouse_position.x = mouse_event.PositionInWidget().x();
-  result.mouse_position.y = mouse_event.PositionInWidget().y();
-  result.mouse_click_count = mouse_event.click_count;
-
-  result.mouse_movement.x = mouse_event.movement_x;
-  result.mouse_movement.y = mouse_event.movement_y;
-
-  result_events->push_back(result);
-}
-
-void AppendMouseWheelEvent(const WebInputEvent& event,
-                           std::vector<InputEventData>* result_events) {
-  const WebMouseWheelEvent& mouse_wheel_event =
-      static_cast<const WebMouseWheelEvent&>(event);
-  InputEventData result = GetEventWithCommonFieldsAndType(event);
-  result.event_modifiers =
-      ConvertEventModifiers(mouse_wheel_event.GetModifiers());
-  result.wheel_delta.x = mouse_wheel_event.delta_x;
-  result.wheel_delta.y = mouse_wheel_event.delta_y;
-  result.wheel_ticks.x = mouse_wheel_event.wheel_ticks_x;
-  result.wheel_ticks.y = mouse_wheel_event.wheel_ticks_y;
-  result.wheel_scroll_by_page =
-      (mouse_wheel_event.delta_units == ui::ScrollGranularity::kScrollByPage);
-  result_events->push_back(result);
-}
-
-enum IncludedTouchPointTypes {
-  ALL,     // All pointers targetting the plugin.
-  ACTIVE,  // Only pointers that are currently down.
-  CHANGED  // Only pointers that have changed since the previous event.
-};
-void SetPPTouchPoints(base::span<const WebTouchPoint> touches,
-                      IncludedTouchPointTypes included_types,
-                      std::vector<TouchPointWithTilt>* result) {
-  for (const WebTouchPoint& touch_point : touches) {
-    if (included_types == ACTIVE &&
-        (touch_point.state == WebTouchPoint::State::kStateReleased ||
-         touch_point.state == WebTouchPoint::State::kStateCancelled)) {
-      continue;
-    }
-    if (included_types == CHANGED &&
-        (touch_point.state == WebTouchPoint::State::kStateUndefined ||
-         touch_point.state == WebTouchPoint::State::kStateStationary)) {
-      continue;
-    }
-    PP_TouchPoint pp_pt;
-    pp_pt.id = touch_point.id;
-    pp_pt.position.x = touch_point.PositionInWidget().x();
-    pp_pt.position.y = touch_point.PositionInWidget().y();
-    pp_pt.radius.x = touch_point.radius_x;
-    pp_pt.radius.y = touch_point.radius_y;
-    pp_pt.rotation_angle = touch_point.rotation_angle;
-    pp_pt.pressure = touch_point.force;
-    PP_FloatPoint pp_ft;
-    pp_ft.x = touch_point.tilt_x;
-    pp_ft.y = touch_point.tilt_y;
-    TouchPointWithTilt touch_with_tilt{pp_pt, pp_ft};
-    result->push_back(touch_with_tilt);
-  }
-}
-
-void AppendTouchEvent(const WebInputEvent& event,
-                      std::vector<InputEventData>* result_events) {
-  const WebTouchEvent& touch_event = static_cast<const WebTouchEvent&>(event);
-
-  InputEventData result = GetEventWithCommonFieldsAndType(event);
-
-  if (touch_event.touches_length == 1) {
-    if (touch_event.touches[0].pointer_type ==
-        blink::WebPointerProperties::PointerType::kPen) {
-      result.event_modifiers |= PP_INPUTEVENT_MODIFIER_ISPEN;
-    } else if (touch_event.touches[0].pointer_type ==
-               blink::WebPointerProperties::PointerType::kEraser) {
-      result.event_modifiers |= PP_INPUTEVENT_MODIFIER_ISERASER;
-    }
-  }
-
-  SetPPTouchPoints(
-      base::span(touch_event.touches).first(touch_event.touches_length), ACTIVE,
-      &result.touches);
-  SetPPTouchPoints(
-      base::span(touch_event.touches).first(touch_event.touches_length),
-      CHANGED, &result.changed_touches);
-  SetPPTouchPoints(
-      base::span(touch_event.touches).first(touch_event.touches_length), ALL,
-      &result.target_touches);
-
-  result_events->push_back(result);
-}
-
-WebTouchPoint CreateWebTouchPoint(const PP_TouchPoint& pp_pt,
-                                  WebTouchPoint::State state) {
-  WebTouchPoint pt;
-  pt.pointer_type = blink::WebPointerProperties::PointerType::kTouch;
-  pt.id = pp_pt.id;
-  pt.SetPositionInWidget(pp_pt.position.x, pp_pt.position.y);
-  // TODO(crbug.com/40616919): Add screen coordinate calculation.
-  pt.SetPositionInScreen(0, 0);
-  pt.force = pp_pt.pressure;
-  pt.radius_x = pp_pt.radius.x;
-  pt.radius_y = pp_pt.radius.y;
-  pt.rotation_angle = pp_pt.rotation_angle;
-  pt.state = state;
-  return pt;
-}
-
-bool HasTouchPointWithId(const WebTouchPoint* web_touches,
-                         uint32_t web_touches_length,
-                         uint32_t id) {
-  // Note: A brute force search to find the (potentially) existing touch point
-  // is cheap given the small bound on |WebTouchEvent::kTouchesLengthCap|.
-  for (uint32_t i = 0; i < web_touches_length; ++i) {
-    if (web_touches[i].id == static_cast<int>(id))
-      return true;
-  }
-  return false;
-}
-
-void SetWebTouchPointsIfNotYetSet(
-    const std::vector<TouchPointWithTilt>& pp_touches,
-    WebTouchPoint::State state,
-    WebTouchPoint* web_touches,
-    uint32_t* web_touches_length) {
-  const uint32_t initial_web_touches_length = *web_touches_length;
-  const uint32_t touches_length =
-      std::min(static_cast<uint32_t>(pp_touches.size()),
-               static_cast<uint32_t>(WebTouchEvent::kTouchesLengthCap));
-  for (uint32_t i = 0; i < touches_length; ++i) {
-    const uint32_t touch_index = *web_touches_length;
-    if (touch_index >= static_cast<uint32_t>(WebTouchEvent::kTouchesLengthCap))
-      return;
-
-    const PP_TouchPoint& pp_pt = pp_touches[i].touch;
-    if (HasTouchPointWithId(web_touches, initial_web_touches_length, pp_pt.id))
-      continue;
-
-    web_touches[touch_index] = CreateWebTouchPoint(pp_pt, state);
-    ++(*web_touches_length);
-  }
-}
-
-WebTouchEvent* BuildTouchEvent(const InputEventData& event) {
-  WebTouchEvent* web_event = new WebTouchEvent();
-  WebTouchPoint::State state = WebTouchPoint::State::kStateUndefined;
-  WebInputEvent::Type type = WebInputEvent::Type::kUndefined;
-  switch (event.event_type) {
-    case PP_INPUTEVENT_TYPE_TOUCHSTART:
-      type = WebInputEvent::Type::kTouchStart;
-      state = WebTouchPoint::State::kStatePressed;
-      break;
-    case PP_INPUTEVENT_TYPE_TOUCHMOVE:
-      type = WebInputEvent::Type::kTouchMove;
-      state = WebTouchPoint::State::kStateMoved;
-      break;
-    case PP_INPUTEVENT_TYPE_TOUCHEND:
-      type = WebInputEvent::Type::kTouchEnd;
-      state = WebTouchPoint::State::kStateReleased;
-      break;
-    case PP_INPUTEVENT_TYPE_TOUCHCANCEL:
-      type = WebInputEvent::Type::kTouchCancel;
-      state = WebTouchPoint::State::kStateCancelled;
-      break;
-    default:
-      NOTREACHED();
-  }
-  input::WebTouchEventTraits::ResetType(
-      type, base::TimeTicks() + base::Seconds(event.event_time_stamp),
-      web_event);
-  web_event->touches_length = 0;
-
-  // First add all changed touches, then add only the remaining unset
-  // (stationary) touches.
-  SetWebTouchPointsIfNotYetSet(event.changed_touches, state,
-                               web_event->touches.data(),
-                               &web_event->touches_length);
-  SetWebTouchPointsIfNotYetSet(
-      event.touches, WebTouchPoint::State::kStateStationary,
-      web_event->touches.data(), &web_event->touches_length);
-  return web_event;
-}
-
-WebKeyboardEvent* BuildKeyEvent(const InputEventData& event) {
-  WebInputEvent::Type type = WebInputEvent::Type::kUndefined;
-  switch (event.event_type) {
-    case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
-      type = WebInputEvent::Type::kRawKeyDown;
-      break;
-    case PP_INPUTEVENT_TYPE_KEYDOWN:
-      type = WebInputEvent::Type::kKeyDown;
-      break;
-    case PP_INPUTEVENT_TYPE_KEYUP:
-      type = WebInputEvent::Type::kKeyUp;
-      break;
-    default:
-      NOTREACHED();
-  }
-  WebKeyboardEvent* key_event = new WebKeyboardEvent(
-      type, event.event_modifiers,
-      base::TimeTicks() + base::Seconds(event.event_time_stamp));
-  key_event->windows_key_code = event.key_code;
-  return key_event;
-}
-
-WebKeyboardEvent* BuildCharEvent(const InputEventData& event) {
-  WebKeyboardEvent* key_event = new WebKeyboardEvent(
-      WebInputEvent::Type::kChar, event.event_modifiers,
-      base::TimeTicks() + base::Seconds(event.event_time_stamp));
-
-  // Make sure to not read beyond the buffer in case some bad code doesn't
-  // NULL-terminate it (this is called from plugins).
-  std::u16string text16 = base::UTF8ToUTF16(event.character_text);
-
-  std::ranges::fill(key_event->text, 0);
-  std::ranges::fill(key_event->unmodified_text, 0);
-  for (size_t i = 0; i < std::min(key_event->text.size(), text16.size()); ++i) {
-    key_event->text[i] = text16[i];
-  }
-  return key_event;
-}
-
-WebMouseEvent* BuildMouseEvent(const InputEventData& event) {
-  WebInputEvent::Type type = WebInputEvent::Type::kUndefined;
-  switch (event.event_type) {
-    case PP_INPUTEVENT_TYPE_MOUSEDOWN:
-      type = WebInputEvent::Type::kMouseDown;
-      break;
-    case PP_INPUTEVENT_TYPE_MOUSEUP:
-      type = WebInputEvent::Type::kMouseUp;
-      break;
-    case PP_INPUTEVENT_TYPE_MOUSEMOVE:
-      type = WebInputEvent::Type::kMouseMove;
-      break;
-    case PP_INPUTEVENT_TYPE_MOUSEENTER:
-      type = WebInputEvent::Type::kMouseEnter;
-      break;
-    case PP_INPUTEVENT_TYPE_MOUSELEAVE:
-      type = WebInputEvent::Type::kMouseLeave;
-      break;
-    case PP_INPUTEVENT_TYPE_CONTEXTMENU:
-      type = WebInputEvent::Type::kContextMenu;
-      break;
-    default:
-      NOTREACHED();
-  }
-  WebMouseEvent* mouse_event = new WebMouseEvent(
-      type, event.event_modifiers,
-      base::TimeTicks() + base::Seconds(event.event_time_stamp));
-  mouse_event->pointer_type = blink::WebPointerProperties::PointerType::kMouse;
-  mouse_event->button = static_cast<WebMouseEvent::Button>(event.mouse_button);
-  if (mouse_event->GetType() == WebInputEvent::Type::kMouseMove) {
-    if (mouse_event->GetModifiers() & WebInputEvent::kLeftButtonDown)
-      mouse_event->button = WebMouseEvent::Button::kLeft;
-    else if (mouse_event->GetModifiers() & WebInputEvent::kMiddleButtonDown)
-      mouse_event->button = WebMouseEvent::Button::kMiddle;
-    else if (mouse_event->GetModifiers() & WebInputEvent::kRightButtonDown)
-      mouse_event->button = WebMouseEvent::Button::kRight;
-  }
-  mouse_event->SetPositionInWidget(event.mouse_position.x,
-                                   event.mouse_position.y);
-  mouse_event->click_count = event.mouse_click_count;
-  mouse_event->movement_x = event.mouse_movement.x;
-  mouse_event->movement_y = event.mouse_movement.y;
-  return mouse_event;
-}
-
-WebMouseWheelEvent* BuildMouseWheelEvent(const InputEventData& event) {
-  WebMouseWheelEvent* mouse_wheel_event = new WebMouseWheelEvent(
-      WebInputEvent::Type::kMouseWheel, event.event_modifiers,
-      base::TimeTicks() + base::Seconds(event.event_time_stamp));
-  mouse_wheel_event->delta_x = event.wheel_delta.x;
-  mouse_wheel_event->delta_y = event.wheel_delta.y;
-  mouse_wheel_event->wheel_ticks_x = event.wheel_ticks.x;
-  mouse_wheel_event->wheel_ticks_y = event.wheel_ticks.y;
-  mouse_wheel_event->delta_units = event.wheel_scroll_by_page
-                                       ? ui::ScrollGranularity::kScrollByPage
-                                       : ui::ScrollGranularity::kScrollByPixel;
-  return mouse_wheel_event;
-}
-
-#if !BUILDFLAG(IS_WIN)
-#define VK_RETURN 0x0D
-
-#define VK_PRIOR 0x21
-#define VK_NEXT 0x22
-#define VK_END 0x23
-#define VK_HOME 0x24
-#define VK_LEFT 0x25
-#define VK_UP 0x26
-#define VK_RIGHT 0x27
-#define VK_DOWN 0x28
-#define VK_SNAPSHOT 0x2C
-#define VK_INSERT 0x2D
-#define VK_DELETE 0x2E
-
-#define VK_APPS 0x5D
-
-#define VK_F1 0x70
-#endif
-
-// Convert a character string to a Windows virtual key code. Adapted from
-// src/content/web_test/renderer/event_sender.cc. This
-// is used by CreateSimulatedWebInputEvents to convert keyboard events.
-void GetKeyCode(const std::string& char_text,
-                uint16_t* code,
-                uint16_t* text,
-                bool* needs_shift_modifier,
-                bool* generate_char) {
-  uint16_t vk_code = 0;
-  uint16_t vk_text = 0;
-  *needs_shift_modifier = false;
-  *generate_char = false;
-  if ("\n" == char_text) {
-    vk_text = vk_code = VK_RETURN;
-    *generate_char = true;
-  } else if ("rightArrow" == char_text) {
-    vk_code = VK_RIGHT;
-  } else if ("downArrow" == char_text) {
-    vk_code = VK_DOWN;
-  } else if ("leftArrow" == char_text) {
-    vk_code = VK_LEFT;
-  } else if ("upArrow" == char_text) {
-    vk_code = VK_UP;
-  } else if ("insert" == char_text) {
-    vk_code = VK_INSERT;
-  } else if ("delete" == char_text) {
-    vk_code = VK_DELETE;
-  } else if ("pageUp" == char_text) {
-    vk_code = VK_PRIOR;
-  } else if ("pageDown" == char_text) {
-    vk_code = VK_NEXT;
-  } else if ("home" == char_text) {
-    vk_code = VK_HOME;
-  } else if ("end" == char_text) {
-    vk_code = VK_END;
-  } else if ("printScreen" == char_text) {
-    vk_code = VK_SNAPSHOT;
-  } else if ("menu" == char_text) {
-    vk_code = VK_APPS;
-  } else {
-    // Compare the input string with the function-key names defined by the
-    // DOM spec (i.e. "F1",...,"F24").
-    for (int i = 1; i <= 24; ++i) {
-      std::string functionKeyName = base::StringPrintf("F%d", i);
-      if (functionKeyName == char_text) {
-        vk_code = VK_F1 + (i - 1);
-        break;
-      }
-    }
-    if (!vk_code) {
-      std::u16string char_text16 = base::UTF8ToUTF16(char_text);
-      DCHECK_EQ(char_text16.size(), 1U);
-      vk_text = vk_code = char_text16[0];
-      *needs_shift_modifier = base::IsAsciiUpper(vk_code & 0xFF);
-      if (base::IsAsciiLower(vk_code & 0xFF))
-        vk_code -= 'a' - 'A';
-      *generate_char = true;
-    }
-  }
-
-  *code = vk_code;
-  *text = vk_text;
-}
-
-}  // namespace
-
-void CreateInputEventData(
-    const WebInputEvent& event,
-    std::vector<InputEventData>* result) {
-  result->clear();
-
-  switch (event.GetType()) {
-    case WebInputEvent::Type::kMouseDown:
-    case WebInputEvent::Type::kMouseUp:
-    case WebInputEvent::Type::kMouseMove:
-    case WebInputEvent::Type::kMouseEnter:
-    case WebInputEvent::Type::kMouseLeave:
-    case WebInputEvent::Type::kContextMenu:
-      AppendMouseEvent(event, result);
-      break;
-    case WebInputEvent::Type::kMouseWheel:
-      AppendMouseWheelEvent(event, result);
-      break;
-    case WebInputEvent::Type::kRawKeyDown:
-    case WebInputEvent::Type::kKeyDown:
-    case WebInputEvent::Type::kKeyUp:
-      AppendKeyEvent(event, result);
-      break;
-    case WebInputEvent::Type::kChar:
-      AppendCharEvent(event, result);
-      break;
-    case WebInputEvent::Type::kTouchStart:
-    case WebInputEvent::Type::kTouchMove:
-    case WebInputEvent::Type::kTouchEnd:
-    case WebInputEvent::Type::kTouchCancel:
-      AppendTouchEvent(event, result);
-      break;
-    case WebInputEvent::Type::kUndefined:
-    default:
-      break;
-  }
-}
-
-WebInputEvent* CreateWebInputEvent(const InputEventData& event) {
-  std::unique_ptr<WebInputEvent> web_input_event;
-  switch (event.event_type) {
-    case PP_INPUTEVENT_TYPE_UNDEFINED:
-      return nullptr;
-    case PP_INPUTEVENT_TYPE_MOUSEDOWN:
-    case PP_INPUTEVENT_TYPE_MOUSEUP:
-    case PP_INPUTEVENT_TYPE_MOUSEMOVE:
-    case PP_INPUTEVENT_TYPE_MOUSEENTER:
-    case PP_INPUTEVENT_TYPE_MOUSELEAVE:
-    case PP_INPUTEVENT_TYPE_CONTEXTMENU:
-      web_input_event.reset(BuildMouseEvent(event));
-      break;
-    case PP_INPUTEVENT_TYPE_WHEEL:
-      web_input_event.reset(BuildMouseWheelEvent(event));
-      break;
-    case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
-    case PP_INPUTEVENT_TYPE_KEYDOWN:
-    case PP_INPUTEVENT_TYPE_KEYUP:
-      web_input_event.reset(BuildKeyEvent(event));
-      break;
-    case PP_INPUTEVENT_TYPE_CHAR:
-      web_input_event.reset(BuildCharEvent(event));
-      break;
-    case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START:
-    case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE:
-    case PP_INPUTEVENT_TYPE_IME_COMPOSITION_END:
-    case PP_INPUTEVENT_TYPE_IME_TEXT:
-      // TODO(kinaba) implement in WebKit an event structure to handle
-      // composition events.
-      NOTREACHED();
-    case PP_INPUTEVENT_TYPE_TOUCHSTART:
-    case PP_INPUTEVENT_TYPE_TOUCHMOVE:
-    case PP_INPUTEVENT_TYPE_TOUCHEND:
-    case PP_INPUTEVENT_TYPE_TOUCHCANCEL:
-      web_input_event.reset(BuildTouchEvent(event));
-      break;
-  }
-
-  return web_input_event.release();
-}
-
-// Generate a coherent sequence of input events to simulate a user event.
-// From src/content/web_test/renderer/event_sender.cc.
-std::vector<std::unique_ptr<WebInputEvent>> CreateSimulatedWebInputEvents(
-    const ppapi::InputEventData& event,
-    int plugin_x,
-    int plugin_y) {
-  std::vector<std::unique_ptr<WebInputEvent>> events;
-  std::unique_ptr<WebInputEvent> original_event(CreateWebInputEvent(event));
-
-  switch (event.event_type) {
-    case PP_INPUTEVENT_TYPE_MOUSEDOWN:
-    case PP_INPUTEVENT_TYPE_MOUSEUP:
-    case PP_INPUTEVENT_TYPE_MOUSEMOVE:
-    case PP_INPUTEVENT_TYPE_MOUSEENTER:
-    case PP_INPUTEVENT_TYPE_MOUSELEAVE:
-      events.push_back(std::move(original_event));
-      break;
-    case PP_INPUTEVENT_TYPE_TOUCHSTART:
-    case PP_INPUTEVENT_TYPE_TOUCHMOVE:
-    case PP_INPUTEVENT_TYPE_TOUCHEND:
-    case PP_INPUTEVENT_TYPE_TOUCHCANCEL: {
-      blink::WebTouchEvent* touch_event =
-          static_cast<blink::WebTouchEvent*>(original_event.get());
-      for (unsigned i = 0; i < touch_event->touches_length; ++i) {
-        const blink::WebTouchPoint& touch_point = touch_event->touches[i];
-        if (touch_point.state !=
-            blink::WebTouchPoint::State::kStateStationary) {
-          events.push_back(
-              std::make_unique<WebPointerEvent>(*touch_event, touch_point));
-        }
-      }
-    } break;
-    case PP_INPUTEVENT_TYPE_WHEEL: {
-      WebMouseWheelEvent* web_mouse_wheel_event =
-          static_cast<WebMouseWheelEvent*>(original_event.get());
-      web_mouse_wheel_event->SetPositionInWidget(plugin_x, plugin_y);
-      events.push_back(std::move(original_event));
-      break;
-    }
-
-    case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
-    case PP_INPUTEVENT_TYPE_KEYDOWN:
-    case PP_INPUTEVENT_TYPE_KEYUP: {
-// Windows key down events should always be "raw" to avoid an ASSERT.
-#if BUILDFLAG(IS_WIN)
-      WebKeyboardEvent* web_keyboard_event =
-          static_cast<WebKeyboardEvent*>(original_event.get());
-      if (web_keyboard_event->GetType() == WebInputEvent::Type::kKeyDown)
-        web_keyboard_event->SetType(WebInputEvent::Type::kRawKeyDown);
-#endif
-      events.push_back(std::move(original_event));
-      break;
-    }
-
-    case PP_INPUTEVENT_TYPE_CHAR: {
-      WebKeyboardEvent* web_char_event =
-          static_cast<WebKeyboardEvent*>(original_event.get());
-
-      uint16_t code = 0, text = 0;
-      bool needs_shift_modifier = false, generate_char = false;
-      GetKeyCode(event.character_text,
-                 &code,
-                 &text,
-                 &needs_shift_modifier,
-                 &generate_char);
-
-      // Synthesize key down and key up events in all cases.
-      std::unique_ptr<WebKeyboardEvent> key_down_event(new WebKeyboardEvent(
-          WebInputEvent::Type::kRawKeyDown,
-          needs_shift_modifier ? WebInputEvent::kShiftKey
-                               : WebInputEvent::kNoModifiers,
-          web_char_event->TimeStamp()));
-      std::unique_ptr<WebKeyboardEvent> key_up_event(new WebKeyboardEvent());
-
-      key_down_event->windows_key_code = code;
-      key_down_event->native_key_code = code;
-
-      // If a char event is needed, set the text fields.
-      if (generate_char) {
-        key_down_event->text[0] = text;
-        key_down_event->unmodified_text[0] = text;
-      }
-
-      *key_up_event = *web_char_event = *key_down_event;
-
-      events.push_back(std::move(key_down_event));
-
-      if (generate_char) {
-        web_char_event->SetType(WebInputEvent::Type::kChar);
-        events.push_back(std::move(original_event));
-      }
-
-      key_up_event->SetType(WebInputEvent::Type::kKeyUp);
-      events.push_back(std::move(key_up_event));
-      break;
-    }
-
-    default:
-      break;
-  }
-  return events;
-}
-
-PP_InputEvent_Class ClassifyInputEvent(const WebInputEvent& event) {
-  switch (event.GetType()) {
-    case WebInputEvent::Type::kMouseDown:
-    case WebInputEvent::Type::kMouseUp:
-    case WebInputEvent::Type::kMouseMove:
-    case WebInputEvent::Type::kMouseEnter:
-    case WebInputEvent::Type::kMouseLeave:
-    case WebInputEvent::Type::kContextMenu:
-      return PP_INPUTEVENT_CLASS_MOUSE;
-    case WebInputEvent::Type::kMouseWheel:
-      return PP_INPUTEVENT_CLASS_WHEEL;
-    case WebInputEvent::Type::kRawKeyDown:
-    case WebInputEvent::Type::kKeyDown:
-    case WebInputEvent::Type::kKeyUp:
-    case WebInputEvent::Type::kChar:
-      return PP_INPUTEVENT_CLASS_KEYBOARD;
-    case WebInputEvent::Type::kTouchCancel:
-    case WebInputEvent::Type::kTouchEnd:
-    case WebInputEvent::Type::kTouchMove:
-    case WebInputEvent::Type::kTouchStart:
-      return PP_INPUTEVENT_CLASS_TOUCH;
-    case WebInputEvent::Type::kTouchScrollStarted:
-      return PP_InputEvent_Class(0);
-    default:
-      CHECK(WebInputEvent::IsGestureEventType(event.GetType()));
-      return PP_InputEvent_Class(0);
-  }
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/event_conversion.h b/content/renderer/pepper/event_conversion.h
deleted file mode 100644
index dbc14a0..0000000
--- a/content/renderer/pepper/event_conversion.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_EVENT_CONVERSION_H_
-#define CONTENT_RENDERER_PEPPER_EVENT_CONVERSION_H_
-
-#include <memory>
-#include <vector>
-
-#include "content/common/content_export.h"
-#include "ppapi/c/ppb_input_event.h"
-#include "third_party/blink/public/common/input/web_input_event.h"
-
-struct PP_InputEvent;
-
-namespace ppapi {
-struct InputEventData;
-}
-
-namespace blink {
-class WebInputEvent;
-}
-
-namespace content {
-
-// Converts the given WebKit event to one or possibly multiple PP_InputEvents.
-// The generated events will be filled into the given vector. On failure, no
-// events will ge generated and the vector will be empty.
-CONTENT_EXPORT void CreateInputEventData(
-    const blink::WebInputEvent& event,
-    std::vector<ppapi::InputEventData>* pp_events);
-
-// Creates a WebInputEvent from the given PP_InputEvent.  If it fails, returns
-// NULL.  The caller owns the created object on success.
-CONTENT_EXPORT blink::WebInputEvent* CreateWebInputEvent(
-    const ppapi::InputEventData& event);
-
-// Creates an array of WebInputEvents to make the given event look like a user
-// input event on all platforms. |plugin_x| and |plugin_y| should be the
-// coordinates of a point within the plugin's area on the page.
-std::vector<std::unique_ptr<blink::WebInputEvent>>
-CreateSimulatedWebInputEvents(const ppapi::InputEventData& event,
-                              int plugin_x,
-                              int plugin_y);
-
-// Returns the PPAPI event class for the given WebKit event type. The given
-// type should not be "Undefined" since there's no corresponding PPAPI class.
-PP_InputEvent_Class ClassifyInputEvent(const blink::WebInputEvent& event);
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_EVENT_CONVERSION_H_
diff --git a/content/renderer/pepper/event_conversion_unittest.cc b/content/renderer/pepper/event_conversion_unittest.cc
deleted file mode 100644
index 51662464..0000000
--- a/content/renderer/pepper/event_conversion_unittest.cc
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/event_conversion.h"
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "ppapi/shared_impl/ppb_input_event_shared.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/common/input/synthetic_web_input_event_builders.h"
-
-namespace content {
-
-class EventConversionTest : public ::testing::Test {
- protected:
-  void CompareWebTouchEvents(const blink::WebTouchEvent& expected,
-                             const blink::WebTouchEvent& actual) {
-    EXPECT_EQ(expected.GetType(), actual.GetType());
-    ASSERT_EQ(expected.touches_length, actual.touches_length);
-    for (size_t i = 0; i < expected.touches_length; ++i) {
-      size_t j = 0;
-      for (; j < actual.touches_length; ++j) {
-        if (actual.touches[j].id == expected.touches[i].id)
-          break;
-      }
-      ASSERT_NE(j, actual.touches_length);
-      EXPECT_EQ(expected.touches[i].id, actual.touches[j].id);
-      EXPECT_EQ(expected.touches[i].state, actual.touches[j].state);
-      EXPECT_EQ(expected.touches[i].PositionInWidget().x(),
-                actual.touches[j].PositionInWidget().x());
-      EXPECT_EQ(expected.touches[i].PositionInWidget().y(),
-                actual.touches[j].PositionInWidget().y());
-      EXPECT_EQ(expected.touches[i].radius_x, actual.touches[j].radius_x);
-      EXPECT_EQ(expected.touches[i].radius_y, actual.touches[j].radius_y);
-      EXPECT_EQ(expected.touches[i].rotation_angle,
-                actual.touches[j].rotation_angle);
-      EXPECT_EQ(expected.touches[i].force, actual.touches[j].force);
-    }
-  }
-};
-
-TEST_F(EventConversionTest, TouchStart) {
-  blink::SyntheticWebTouchEvent touch;
-  touch.PressPoint(1.f, 2.f);
-
-  std::vector<ppapi::InputEventData> pp_events;
-  CreateInputEventData(touch, &pp_events);
-  ASSERT_EQ(1U, pp_events.size());
-
-  const ppapi::InputEventData& pp_event = pp_events[0];
-  ASSERT_EQ(PP_INPUTEVENT_TYPE_TOUCHSTART, pp_event.event_type);
-  ASSERT_EQ(1U, pp_event.touches.size());
-  ASSERT_EQ(1U, pp_event.changed_touches.size());
-  ASSERT_EQ(1U, pp_event.target_touches.size());
-
-  std::unique_ptr<blink::WebInputEvent> event_out(
-      CreateWebInputEvent(pp_event));
-  const blink::WebTouchEvent* touch_out =
-      static_cast<const blink::WebTouchEvent*>(event_out.get());
-  ASSERT_TRUE(touch_out);
-  EXPECT_EQ(touch.GetType(), touch_out->GetType());
-  EXPECT_EQ(touch.touches_length, touch_out->touches_length);
-  CompareWebTouchEvents(touch, *touch_out);
-}
-
-TEST_F(EventConversionTest, TouchMove) {
-  blink::SyntheticWebTouchEvent touch;
-  touch.PressPoint(1.f, 2.f);
-  touch.ResetPoints();
-  touch.PressPoint(3.f, 4.f);
-  touch.ResetPoints();
-  touch.MovePoint(1, 5.f, 6.f);
-
-  std::vector<ppapi::InputEventData> pp_events;
-  CreateInputEventData(touch, &pp_events);
-  ASSERT_EQ(1U, pp_events.size());
-
-  const ppapi::InputEventData& pp_event = pp_events[0];
-  ASSERT_EQ(PP_INPUTEVENT_TYPE_TOUCHMOVE, pp_event.event_type);
-  ASSERT_EQ(2U, pp_event.touches.size());
-  ASSERT_EQ(1U, pp_event.changed_touches.size());
-  ASSERT_EQ(2U, pp_event.target_touches.size());
-
-  std::unique_ptr<blink::WebInputEvent> event_out(
-      CreateWebInputEvent(pp_event));
-  const blink::WebTouchEvent* touch_out =
-      static_cast<const blink::WebTouchEvent*>(event_out.get());
-  ASSERT_TRUE(touch_out);
-  EXPECT_EQ(touch.GetType(), touch_out->GetType());
-  EXPECT_EQ(touch.touches_length, touch_out->touches_length);
-  CompareWebTouchEvents(touch, *touch_out);
-}
-
-TEST_F(EventConversionTest, TouchEnd) {
-  blink::SyntheticWebTouchEvent touch;
-  touch.PressPoint(1.f, 2.f);
-  touch.ResetPoints();
-  touch.PressPoint(3.f, 4.f);
-  touch.ResetPoints();
-  touch.ReleasePoint(0);
-
-  std::vector<ppapi::InputEventData> pp_events;
-  CreateInputEventData(touch, &pp_events);
-  ASSERT_EQ(1U, pp_events.size());
-
-  const ppapi::InputEventData& pp_event = pp_events[0];
-  ASSERT_EQ(PP_INPUTEVENT_TYPE_TOUCHEND, pp_event.event_type);
-  ASSERT_EQ(1U, pp_event.touches.size());
-  ASSERT_EQ(1U, pp_event.changed_touches.size());
-  ASSERT_EQ(2U, pp_event.target_touches.size());
-
-  std::unique_ptr<blink::WebInputEvent> event_out(
-      CreateWebInputEvent(pp_event));
-  const blink::WebTouchEvent* touch_out =
-      static_cast<const blink::WebTouchEvent*>(event_out.get());
-  ASSERT_TRUE(touch_out);
-  EXPECT_EQ(touch.GetType(), touch_out->GetType());
-  ASSERT_EQ(touch.touches_length, touch_out->touches_length);
-  CompareWebTouchEvents(touch, *touch_out);
-}
-
-TEST_F(EventConversionTest, TouchCancel) {
-  blink::SyntheticWebTouchEvent touch;
-  touch.PressPoint(1.f, 2.f);
-  touch.ResetPoints();
-  touch.PressPoint(3.f, 4.f);
-  touch.ResetPoints();
-  touch.CancelPoint(1);
-  touch.CancelPoint(0);
-
-  std::vector<ppapi::InputEventData> pp_events;
-  CreateInputEventData(touch, &pp_events);
-  ASSERT_EQ(1U, pp_events.size());
-
-  const ppapi::InputEventData& pp_event = pp_events[0];
-  ASSERT_EQ(PP_INPUTEVENT_TYPE_TOUCHCANCEL, pp_event.event_type);
-  ASSERT_EQ(0U, pp_event.touches.size());
-  ASSERT_EQ(2U, pp_event.changed_touches.size());
-  ASSERT_EQ(2U, pp_event.target_touches.size());
-
-  std::unique_ptr<blink::WebInputEvent> event_out(
-      CreateWebInputEvent(pp_event));
-  const blink::WebTouchEvent* touch_out =
-      static_cast<const blink::WebTouchEvent*>(event_out.get());
-  ASSERT_TRUE(touch_out);
-  EXPECT_EQ(touch.GetType(), touch_out->GetType());
-  EXPECT_EQ(touch.touches_length, touch_out->touches_length);
-  CompareWebTouchEvents(touch, *touch_out);
-}
-
-TEST_F(EventConversionTest, MouseMove) {
-  blink::WebMouseEvent mouse_event =
-      blink::SyntheticWebMouseEventBuilder::Build(
-          blink::WebInputEvent::Type::kMouseMove, 100, 200, 0);
-
-  std::vector<ppapi::InputEventData> pp_events;
-  CreateInputEventData(mouse_event, &pp_events);
-  ASSERT_EQ(1U, pp_events.size());
-  const ppapi::InputEventData& pp_event = pp_events[0];
-  ASSERT_EQ(PP_INPUTEVENT_TYPE_MOUSEMOVE, pp_event.event_type);
-  ASSERT_EQ(pp_event.mouse_position.x, mouse_event.PositionInWidget().x());
-  ASSERT_EQ(pp_event.mouse_position.y, mouse_event.PositionInWidget().y());
-  ASSERT_EQ(pp_event.mouse_movement.x, 0);
-  ASSERT_EQ(pp_event.mouse_movement.y, 0);
-
-  mouse_event = blink::SyntheticWebMouseEventBuilder::Build(
-      blink::WebInputEvent::Type::kMouseMove, 123, 188, 0);
-  mouse_event.movement_x = 23;
-  mouse_event.movement_y = -12;
-  CreateInputEventData(mouse_event, &pp_events);
-  ASSERT_EQ(PP_INPUTEVENT_TYPE_MOUSEMOVE, pp_event.event_type);
-  ASSERT_EQ(pp_event.mouse_position.x, mouse_event.PositionInWidget().x());
-  ASSERT_EQ(pp_event.mouse_position.y, mouse_event.PositionInWidget().y());
-  ASSERT_EQ(pp_event.mouse_movement.x, 23);
-  ASSERT_EQ(pp_event.mouse_movement.y, -12);
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/fake_pepper_plugin_instance.cc b/content/renderer/pepper/fake_pepper_plugin_instance.cc
deleted file mode 100644
index 0e0403f..0000000
--- a/content/renderer/pepper/fake_pepper_plugin_instance.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/fake_pepper_plugin_instance.h"
-
-#include "base/files/file_path.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/shared_impl/ppapi_permissions.h"
-
-namespace content {
-
-FakePepperPluginInstance::~FakePepperPluginInstance() {}
-
-content::RenderFrame* FakePepperPluginInstance::GetRenderFrame() {
-  return nullptr;
-}
-
-blink::WebPluginContainer* FakePepperPluginInstance::GetContainer() {
-  return nullptr;
-}
-
-v8::Isolate* FakePepperPluginInstance::GetIsolate() {
-  return nullptr;
-}
-
-ppapi::VarTracker* FakePepperPluginInstance::GetVarTracker() {
-  return nullptr;
-}
-
-const GURL& FakePepperPluginInstance::GetPluginURL() {
-  return gurl_;
-}
-
-base::FilePath FakePepperPluginInstance::GetModulePath() {
-  return base::FilePath();
-}
-
-PP_Resource FakePepperPluginInstance::CreateImage(gfx::ImageSkia* source_image,
-                                                  float scale) {
-  return 0;
-}
-
-PP_ExternalPluginResult FakePepperPluginInstance::SwitchToOutOfProcessProxy(
-    const base::FilePath& file_path,
-    ppapi::PpapiPermissions permissions,
-    const IPC::ChannelHandle& channel_handle,
-    base::ProcessId plugin_pid,
-    int plugin_child_id) {
-  return PP_EXTERNAL_PLUGIN_FAILED;
-}
-
-void FakePepperPluginInstance::SetAlwaysOnTop(bool on_top) {}
-
-bool FakePepperPluginInstance::IsFullPagePlugin() {
-  return false;
-}
-
-bool FakePepperPluginInstance::IsRectTopmost(const gfx::Rect& rect) {
-  return false;
-}
-
-int FakePepperPluginInstance::MakePendingFileRefRendererHost(
-    const base::FilePath& path) {
-  return 0;
-}
-
-void FakePepperPluginInstance::SetEmbedProperty(PP_Var key, PP_Var value) {}
-
-void FakePepperPluginInstance::SetSelectedText(
-    const std::u16string& selected_text) {}
-
-void FakePepperPluginInstance::SetLinkUnderCursor(const std::string& url) {}
-void FakePepperPluginInstance::SetTextInputType(ui::TextInputType type) {}
-void FakePepperPluginInstance::PostMessageToJavaScript(PP_Var message) {}
-
-}  // namespace content
diff --git a/content/renderer/pepper/fake_pepper_plugin_instance.h b/content/renderer/pepper/fake_pepper_plugin_instance.h
deleted file mode 100644
index 9b8deca6..0000000
--- a/content/renderer/pepper/fake_pepper_plugin_instance.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_FAKE_PEPPER_PLUGIN_INSTANCE_H_
-#define CONTENT_RENDERER_PEPPER_FAKE_PEPPER_PLUGIN_INSTANCE_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "content/public/renderer/pepper_plugin_instance.h"
-#include "url/gurl.h"
-
-namespace content {
-
-class FakePepperPluginInstance : public PepperPluginInstance {
- public:
-  ~FakePepperPluginInstance() override;
-
-  // PepperPluginInstance overrides.
-  content::RenderFrame* GetRenderFrame() override;
-  blink::WebPluginContainer* GetContainer() override;
-  v8::Isolate* GetIsolate() override;
-  ppapi::VarTracker* GetVarTracker() override;
-  const GURL& GetPluginURL() override;
-  base::FilePath GetModulePath() override;
-  PP_Resource CreateImage(gfx::ImageSkia* source_image, float scale) override;
-  PP_ExternalPluginResult SwitchToOutOfProcessProxy(
-      const base::FilePath& file_path,
-      ppapi::PpapiPermissions permissions,
-      const IPC::ChannelHandle& channel_handle,
-      base::ProcessId plugin_pid,
-      int plugin_child_id) override;
-  void SetAlwaysOnTop(bool on_top) override;
-  bool IsFullPagePlugin() override;
-  bool IsRectTopmost(const gfx::Rect& rect) override;
-  int MakePendingFileRefRendererHost(const base::FilePath& path) override;
-  void SetEmbedProperty(PP_Var key, PP_Var value) override;
-  void SetSelectedText(const std::u16string& selected_text) override;
-  void SetLinkUnderCursor(const std::string& url) override;
-  void SetTextInputType(ui::TextInputType type) override;
-  void PostMessageToJavaScript(PP_Var message) override;
-
- private:
-  GURL gurl_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_FAKE_PEPPER_PLUGIN_INSTANCE_H_
diff --git a/content/renderer/pepper/host_array_buffer_var.cc b/content/renderer/pepper/host_array_buffer_var.cc
deleted file mode 100644
index a1c84dd6..0000000
--- a/content/renderer/pepper/host_array_buffer_var.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/host_array_buffer_var.h"
-
-#include <stdio.h>
-#include <string.h>
-
-#include <memory>
-
-#include "base/compiler_specific.h"
-#include "base/memory/shared_memory_mapping.h"
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "base/process/process_handle.h"
-#include "content/common/pepper_file_util.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "ppapi/c/pp_instance.h"
-
-using ppapi::ArrayBufferVar;
-using blink::WebArrayBuffer;
-
-namespace content {
-
-HostArrayBufferVar::HostArrayBufferVar(uint32_t size_in_bytes)
-    : buffer_(WebArrayBuffer::Create(size_in_bytes, 1 /* element_size */)),
-      valid_(true) {}
-
-HostArrayBufferVar::HostArrayBufferVar(const WebArrayBuffer& buffer)
-    : buffer_(buffer), valid_(true) {}
-
-HostArrayBufferVar::HostArrayBufferVar(
-    uint32_t size_in_bytes,
-    const base::UnsafeSharedMemoryRegion& region)
-    : buffer_(WebArrayBuffer::Create(size_in_bytes, 1 /* element_size */)) {
-  base::WritableSharedMemoryMapping shm_mapping =
-      region.MapAt(0, size_in_bytes);
-  if (shm_mapping.IsValid()) {
-    UNSAFE_TODO(memcpy(buffer_.Data(), shm_mapping.memory(), size_in_bytes));
-  }
-}
-
-HostArrayBufferVar::~HostArrayBufferVar() {}
-
-void* HostArrayBufferVar::Map() {
-  if (!valid_)
-    return nullptr;
-  return buffer_.Data();
-}
-
-void HostArrayBufferVar::Unmap() {
-  // We do not used shared memory on the host side. Nothing to do.
-}
-
-uint32_t HostArrayBufferVar::ByteLength() {
-  return base::checked_cast<uint32_t>(buffer_.ByteLength());
-}
-
-bool HostArrayBufferVar::CopyToNewShmem(
-    PP_Instance instance,
-    int* host_shm_handle_id,
-    base::UnsafeSharedMemoryRegion* plugin_shm_region) {
-  base::UnsafeSharedMemoryRegion shm =
-      base::UnsafeSharedMemoryRegion::Create(ByteLength());
-  if (!shm.IsValid())
-    return false;
-
-  base::WritableSharedMemoryMapping shm_mapping = shm.MapAt(0, ByteLength());
-  if (!shm_mapping.IsValid())
-    return false;
-  UNSAFE_TODO(memcpy(shm_mapping.memory(), Map(), ByteLength()));
-
-  // Duplicate the handle here; the UnsafeSharedMemoryRegion destructor closes
-  // its handle on us.
-  HostGlobals* hg = HostGlobals::Get();
-  PluginModule* pm = hg->GetModule(hg->GetModuleForInstance(instance));
-
-  *plugin_shm_region =
-      pm->renderer_ppapi_host()->ShareUnsafeSharedMemoryRegionWithRemote(shm);
-  *host_shm_handle_id = -1;
-  return true;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/host_array_buffer_var.h b/content/renderer/pepper/host_array_buffer_var.h
deleted file mode 100644
index 0519076..0000000
--- a/content/renderer/pepper/host_array_buffer_var.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_HOST_ARRAY_BUFFER_VAR_H_
-#define CONTENT_RENDERER_PEPPER_HOST_ARRAY_BUFFER_VAR_H_
-
-#include <stdint.h>
-
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/shared_impl/host_resource.h"
-#include "ppapi/shared_impl/var.h"
-#include "third_party/blink/public/web/web_array_buffer.h"
-
-namespace content {
-
-// Represents a host-side ArrayBufferVar.
-class HostArrayBufferVar : public ppapi::ArrayBufferVar {
- public:
-  explicit HostArrayBufferVar(uint32_t size_in_bytes);
-  explicit HostArrayBufferVar(const blink::WebArrayBuffer& buffer);
-  explicit HostArrayBufferVar(uint32_t size_in_bytes,
-                              const base::UnsafeSharedMemoryRegion& Region);
-
-  HostArrayBufferVar(const HostArrayBufferVar&) = delete;
-  HostArrayBufferVar& operator=(const HostArrayBufferVar&) = delete;
-
-  // ArrayBufferVar implementation.
-  void* Map() override;
-  void Unmap() override;
-  uint32_t ByteLength() override;
-  bool CopyToNewShmem(
-      PP_Instance instance,
-      int* host_shm_handle_id,
-      base::UnsafeSharedMemoryRegion* plugin_shm_region) override;
-
-  blink::WebArrayBuffer& webkit_buffer() { return buffer_; }
-
- private:
-  ~HostArrayBufferVar() override;
-
-  blink::WebArrayBuffer buffer_;
-  // Tracks whether the data in the buffer is valid.
-  bool valid_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_HOST_ARRAY_BUFFER_VAR_H_
diff --git a/content/renderer/pepper/host_dispatcher_wrapper.cc b/content/renderer/pepper/host_dispatcher_wrapper.cc
deleted file mode 100644
index 4b0d326..0000000
--- a/content/renderer/pepper/host_dispatcher_wrapper.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/host_dispatcher_wrapper.h"
-
-#include <memory>
-
-#include "base/task/single_thread_task_runner.h"
-#include "build/build_config.h"
-#include "content/public/renderer/render_frame.h"
-#include "content/renderer/pepper/pepper_browser_connection.h"
-#include "content/renderer/pepper/pepper_hung_plugin_filter.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/pepper_proxy_channel_delegate_impl.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "content/renderer/pepper/renderer_restrict_dispatch_group.h"
-#include "services/network/public/cpp/is_potentially_trustworthy.h"
-#include "third_party/blink/public/web/web_document.h"
-#include "third_party/blink/public/web/web_plugin_container.h"
-
-namespace content {
-
-HostDispatcherWrapper::HostDispatcherWrapper(
-    PluginModule* module,
-    base::ProcessId peer_pid,
-    int plugin_child_id,
-    const ppapi::PpapiPermissions& perms,
-    bool is_external)
-    : module_(module),
-      peer_pid_(peer_pid),
-      plugin_child_id_(plugin_child_id),
-      permissions_(perms),
-      is_external_(is_external) {}
-
-HostDispatcherWrapper::~HostDispatcherWrapper() {
-  hung_plugin_filter_->HostDispatcherDestroyed();
-}
-
-bool HostDispatcherWrapper::Init(
-    const IPC::ChannelHandle& channel_handle,
-    PP_GetInterface_Func local_get_interface,
-    const ppapi::Preferences& preferences,
-    scoped_refptr<PepperHungPluginFilter> filter,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  if (!channel_handle.is_mojo_channel_handle())
-    return false;
-
-  dispatcher_delegate_ = std::make_unique<PepperProxyChannelDelegateImpl>();
-  dispatcher_ = std::make_unique<ppapi::proxy::HostDispatcher>(
-      module_->pp_module(), local_get_interface, permissions_);
-  // The HungPluginFilter needs to know when we are blocked on a sync message
-  // to the plugin. Note the filter outlives the dispatcher, so there is no
-  // need to remove it as an observer.
-  dispatcher_->AddSyncMessageStatusObserver(filter.get());
-  // Guarantee the hung_plugin_filter_ outlives |dispatcher_|.
-  hung_plugin_filter_ = filter;
-
-  if (!dispatcher_->InitHostWithChannel(dispatcher_delegate_.get(), peer_pid_,
-                                        channel_handle,
-                                        true,  // Client.
-                                        preferences, task_runner)) {
-    dispatcher_.reset();
-    dispatcher_delegate_.reset();
-    return false;
-  }
-  // HungPluginFilter needs to listen for some messages on the IO thread.
-  dispatcher_->AddIOThreadMessageFilter(filter);
-
-  dispatcher_->channel()->SetRestrictDispatchChannelGroup(
-      kRendererRestrictDispatchGroup_Pepper);
-  return true;
-}
-
-const void* HostDispatcherWrapper::GetProxiedInterface(const char* name) {
-  return dispatcher_->GetProxiedInterface(name);
-}
-
-void HostDispatcherWrapper::AddInstance(PP_Instance instance) {
-  ppapi::proxy::HostDispatcher::SetForInstance(instance, dispatcher_.get());
-
-  RendererPpapiHostImpl* host =
-      RendererPpapiHostImpl::GetForPPInstance(instance);
-  // TODO(brettw) remove this null check when the old-style pepper-based
-  // browser tag is removed from this file. Getting this notification should
-  // always give us an instance we can find in the map otherwise, but that
-  // isn't true for browser tag support.
-  if (host) {
-    RenderFrame* render_frame = host->GetRenderFrameForInstance(instance);
-    PepperPluginInstance* plugin_instance = host->GetPluginInstance(instance);
-    bool is_privileged_context =
-        plugin_instance->GetContainer()->GetDocument().IsSecureContext() &&
-        network::IsUrlPotentiallyTrustworthy(plugin_instance->GetPluginURL());
-    PepperBrowserConnection::Get(render_frame)
-        ->DidCreateOutOfProcessPepperInstance(
-            plugin_child_id_, instance, is_external_,
-            render_frame->GetRoutingID(), host->GetDocumentURL(instance),
-            plugin_instance->GetPluginURL(), is_privileged_context);
-  }
-}
-
-void HostDispatcherWrapper::RemoveInstance(PP_Instance instance) {
-  ppapi::proxy::HostDispatcher::RemoveForInstance(instance);
-
-  RendererPpapiHostImpl* host =
-      RendererPpapiHostImpl::GetForPPInstance(instance);
-  // TODO(brettw) remove null check as described in AddInstance.
-  if (host) {
-    RenderFrame* render_frame = host->GetRenderFrameForInstance(instance);
-    if (render_frame) {
-      PepperBrowserConnection::Get(render_frame)
-          ->DidDeleteOutOfProcessPepperInstance(plugin_child_id_, instance,
-                                                is_external_);
-    }
-  }
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/host_dispatcher_wrapper.h b/content/renderer/pepper/host_dispatcher_wrapper.h
deleted file mode 100644
index f7b3fa4..0000000
--- a/content/renderer/pepper/host_dispatcher_wrapper.h
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_HOST_DISPATCHER_WRAPPER_H_
-#define CONTENT_RENDERER_PEPPER_HOST_DISPATCHER_WRAPPER_H_
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "base/process/process_handle.h"
-#include "base/task/single_thread_task_runner.h"
-#include "content/renderer/pepper/pepper_hung_plugin_filter.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/c/ppp.h"
-#include "ppapi/proxy/host_dispatcher.h"
-#include "ppapi/shared_impl/ppapi_permissions.h"
-
-namespace IPC {
-struct ChannelHandle;
-}
-
-namespace content {
-class PepperHungPluginFilter;
-class PluginModule;
-
-// This class wraps a dispatcher and has the same lifetime. A dispatcher has
-// the same lifetime as a plugin module, which is longer than any particular
-// `blink::WebView` or plugin instance.
-class HostDispatcherWrapper {
- public:
-  HostDispatcherWrapper(PluginModule* module,
-                        base::ProcessId peer_pid,
-                        int plugin_child_id,
-                        const ppapi::PpapiPermissions& perms,
-                        bool is_external);
-  virtual ~HostDispatcherWrapper();
-
-  bool Init(const IPC::ChannelHandle& channel_handle,
-            PP_GetInterface_Func local_get_interface,
-            const ppapi::Preferences& preferences,
-            scoped_refptr<PepperHungPluginFilter> filter,
-            scoped_refptr<base::SingleThreadTaskRunner> task_runner);
-
-  // Implements GetInterface for the proxied plugin.
-  const void* GetProxiedInterface(const char* name);
-
-  // Notification to the out-of-process layer that the given plugin instance
-  // has been created. This will happen before the normal PPB_Instance method
-  // calls so the out-of-process code can set up the tracking information for
-  // the new instance.
-  void AddInstance(PP_Instance instance);
-
-  // Like AddInstance but removes the given instance. This is called after
-  // regular instance shutdown so the out-of-process code can clean up its
-  // tracking information.
-  void RemoveInstance(PP_Instance instance);
-
-  base::ProcessId peer_pid() { return peer_pid_; }
-  int plugin_child_id() { return plugin_child_id_; }
-  ppapi::proxy::HostDispatcher* dispatcher() { return dispatcher_.get(); }
-
- private:
-  raw_ptr<PluginModule> module_;
-
-  base::ProcessId peer_pid_;
-
-  // ID that the browser process uses to idetify the child process for the
-  // plugin. This isn't directly useful from our process (the renderer) except
-  // in messages to the browser to disambiguate plugins.
-  int plugin_child_id_;
-
-  ppapi::PpapiPermissions permissions_;
-  bool is_external_;
-
-  std::unique_ptr<ppapi::proxy::HostDispatcher> dispatcher_;
-  std::unique_ptr<ppapi::proxy::ProxyChannel::Delegate> dispatcher_delegate_;
-  // We hold the hung_plugin_filter_ to guarantee it outlives |dispatcher_|,
-  // since it is an observer of |dispatcher_| for sync calls.
-  scoped_refptr<PepperHungPluginFilter> hung_plugin_filter_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_HOST_DISPATCHER_WRAPPER_H_
diff --git a/content/renderer/pepper/host_globals.cc b/content/renderer/pepper/host_globals.cc
deleted file mode 100644
index 8a615c3..0000000
--- a/content/renderer/pepper/host_globals.cc
+++ /dev/null
@@ -1,271 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/host_globals.h"
-
-#include <limits>
-
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/rand_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/task/task_runner.h"
-#include "base/task/thread_pool.h"
-#include "content/public/common/content_switches.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "ppapi/shared_impl/api_id.h"
-#include "ppapi/shared_impl/id_assignment.h"
-#include "ppapi/shared_impl/proxy_lock.h"
-#include "third_party/blink/public/platform/web_string.h"
-#include "third_party/blink/public/web/web_console_message.h"
-#include "third_party/blink/public/web/web_document.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-#include "third_party/blink/public/web/web_plugin_container.h"
-
-using ppapi::CheckIdType;
-using ppapi::MakeTypedId;
-using ppapi::PPIdType;
-using ppapi::ResourceTracker;
-using blink::WebConsoleMessage;
-using blink::WebLocalFrame;
-using blink::WebPluginContainer;
-using blink::WebString;
-
-namespace content {
-
-namespace {
-
-typedef std::set<WebPluginContainer*> ContainerSet;
-
-// Adds all WebPluginContainers associated with the given module to the set.
-void GetAllContainersForModule(PluginModule* module, ContainerSet* containers) {
-  const PluginModule::PluginInstanceSet& instances = module->GetAllInstances();
-  for (auto i = instances.begin(); i != instances.end(); ++i) {
-    WebPluginContainer* container = (*i)->container();
-    // If "Delete" is called on an instance, the instance sets its container to
-    // NULL, but the instance may actually outlive its container. Callers of
-    // GetAllContainersForModule only want to know about valid containers.
-    if (container)
-      containers->insert(container);
-  }
-}
-
-blink::mojom::ConsoleMessageLevel LogLevelToWebLogLevel(PP_LogLevel level) {
-  switch (level) {
-    case PP_LOGLEVEL_TIP:
-      return blink::mojom::ConsoleMessageLevel::kVerbose;
-    case PP_LOGLEVEL_LOG:
-      return blink::mojom::ConsoleMessageLevel::kInfo;
-    case PP_LOGLEVEL_WARNING:
-      return blink::mojom::ConsoleMessageLevel::kWarning;
-    case PP_LOGLEVEL_ERROR:
-    default:
-      return blink::mojom::ConsoleMessageLevel::kError;
-  }
-}
-
-WebConsoleMessage MakeLogMessage(PP_LogLevel level,
-                                 const std::string& source,
-                                 const std::string& message) {
-  std::string result = source;
-  if (!result.empty())
-    result.append(": ");
-  result.append(message);
-  return WebConsoleMessage(LogLevelToWebLogLevel(level),
-                           WebString::FromUTF8(result));
-}
-
-}  // namespace
-
-HostGlobals* HostGlobals::host_globals_ = nullptr;
-
-HostGlobals::HostGlobals()
-    : ppapi::PpapiGlobals(),
-      resource_tracker_(ResourceTracker::SINGLE_THREADED) {
-  DCHECK(!host_globals_);
-  host_globals_ = this;
-  // We do not support calls off of the main thread on the host side, and thus
-  // do not lock.
-  ppapi::ProxyLock::DisableLocking();
-}
-
-HostGlobals::~HostGlobals() {
-  DCHECK(host_globals_ == this || !host_globals_);
-  host_globals_ = nullptr;
-}
-
-ppapi::ResourceTracker* HostGlobals::GetResourceTracker() {
-  return &resource_tracker_;
-}
-
-ppapi::VarTracker* HostGlobals::GetVarTracker() { return &host_var_tracker_; }
-
-ppapi::CallbackTracker* HostGlobals::GetCallbackTrackerForInstance(
-    PP_Instance instance) {
-  auto found = instance_map_.find(instance);
-  if (found == instance_map_.end())
-    return nullptr;
-  return found->second->module()->GetCallbackTracker().get();
-}
-
-ppapi::thunk::PPB_Instance_API* HostGlobals::GetInstanceAPI(
-    PP_Instance instance) {
-  // The InstanceAPI is just implemented by the PluginInstance object.
-  return GetInstance(instance);
-}
-
-ppapi::thunk::ResourceCreationAPI* HostGlobals::GetResourceCreationAPI(
-    PP_Instance pp_instance) {
-  PepperPluginInstanceImpl* instance = GetInstance(pp_instance);
-  if (!instance)
-    return nullptr;
-  return &instance->resource_creation();
-}
-
-PP_Module HostGlobals::GetModuleForInstance(PP_Instance instance) {
-  PepperPluginInstanceImpl* inst = GetInstance(instance);
-  if (!inst)
-    return 0;
-  return inst->module()->pp_module();
-}
-
-void HostGlobals::LogWithSource(PP_Instance instance,
-                                PP_LogLevel level,
-                                const std::string& source,
-                                const std::string& value) {
-  PepperPluginInstanceImpl* instance_object =
-      HostGlobals::Get()->GetInstance(instance);
-  // It's possible to process this message in a nested run loop while
-  // detaching a Document…
-  // TODO(dcheng): Make it so this can't happen. https://crbug.com/561683
-  if (instance_object &&
-      instance_object->container()->GetDocument().GetFrame()) {
-    instance_object->container()->GetDocument().GetFrame()->AddMessageToConsole(
-        MakeLogMessage(level, source, value));
-  } else {
-    BroadcastLogWithSource(0, level, source, value);
-  }
-}
-
-void HostGlobals::BroadcastLogWithSource(PP_Module pp_module,
-                                         PP_LogLevel level,
-                                         const std::string& source,
-                                         const std::string& value) {
-  // Get the unique containers associated with the broadcast. This prevents us
-  // from sending the same message to the same console when there are two
-  // instances on the page.
-  ContainerSet containers;
-  PluginModule* module = GetModule(pp_module);
-  if (module) {
-    GetAllContainersForModule(module, &containers);
-  } else {
-    // Unknown module, get containers for all modules.
-    for (ModuleMap::const_iterator i = module_map_.begin();
-         i != module_map_.end();
-         ++i) {
-      GetAllContainersForModule(i->second, &containers);
-    }
-  }
-
-  WebConsoleMessage message = MakeLogMessage(level, source, value);
-  for (auto i = containers.begin(); i != containers.end(); ++i) {
-    WebLocalFrame* frame = (*i)->GetDocument().GetFrame();
-    if (frame)
-      frame->AddMessageToConsole(message);
-  }
-}
-
-base::TaskRunner* HostGlobals::GetFileTaskRunner() {
-  if (!file_task_runner_)
-    file_task_runner_ = base::ThreadPool::CreateTaskRunner({base::MayBlock()});
-  return file_task_runner_.get();
-}
-
-ppapi::MessageLoopShared* HostGlobals::GetCurrentMessageLoop() {
-  return nullptr;
-}
-
-PP_Module HostGlobals::AddModule(PluginModule* module) {
-#ifndef NDEBUG
-  // Make sure we're not adding one more than once.
-  for (ModuleMap::const_iterator i = module_map_.begin();
-       i != module_map_.end();
-       ++i)
-    DCHECK(i->second != module);
-#endif
-
-  // See AddInstance.
-  PP_Module new_module;
-  do {
-    new_module = MakeTypedId(static_cast<PP_Module>(base::RandUint64()),
-                             ppapi::PP_ID_TYPE_MODULE);
-  } while (!new_module || module_map_.find(new_module) != module_map_.end());
-  module_map_[new_module] = module;
-  return new_module;
-}
-
-void HostGlobals::ModuleDeleted(PP_Module module) {
-  DLOG_IF(ERROR, !CheckIdType(module, ppapi::PP_ID_TYPE_MODULE))
-      << module << " is not a PP_Module.";
-  auto found = module_map_.find(module);
-  if (found == module_map_.end()) {
-    NOTREACHED();
-  }
-  module_map_.erase(found);
-}
-
-PluginModule* HostGlobals::GetModule(PP_Module module) {
-  DLOG_IF(ERROR, !CheckIdType(module, ppapi::PP_ID_TYPE_MODULE))
-      << module << " is not a PP_Module.";
-  auto found = module_map_.find(module);
-  if (found == module_map_.end())
-    return nullptr;
-  return found->second;
-}
-
-PP_Instance HostGlobals::AddInstance(PepperPluginInstanceImpl* instance) {
-  DCHECK(instance_map_.find(instance->pp_instance()) == instance_map_.end());
-
-  // Use a random number for the instance ID. This helps prevent some
-  // accidents. See also AddModule below.
-  //
-  // Need to make sure the random number isn't a duplicate or 0.
-  PP_Instance new_instance;
-  do {
-    new_instance = MakeTypedId(static_cast<PP_Instance>(base::RandUint64()),
-                               ppapi::PP_ID_TYPE_INSTANCE);
-  } while (!new_instance ||
-           instance_map_.find(new_instance) != instance_map_.end() ||
-           !instance->module()->ReserveInstanceID(new_instance));
-
-  instance_map_[new_instance] = instance;
-
-  resource_tracker_.DidCreateInstance(new_instance);
-  return new_instance;
-}
-
-void HostGlobals::InstanceDeleted(PP_Instance instance) {
-  resource_tracker_.DidDeleteInstance(instance);
-  host_var_tracker_.DidDeleteInstance(instance);
-  instance_map_.erase(instance);
-}
-
-void HostGlobals::InstanceCrashed(PP_Instance instance) {
-  resource_tracker_.DidDeleteInstance(instance);
-  host_var_tracker_.DidDeleteInstance(instance);
-}
-
-PepperPluginInstanceImpl* HostGlobals::GetInstance(PP_Instance instance) {
-  DLOG_IF(ERROR, !CheckIdType(instance, ppapi::PP_ID_TYPE_INSTANCE))
-      << instance << " is not a PP_Instance.";
-  auto found = instance_map_.find(instance);
-  if (found == instance_map_.end())
-    return nullptr;
-  return found->second;
-}
-
-bool HostGlobals::IsHostGlobals() const { return true; }
-
-}  // namespace content
diff --git a/content/renderer/pepper/host_globals.h b/content/renderer/pepper/host_globals.h
deleted file mode 100644
index 255c4825..0000000
--- a/content/renderer/pepper/host_globals.h
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_HOST_GLOBALS_H_
-#define CONTENT_RENDERER_PEPPER_HOST_GLOBALS_H_
-
-#include "content/renderer/pepper/host_var_tracker.h"
-#include "ppapi/shared_impl/callback_tracker.h"
-#include "ppapi/shared_impl/ppapi_globals.h"
-#include "ppapi/shared_impl/resource_tracker.h"
-#include "ppapi/shared_impl/var_tracker.h"
-
-namespace content {
-
-class PepperPluginInstanceImpl;
-class PluginModule;
-
-class HostGlobals : public ppapi::PpapiGlobals {
- public:
-  HostGlobals();
-
-  HostGlobals(const HostGlobals&) = delete;
-  HostGlobals& operator=(const HostGlobals&) = delete;
-
-  ~HostGlobals() override;
-
-  // Getter for the global singleton. Generally, you should use
-  // PpapiGlobals::Get() when possible. Use this only when you need some
-  // host-specific functionality.
-  inline static HostGlobals* Get() {
-    DCHECK(PpapiGlobals::Get()->IsHostGlobals());
-    return static_cast<HostGlobals*>(PpapiGlobals::Get());
-  }
-
-  // PpapiGlobals implementation.
-  ppapi::ResourceTracker* GetResourceTracker() override;
-  ppapi::VarTracker* GetVarTracker() override;
-  ppapi::CallbackTracker* GetCallbackTrackerForInstance(
-      PP_Instance instance) override;
-  ppapi::thunk::PPB_Instance_API* GetInstanceAPI(PP_Instance instance) override;
-  ppapi::thunk::ResourceCreationAPI* GetResourceCreationAPI(
-      PP_Instance instance) override;
-  PP_Module GetModuleForInstance(PP_Instance instance) override;
-  void LogWithSource(PP_Instance instance,
-                     PP_LogLevel level,
-                     const std::string& source,
-                     const std::string& value) override;
-  void BroadcastLogWithSource(PP_Module module,
-                              PP_LogLevel level,
-                              const std::string& source,
-                              const std::string& value) override;
-  ppapi::MessageLoopShared* GetCurrentMessageLoop() override;
-  base::TaskRunner* GetFileTaskRunner() override;
-
-  HostVarTracker* host_var_tracker() { return &host_var_tracker_; }
-
-  // PP_Modules ----------------------------------------------------------------
-
-  // Adds a new plugin module to the list of tracked module, and returns a new
-  // module handle to identify it.
-  PP_Module AddModule(PluginModule* module);
-
-  // Called when a plugin modulde was deleted and should no longer be tracked.
-  // The given handle should be one generated by AddModule.
-  void ModuleDeleted(PP_Module module);
-
-  // Returns a pointer to the plugin modulde object associated with the given
-  // modulde handle. The return value will be NULL if the handle is invalid.
-  PluginModule* GetModule(PP_Module module);
-
-  // PP_Instances --------------------------------------------------------------
-
-  // Adds a new plugin instance to the list of tracked instances, and returns a
-  // new instance handle to identify it.
-  PP_Instance AddInstance(PepperPluginInstanceImpl* instance);
-
-  // Called when a plugin instance was deleted and should no longer be tracked.
-  // The given handle should be one generated by AddInstance.
-  void InstanceDeleted(PP_Instance instance);
-
-  void InstanceCrashed(PP_Instance instance);
-
-  // Returns a pointer to the plugin instance object associated with the given
-  // instance handle. The return value will be NULL if the handle is invalid or
-  // if the instance has crashed.
-  PepperPluginInstanceImpl* GetInstance(PP_Instance instance);
-
- private:
-  // PpapiGlobals overrides.
-  bool IsHostGlobals() const override;
-
-  static HostGlobals* host_globals_;
-
-  ppapi::ResourceTracker resource_tracker_;
-  HostVarTracker host_var_tracker_;
-
-  // Tracks all live instances and their associated object.
-  typedef std::map<PP_Instance, PepperPluginInstanceImpl*> InstanceMap;
-  InstanceMap instance_map_;
-
-  // Tracks all live modules. The pointers are non-owning, the PluginModule
-  // destructor will notify us when the module is deleted.
-  typedef std::map<PP_Module, PluginModule*> ModuleMap;
-  ModuleMap module_map_;
-
-  scoped_refptr<base::TaskRunner> file_task_runner_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_HOST_GLOBALS_H_
diff --git a/content/renderer/pepper/host_resource_var.cc b/content/renderer/pepper/host_resource_var.cc
deleted file mode 100644
index ab510a8..0000000
--- a/content/renderer/pepper/host_resource_var.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/host_resource_var.h"
-
-namespace content {
-
-HostResourceVar::HostResourceVar() : pp_resource_(0) {}
-
-HostResourceVar::HostResourceVar(PP_Resource pp_resource)
-    : pp_resource_(pp_resource),
-      pending_renderer_host_id_(0),
-      pending_browser_host_id_(0) {}
-
-HostResourceVar::HostResourceVar(int pending_renderer_host_id,
-                                 const IPC::Message& creation_message)
-    : pp_resource_(0),
-      pending_renderer_host_id_(pending_renderer_host_id),
-      pending_browser_host_id_(0),
-      creation_message_(new IPC::Message(creation_message)) {}
-
-PP_Resource HostResourceVar::GetPPResource() const { return pp_resource_; }
-
-int HostResourceVar::GetPendingRendererHostId() const {
-  return pending_renderer_host_id_;
-}
-
-int HostResourceVar::GetPendingBrowserHostId() const {
-  return pending_browser_host_id_;
-}
-
-const IPC::Message* HostResourceVar::GetCreationMessage() const {
-  return creation_message_.get();
-}
-
-bool HostResourceVar::IsPending() const {
-  return pp_resource_ == 0 && creation_message_;
-}
-
-HostResourceVar::~HostResourceVar() {}
-
-}  // namespace content
diff --git a/content/renderer/pepper/host_resource_var.h b/content/renderer/pepper/host_resource_var.h
deleted file mode 100644
index f43c6ae..0000000
--- a/content/renderer/pepper/host_resource_var.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_HOST_RESOURCE_VAR_H_
-#define CONTENT_RENDERER_PEPPER_HOST_RESOURCE_VAR_H_
-
-#include <memory>
-
-#include "ipc/ipc_message.h"
-#include "ppapi/c/pp_resource.h"
-#include "ppapi/shared_impl/resource_var.h"
-#include "ppapi/shared_impl/var.h"
-
-namespace content {
-
-// Represents a resource var, usable on the host side. Can either have a
-// plugin-side resource or a pending resource host.
-class HostResourceVar : public ppapi::ResourceVar {
- public:
-  // Makes a null resource var.
-  HostResourceVar();
-
-  // Makes a resource var with an existing plugin-side resource.
-  explicit HostResourceVar(PP_Resource pp_resource);
-
-  // Makes a resource var with a pending resource host.
-  // The |pending_renderer_host_id| is a pending resource host ID in the
-  // renderer to attach from the plugin. Depending on the type of resource, this
-  // may be 0. The |creation_message| contains additional data needed to create
-  // the plugin-side resource. Its type depends on the type of resource.
-  HostResourceVar(int pending_renderer_host_id,
-                  const IPC::Message& creation_message);
-
-  HostResourceVar(const HostResourceVar&) = delete;
-  HostResourceVar& operator=(const HostResourceVar&) = delete;
-
-  // ResourceVar override.
-  PP_Resource GetPPResource() const override;
-  int GetPendingRendererHostId() const override;
-  int GetPendingBrowserHostId() const override;
-  const IPC::Message* GetCreationMessage() const override;
-  bool IsPending() const override;
-
-  void set_pending_browser_host_id(int id) { pending_browser_host_id_ = id; }
-
- protected:
-  ~HostResourceVar() override;
-
- private:
-  // Real resource ID in the plugin. 0 if one has not yet been created
-  // (indicating that there is a pending resource host).
-  PP_Resource pp_resource_;
-
-  // Pending resource host ID in the renderer.
-  int pending_renderer_host_id_;
-
-  // Pending resource host ID in the browser.
-  int pending_browser_host_id_;
-
-  // If the plugin-side resource has not yet been created, carries a message to
-  // create a resource of the specific type on the plugin side. Otherwise, NULL.
-  std::unique_ptr<IPC::Message> creation_message_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_HOST_RESOURCE_VAR_H_
diff --git a/content/renderer/pepper/host_var_tracker.cc b/content/renderer/pepper/host_var_tracker.cc
deleted file mode 100644
index bcaa91d70..0000000
--- a/content/renderer/pepper/host_var_tracker.cc
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/host_var_tracker.h"
-
-#include <tuple>
-
-#include "base/check.h"
-#include "base/containers/contains.h"
-#include "base/notreached.h"
-#include "content/renderer/pepper/host_array_buffer_var.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/host_resource_var.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/v8object_var.h"
-#include "ppapi/c/pp_var.h"
-
-using ppapi::ArrayBufferVar;
-using ppapi::V8ObjectVar;
-
-namespace content {
-
-HostVarTracker::V8ObjectVarKey::V8ObjectVarKey(V8ObjectVar* object_var)
-    : instance(object_var->instance()->pp_instance()) {
-  v8::Local<v8::Object> object = object_var->GetHandle();
-  hash = object.IsEmpty() ? 0 : object->GetIdentityHash();
-}
-
-HostVarTracker::V8ObjectVarKey::V8ObjectVarKey(PP_Instance instance,
-                                               v8::Local<v8::Object> object)
-    : instance(instance),
-      hash(object.IsEmpty() ? 0 : object->GetIdentityHash()) {}
-
-HostVarTracker::V8ObjectVarKey::~V8ObjectVarKey() {}
-
-bool HostVarTracker::V8ObjectVarKey::operator<(
-    const V8ObjectVarKey& other) const {
-  return std::tie(instance, hash) < std::tie(other.instance, other.hash);
-}
-
-HostVarTracker::HostVarTracker()
-    : VarTracker(SINGLE_THREADED), last_shared_memory_map_id_(0) {}
-
-HostVarTracker::~HostVarTracker() {}
-
-ArrayBufferVar* HostVarTracker::CreateArrayBuffer(uint32_t size_in_bytes) {
-  return new HostArrayBufferVar(size_in_bytes);
-}
-
-ArrayBufferVar* HostVarTracker::CreateShmArrayBuffer(
-    uint32_t size_in_bytes,
-    base::UnsafeSharedMemoryRegion region) {
-  return new HostArrayBufferVar(size_in_bytes, region);
-}
-
-void HostVarTracker::AddV8ObjectVar(V8ObjectVar* object_var) {
-  CheckThreadingPreconditions();
-  v8::HandleScope handle_scope(object_var->instance()->GetIsolate());
-  DCHECK(GetForV8Object(object_var->instance()->pp_instance(),
-                        object_var->GetHandle()) == object_map_.end());
-  object_map_.insert(std::make_pair(V8ObjectVarKey(object_var), object_var));
-}
-
-void HostVarTracker::RemoveV8ObjectVar(V8ObjectVar* object_var) {
-  CheckThreadingPreconditions();
-  v8::HandleScope handle_scope(object_var->instance()->GetIsolate());
-  auto it = GetForV8Object(object_var->instance()->pp_instance(),
-                           object_var->GetHandle());
-  CHECK(it != object_map_.end());
-  object_map_.erase(it);
-}
-
-PP_Var HostVarTracker::V8ObjectVarForV8Object(PP_Instance instance,
-                                              v8::Local<v8::Object> object) {
-  CheckThreadingPreconditions();
-  ObjectMap::const_iterator it = GetForV8Object(instance, object);
-  if (it == object_map_.end())
-    return (new V8ObjectVar(instance, object))->GetPPVar();
-  return it->second->GetPPVar();
-}
-
-int HostVarTracker::GetLiveV8ObjectVarsForTest(PP_Instance instance) {
-  CheckThreadingPreconditions();
-  int count = 0;
-  // Use a key with an empty handle to find the v8 object var in the map with
-  // the given instance and the lowest hash.
-  V8ObjectVarKey key(instance, v8::Local<v8::Object>());
-  ObjectMap::const_iterator it = object_map_.lower_bound(key);
-  while (it != object_map_.end() && it->first.instance == instance) {
-    ++count;
-    ++it;
-  }
-  return count;
-}
-
-PP_Var HostVarTracker::MakeResourcePPVarFromMessage(
-    PP_Instance instance,
-    const IPC::Message& creation_message,
-    int pending_renderer_id,
-    int pending_browser_id) {
-  // On the host side, the creation message is ignored when creating a resource.
-  // Therefore, a call to this function indicates a null resource. Return the
-  // resource 0.
-  return MakeResourcePPVar(0);
-}
-
-ppapi::ResourceVar* HostVarTracker::MakeResourceVar(PP_Resource pp_resource) {
-  return new HostResourceVar(pp_resource);
-}
-
-void HostVarTracker::DidDeleteInstance(PP_Instance pp_instance) {
-  CheckThreadingPreconditions();
-
-  PepperPluginInstanceImpl* instance =
-      HostGlobals::Get()->GetInstance(pp_instance);
-  v8::HandleScope handle_scope(instance->GetIsolate());
-  // Force delete all var references. ForceReleaseV8Object() will cause
-  // this object, and potentially others it references, to be removed from
-  // |live_vars_|.
-
-  // Use a key with an empty handle to find the v8 object var in the map with
-  // the given instance and the lowest hash.
-  V8ObjectVarKey key(pp_instance, v8::Local<v8::Object>());
-  auto it = object_map_.lower_bound(key);
-  while (it != object_map_.end() && it->first.instance == pp_instance) {
-    ForceReleaseV8Object(it->second);
-    object_map_.erase(it++);
-  }
-}
-
-void HostVarTracker::ForceReleaseV8Object(ppapi::V8ObjectVar* object_var) {
-  object_var->InstanceDeleted();
-  auto iter = live_vars_.find(object_var->GetExistingVarID());
-  if (iter == live_vars_.end()) {
-    NOTREACHED();
-  }
-  iter->second.ref_count = 0;
-  DCHECK(iter->second.track_with_no_reference_count == 0);
-  DeleteObjectInfoIfNecessary(iter);
-}
-
-HostVarTracker::ObjectMap::iterator HostVarTracker::GetForV8Object(
-    PP_Instance instance,
-    v8::Local<v8::Object> object) {
-  std::pair<ObjectMap::iterator, ObjectMap::iterator> range =
-      object_map_.equal_range(V8ObjectVarKey(instance, object));
-
-  for (auto it = range.first; it != range.second; ++it) {
-    if (object == it->second->GetHandle())
-      return it;
-  }
-  return object_map_.end();
-}
-
-int HostVarTracker::TrackSharedMemoryRegion(
-    PP_Instance instance,
-    base::UnsafeSharedMemoryRegion region,
-    uint32_t size_in_bytes) {
-  SharedMemoryMapEntry entry;
-  entry.instance = instance;
-  entry.region = std::move(region);
-  entry.size_in_bytes = size_in_bytes;
-
-  // Find a free id for our map.
-  while (base::Contains(shared_memory_map_, last_shared_memory_map_id_)) {
-    ++last_shared_memory_map_id_;
-  }
-  shared_memory_map_[last_shared_memory_map_id_] = std::move(entry);
-  return last_shared_memory_map_id_;
-}
-
-bool HostVarTracker::StopTrackingSharedMemoryRegion(
-    int id,
-    PP_Instance instance,
-    base::UnsafeSharedMemoryRegion* region,
-    uint32_t* size_in_bytes) {
-  auto it = shared_memory_map_.find(id);
-  if (it == shared_memory_map_.end())
-    return false;
-  if (it->second.instance != instance)
-    return false;
-
-  *region = std::move(it->second.region);
-  *size_in_bytes = it->second.size_in_bytes;
-  shared_memory_map_.erase(it);
-  return true;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/host_var_tracker.h b/content/renderer/pepper/host_var_tracker.h
deleted file mode 100644
index 3a473a3..0000000
--- a/content/renderer/pepper/host_var_tracker.h
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_
-#define CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_
-
-#include <stdint.h>
-
-#include <map>
-
-#include "base/memory/raw_ptr.h"
-#include "content/common/content_export.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/shared_impl/host_resource.h"
-#include "ppapi/shared_impl/resource_tracker.h"
-#include "ppapi/shared_impl/var_tracker.h"
-#include "v8/include/v8-forward.h"
-
-namespace ppapi {
-class ArrayBufferVar;
-class V8ObjectVar;
-}
-
-namespace content {
-
-class HostVarTracker : public ppapi::VarTracker {
- public:
-  HostVarTracker();
-
-  HostVarTracker(const HostVarTracker&) = delete;
-  HostVarTracker& operator=(const HostVarTracker&) = delete;
-
-  ~HostVarTracker() override;
-
-  // Tracks all live V8ObjectVar. This is so we can map between instance +
-  // V8Object and get the V8ObjectVar corresponding to it. This Add/Remove
-  // function is called by the V8ObjectVar when it is created and destroyed.
-  void AddV8ObjectVar(ppapi::V8ObjectVar* object_var);
-  void RemoveV8ObjectVar(ppapi::V8ObjectVar* object_var);
-  // Creates or retrieves a V8ObjectVar.
-  PP_Var V8ObjectVarForV8Object(PP_Instance instance,
-                                v8::Local<v8::Object> object);
-  // Returns the number of V8ObjectVars associated with the given instance.
-  // Returns 0 if the instance isn't known.
-  CONTENT_EXPORT int GetLiveV8ObjectVarsForTest(PP_Instance instance);
-
-  // VarTracker public implementation.
-  PP_Var MakeResourcePPVarFromMessage(PP_Instance instance,
-                                      const IPC::Message& creation_message,
-                                      int pending_renderer_id,
-                                      int pending_browser_id) override;
-  ppapi::ResourceVar* MakeResourceVar(PP_Resource pp_resource) override;
-  void DidDeleteInstance(PP_Instance pp_instance) override;
-
-  int TrackSharedMemoryRegion(PP_Instance instance,
-                              base::UnsafeSharedMemoryRegion region,
-                              uint32_t size_in_bytes) override;
-  bool StopTrackingSharedMemoryRegion(int id,
-                                      PP_Instance instance,
-                                      base::UnsafeSharedMemoryRegion* region,
-                                      uint32_t* size_in_bytes) override;
-
- private:
-  // VarTracker private implementation.
-  ppapi::ArrayBufferVar* CreateArrayBuffer(uint32_t size_in_bytes) override;
-  ppapi::ArrayBufferVar* CreateShmArrayBuffer(
-      uint32_t size_in_bytes,
-      base::UnsafeSharedMemoryRegion region) override;
-
-  // Clear the reference count of the given object and remove it from
-  // live_vars_.
-  void ForceReleaseV8Object(ppapi::V8ObjectVar* object_var);
-
-  // A non-unique, ordered key for a V8ObjectVar. Contains the hash of the v8
-  // and the instance it is associated with.
-  struct V8ObjectVarKey {
-    explicit V8ObjectVarKey(ppapi::V8ObjectVar* object_var);
-    V8ObjectVarKey(PP_Instance i, v8::Local<v8::Object> object);
-    ~V8ObjectVarKey();
-
-    bool operator<(const V8ObjectVarKey& other) const;
-
-    PP_Instance instance;
-    int hash;
-  };
-  typedef std::multimap<V8ObjectVarKey,
-                        raw_ptr<ppapi::V8ObjectVar, CtnExperimental>>
-      ObjectMap;
-
-  // Returns an iterator into |object_map| which points to V8Object which
-  // is associated with the given instance and object.
-  ObjectMap::iterator GetForV8Object(PP_Instance instance,
-                                     v8::Local<v8::Object> object);
-
-
-  // A multimap of V8ObjectVarKey -> ObjectMap.
-  ObjectMap object_map_;
-
-  // Tracks all shared memory handles used for transmitting array buffers.
-  struct SharedMemoryMapEntry {
-    PP_Instance instance;
-    base::UnsafeSharedMemoryRegion region;
-    uint32_t size_in_bytes;
-  };
-  typedef std::map<int, SharedMemoryMapEntry> SharedMemoryMap;
-  SharedMemoryMap shared_memory_map_;
-  uint32_t last_shared_memory_map_id_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_HOST_VAR_TRACKER_H_
diff --git a/content/renderer/pepper/host_var_tracker_unittest.cc b/content/renderer/pepper/host_var_tracker_unittest.cc
deleted file mode 100644
index d96b4ba7..0000000
--- a/content/renderer/pepper/host_var_tracker_unittest.cc
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/host_var_tracker.h"
-
-#include <memory>
-
-#include "content/public/test/unittest_test_suite.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/mock_resource.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/pepper_try_catch.h"
-#include "content/renderer/pepper/v8_var_converter.h"
-#include "content/renderer/pepper/v8object_var.h"
-#include "content/test/ppapi_unittest.h"
-#include "gin/handle.h"
-#include "gin/wrappable.h"
-#include "ppapi/c/pp_var.h"
-#include "ppapi/c/ppp_instance.h"
-
-using ppapi::V8ObjectVar;
-
-namespace content {
-
-namespace {
-
-int g_v8objects_alive = 0;
-
-class MyObject : public gin::Wrappable<MyObject> {
- public:
-  static gin::WrapperInfo kWrapperInfo;
-
-  MyObject(const MyObject&) = delete;
-  MyObject& operator=(const MyObject&) = delete;
-
-  static v8::Local<v8::Value> Create(v8::Isolate* isolate) {
-    return gin::CreateHandle(isolate, new MyObject()).ToV8();
-  }
-
- private:
-  MyObject() { ++g_v8objects_alive; }
-  ~MyObject() override { --g_v8objects_alive; }
-};
-
-gin::WrapperInfo MyObject::kWrapperInfo = {gin::kEmbedderNativeGin};
-
-class PepperTryCatchForTest : public PepperTryCatch {
- public:
-  PepperTryCatchForTest(PepperPluginInstanceImpl* instance,
-                        V8VarConverter* converter)
-      : PepperTryCatch(instance, converter),
-        handle_scope_(instance->GetIsolate()),
-        context_scope_(v8::Context::New(instance->GetIsolate())) {}
-
-  PepperTryCatchForTest(const PepperTryCatchForTest&) = delete;
-  PepperTryCatchForTest& operator=(const PepperTryCatchForTest&) = delete;
-
-  void SetException(const char* message) override { NOTREACHED(); }
-  bool HasException() override { return false; }
-  v8::Local<v8::Context> GetContext() override {
-    return instance_->GetIsolate()->GetCurrentContext();
-  }
-
- private:
-  v8::HandleScope handle_scope_;
-  v8::Context::Scope context_scope_;
-};
-
-}  // namespace
-
-class HostVarTrackerTest : public PpapiUnittest {
- public:
-  HostVarTrackerTest() {}
-
-  void TearDown() override {
-    v8::Isolate::GetCurrent()->RequestGarbageCollectionForTesting(
-        v8::Isolate::kFullGarbageCollection);
-    EXPECT_EQ(0, g_v8objects_alive);
-    PpapiUnittest::TearDown();
-  }
-
-  HostVarTracker& tracker() { return *HostGlobals::Get()->host_var_tracker(); }
-};
-
-TEST_F(HostVarTrackerTest, DeleteObjectVarWithInstance) {
-  v8::Isolate* test_isolate = v8::Isolate::GetCurrent();
-
-  // Make a second instance (the test harness already creates & manages one).
-  scoped_refptr<PepperPluginInstanceImpl> instance2(
-      PepperPluginInstanceImpl::Create(
-          nullptr, module(), nullptr, GURL(),
-          UnitTestTestSuite::MainThreadIsolateForUnitTestSuite()));
-  PP_Instance pp_instance2 = instance2->pp_instance();
-
-  {
-    V8VarConverter converter(
-        instance2->pp_instance(), V8VarConverter::kAllowObjectVars);
-    PepperTryCatchForTest try_catch(instance2.get(), &converter);
-    // Make an object var.
-    ppapi::ScopedPPVar var = try_catch.FromV8(MyObject::Create(test_isolate));
-    EXPECT_EQ(1, g_v8objects_alive);
-    EXPECT_EQ(1, tracker().GetLiveV8ObjectVarsForTest(pp_instance2));
-    // Purposely leak the var.
-    var.Release();
-  }
-
-  // Free the instance, this should release the ObjectVar.
-  instance2 = nullptr;
-  EXPECT_EQ(0, tracker().GetLiveV8ObjectVarsForTest(pp_instance2));
-}
-
-// Make sure that using the same v8 object should give the same PP_Var
-// each time.
-TEST_F(HostVarTrackerTest, ReuseVar) {
-  V8VarConverter converter(
-      instance()->pp_instance(), V8VarConverter::kAllowObjectVars);
-  PepperTryCatchForTest try_catch(instance(), &converter);
-
-  v8::Local<v8::Value> v8_object = MyObject::Create(v8::Isolate::GetCurrent());
-  ppapi::ScopedPPVar pp_object1 = try_catch.FromV8(v8_object);
-  ppapi::ScopedPPVar pp_object2 = try_catch.FromV8(v8_object);
-
-  // The two results should be the same.
-  EXPECT_EQ(pp_object1.get().value.as_id, pp_object2.get().value.as_id);
-
-  // The objects should be able to get us back to the associated v8 object.
-  {
-    scoped_refptr<V8ObjectVar> check_object(
-        V8ObjectVar::FromPPVar(pp_object1.get()));
-    ASSERT_TRUE(check_object.get());
-    EXPECT_EQ(instance(), check_object->instance());
-    EXPECT_EQ(v8_object, check_object->GetHandle());
-  }
-
-  // Remove both of the refs we made above.
-  pp_object1 = ppapi::ScopedPPVar();
-  pp_object2 = ppapi::ScopedPPVar();
-
-  // Releasing the resource should free the internal ref, and so making a new
-  // one now should generate a new ID.
-  ppapi::ScopedPPVar pp_object3 = try_catch.FromV8(v8_object);
-  EXPECT_NE(pp_object1.get().value.as_id, pp_object3.get().value.as_id);
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/message_channel.cc b/content/renderer/pepper/message_channel.cc
deleted file mode 100644
index 072bf42..0000000
--- a/content/renderer/pepper/message_channel.cc
+++ /dev/null
@@ -1,478 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/message_channel.h"
-
-#include <cstdlib>
-#include <string>
-
-#include "base/functional/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/task/single_thread_task_runner.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/pepper_try_catch.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "content/renderer/pepper/plugin_object.h"
-#include "gin/arguments.h"
-#include "gin/converter.h"
-#include "gin/function_template.h"
-#include "gin/object_template_builder.h"
-#include "gin/public/gin_embedders.h"
-#include "ppapi/shared_impl/ppapi_globals.h"
-#include "ppapi/shared_impl/scoped_pp_var.h"
-#include "ppapi/shared_impl/var.h"
-#include "ppapi/shared_impl/var_tracker.h"
-#include "third_party/blink/public/web/web_dom_message_event.h"
-#include "third_party/blink/public/web/web_plugin_container.h"
-#include "v8/include/v8-context.h"
-#include "v8/include/v8-object.h"
-#include "v8/include/v8-template.h"
-
-using ppapi::PpapiGlobals;
-using ppapi::ScopedPPVar;
-using ppapi::StringVar;
-using blink::WebDOMMessageEvent;
-using blink::WebPluginContainer;
-using blink::WebSerializedScriptValue;
-
-namespace content {
-
-namespace {
-
-const char kPostMessage[] = "postMessage";
-const char kPostMessageAndAwaitResponse[] = "postMessageAndAwaitResponse";
-const char kV8ToVarConversionError[] =
-    "Failed to convert a PostMessage "
-    "argument from a JavaScript value to a PP_Var. It may have cycles or be of "
-    "an unsupported type.";
-const char kVarToV8ConversionError[] =
-    "Failed to convert a PostMessage "
-    "argument from a PP_Var to a Javascript value. It may have cycles or be of "
-    "an unsupported type.";
-
-}  // namespace
-
-// MessageChannel --------------------------------------------------------------
-struct MessageChannel::VarConversionResult {
-  VarConversionResult() : success_(false), conversion_completed_(false) {}
-  void ConversionCompleted(const ScopedPPVar& var,
-                           bool success) {
-    conversion_completed_ = true;
-    var_ = var;
-    success_ = success;
-  }
-  const ScopedPPVar& var() const { return var_; }
-  bool success() const { return success_; }
-  bool conversion_completed() const { return conversion_completed_; }
-
- private:
-  ScopedPPVar var_;
-  bool success_;
-  bool conversion_completed_;
-};
-
-// static
-gin::WrapperInfo MessageChannel::kWrapperInfo = {gin::kEmbedderNativeGin};
-
-// static
-MessageChannel* MessageChannel::Create(PepperPluginInstanceImpl* instance,
-                                       v8::Persistent<v8::Object>* result) {
-  MessageChannel* message_channel = new MessageChannel(instance);
-  v8::HandleScope handle_scope(instance->GetIsolate());
-  v8::Local<v8::Context> context = instance->GetMainWorldContext();
-  v8::Context::Scope context_scope(context);
-  gin::Handle<MessageChannel> handle =
-      gin::CreateHandle(instance->GetIsolate(), message_channel);
-  v8::MaybeLocal<v8::Object> object = handle.ToV8()->ToObject(context);
-  result->Reset(instance->GetIsolate(),
-                object.FromMaybe(v8::Local<v8::Object>()));
-  return message_channel;
-}
-
-MessageChannel::~MessageChannel() {
-  UnregisterSyncMessageStatusObserver();
-
-  passthrough_object_.Reset();
-  if (instance_)
-    instance_->MessageChannelDestroyed();
-}
-
-void MessageChannel::InstanceDeleted() {
-  UnregisterSyncMessageStatusObserver();
-  instance_ = nullptr;
-}
-
-void MessageChannel::PostMessageToJavaScript(PP_Var message_data) {
-  v8::Isolate* isolate = instance_->GetIsolate();
-  v8::HandleScope scope(isolate);
-
-  // Because V8 is probably not on the stack for Native->JS calls, we need to
-  // enter the appropriate context for the plugin.
-  v8::Local<v8::Context> context = instance_->GetMainWorldContext();
-  if (context.IsEmpty())
-    return;
-
-  v8::Context::Scope context_scope(context);
-
-  v8::Local<v8::Value> v8_val;
-  if (!var_converter_.ToV8Value(message_data, context, &v8_val)) {
-    PpapiGlobals::Get()->LogWithSource(instance_->pp_instance(),
-                                       PP_LOGLEVEL_ERROR,
-                                       std::string(),
-                                       kVarToV8ConversionError);
-    return;
-  }
-
-  WebSerializedScriptValue serialized_val =
-      WebSerializedScriptValue::Serialize(isolate, v8_val);
-
-  if (js_message_queue_state_ != SEND_DIRECTLY) {
-    // We can't just PostTask here; the messages would arrive out of
-    // order. Instead, we queue them up until we're ready to post
-    // them.
-    js_message_queue_.push_back(serialized_val);
-  } else {
-    // The proxy sent an asynchronous message, so the plugin is already
-    // unblocked. Therefore, there's no need to PostTask.
-    DCHECK(js_message_queue_.empty());
-    PostMessageToJavaScriptImpl(serialized_val);
-  }
-}
-
-void MessageChannel::Start() {
-  DCHECK_EQ(WAITING_TO_START, js_message_queue_state_);
-  DCHECK_EQ(WAITING_TO_START, plugin_message_queue_state_);
-
-  ppapi::proxy::HostDispatcher* dispatcher =
-      ppapi::proxy::HostDispatcher::GetForInstance(instance_->pp_instance());
-  // The dispatcher is NULL for in-process.
-  if (dispatcher) {
-    unregister_observer_callback_ =
-        dispatcher->AddSyncMessageStatusObserver(this);
-  }
-
-  // We can't drain the JS message queue directly since we haven't finished
-  // initializing the PepperWebPluginImpl yet, so the plugin isn't available in
-  // the DOM.
-  DrainJSMessageQueueSoon();
-
-  plugin_message_queue_state_ = SEND_DIRECTLY;
-  DrainCompletedPluginMessages();
-}
-
-void MessageChannel::SetPassthroughObject(v8::Local<v8::Object> passthrough) {
-  passthrough_object_.Reset(instance_->GetIsolate(), passthrough);
-}
-
-void MessageChannel::SetReadOnlyProperty(PP_Var key, PP_Var value) {
-  StringVar* key_string = StringVar::FromPPVar(key);
-  if (key_string) {
-    internal_named_properties_[key_string->value()] = ScopedPPVar(value);
-  } else {
-    NOTREACHED();
-  }
-}
-
-MessageChannel::MessageChannel(PepperPluginInstanceImpl* instance)
-    : gin::NamedPropertyInterceptor(instance->GetIsolate(), this),
-      instance_(instance),
-      js_message_queue_state_(WAITING_TO_START),
-      drain_js_message_queue_scheduled_(false),
-      blocking_message_depth_(0),
-      plugin_message_queue_state_(WAITING_TO_START),
-      var_converter_(instance->pp_instance(),
-                     V8VarConverter::kDisallowObjectVars),
-      template_cache_(instance->GetIsolate()) {}
-
-gin::ObjectTemplateBuilder MessageChannel::GetObjectTemplateBuilder(
-    v8::Isolate* isolate) {
-  return Wrappable<MessageChannel>::GetObjectTemplateBuilder(isolate)
-      .AddNamedPropertyInterceptor();
-}
-
-void MessageChannel::BeginBlockOnSyncMessage() {
-  js_message_queue_state_ = QUEUE_MESSAGES;
-  ++blocking_message_depth_;
-}
-
-void MessageChannel::EndBlockOnSyncMessage() {
-  DCHECK_GT(blocking_message_depth_, 0);
-  --blocking_message_depth_;
-  if (!blocking_message_depth_)
-    DrainJSMessageQueueSoon();
-}
-
-v8::Local<v8::Value> MessageChannel::GetNamedProperty(
-    v8::Isolate* isolate,
-    const std::string& identifier) {
-  if (!instance_)
-    return v8::Local<v8::Value>();
-
-  PepperTryCatchV8 try_catch(instance_, &var_converter_, isolate);
-  if (identifier == kPostMessage) {
-    v8::Local<v8::Context> context = isolate->GetCurrentContext();
-    return GetFunctionTemplate(isolate, identifier,
-                               &MessageChannel::PostMessageToNative)
-        ->GetFunction(context)
-        .ToLocalChecked();
-  } else if (identifier == kPostMessageAndAwaitResponse) {
-    v8::Local<v8::Context> context = isolate->GetCurrentContext();
-    return GetFunctionTemplate(isolate, identifier,
-                               &MessageChannel::PostBlockingMessageToNative)
-        ->GetFunction(context)
-        .ToLocalChecked();
-  }
-
-  std::map<std::string, ScopedPPVar>::const_iterator it =
-      internal_named_properties_.find(identifier);
-  if (it != internal_named_properties_.end()) {
-    v8::Local<v8::Value> result = try_catch.ToV8(it->second.get());
-    if (try_catch.ThrowException())
-      return v8::Local<v8::Value>();
-    return result;
-  }
-
-  PluginObject* plugin_object = GetPluginObject(isolate);
-  if (plugin_object)
-    return plugin_object->GetNamedProperty(isolate, identifier);
-  return v8::Local<v8::Value>();
-}
-
-bool MessageChannel::SetNamedProperty(v8::Isolate* isolate,
-                                      const std::string& identifier,
-                                      v8::Local<v8::Value> value) {
-  if (!instance_)
-    return false;
-  PepperTryCatchV8 try_catch(instance_, &var_converter_, isolate);
-  if (identifier == kPostMessage ||
-      identifier == kPostMessageAndAwaitResponse) {
-    try_catch.ThrowException("Cannot set properties with the name postMessage"
-                             "or postMessageAndAwaitResponse");
-    return true;
-  }
-
-  // TODO(raymes): This is only used by the gTalk plugin which is deprecated.
-  // Remove passthrough of SetProperty calls as soon as it is removed.
-  PluginObject* plugin_object = GetPluginObject(isolate);
-  if (plugin_object)
-    return plugin_object->SetNamedProperty(isolate, identifier, value);
-
-  return false;
-}
-
-std::vector<std::string> MessageChannel::EnumerateNamedProperties(
-    v8::Isolate* isolate) {
-  std::vector<std::string> result;
-  PluginObject* plugin_object = GetPluginObject(isolate);
-  if (plugin_object)
-    result = plugin_object->EnumerateNamedProperties(isolate);
-  result.push_back(kPostMessage);
-  result.push_back(kPostMessageAndAwaitResponse);
-  return result;
-}
-
-void MessageChannel::PostMessageToNative(gin::Arguments* args) {
-  if (!instance_)
-    return;
-  if (args->Length() != 1) {
-    // TODO(raymes): Consider throwing an exception here. We don't now for
-    // backward compatibility.
-    return;
-  }
-
-  v8::Local<v8::Value> message_data;
-  if (!args->GetNext(&message_data)) {
-    NOTREACHED();
-  }
-
-  EnqueuePluginMessage(args->isolate(), message_data);
-  DrainCompletedPluginMessages();
-}
-
-void MessageChannel::PostBlockingMessageToNative(gin::Arguments* args) {
-  if (!instance_)
-    return;
-  PepperTryCatchV8 try_catch(instance_, &var_converter_, args->isolate());
-  if (args->Length() != 1) {
-    try_catch.ThrowException(
-        "postMessageAndAwaitResponse requires one argument");
-    return;
-  }
-
-  v8::Local<v8::Value> message_data;
-  if (!args->GetNext(&message_data)) {
-    NOTREACHED();
-  }
-
-  if (plugin_message_queue_state_ == WAITING_TO_START) {
-    try_catch.ThrowException(
-        "Attempted to call a synchronous method on a plugin that was not "
-        "yet loaded.");
-    return;
-  }
-
-  // If the queue of messages to the plugin is non-empty, we're still waiting on
-  // pending Var conversions. This means at some point in the past, JavaScript
-  // called postMessage (the async one) and passed us something with a browser-
-  // side host (e.g., FileSystem) and we haven't gotten a response from the
-  // browser yet. We can't currently support sending a sync message if the
-  // plugin does this, because it will break the ordering of the messages
-  // arriving at the plugin.
-  // TODO(dmichael): Fix this.
-  // See https://code.google.com/p/chromium/issues/detail?id=367896#c4
-  if (!plugin_message_queue_.empty()) {
-    try_catch.ThrowException(
-        "Failed to convert parameter synchronously, because a prior "
-        "call to postMessage contained a type which required asynchronous "
-        "transfer which has not completed. Not all types are supported yet by "
-        "postMessageAndAwaitResponse. See crbug.com/367896.");
-    return;
-  }
-  ScopedPPVar param = try_catch.FromV8(message_data);
-  if (try_catch.ThrowException())
-    return;
-
-  ScopedPPVar pp_result;
-  bool was_handled = instance_->HandleBlockingMessage(param, &pp_result);
-  if (!was_handled) {
-    try_catch.ThrowException(
-        "The plugin has not registered a handler for synchronous messages. "
-        "See the documentation for PPB_Messaging::RegisterMessageHandler "
-        "and PPP_MessageHandler.");
-    return;
-  }
-  v8::Local<v8::Value> v8_result = try_catch.ToV8(pp_result.get());
-  if (try_catch.ThrowException())
-    return;
-
-  args->Return(v8_result);
-}
-
-void MessageChannel::PostMessageToJavaScriptImpl(
-    const WebSerializedScriptValue& message_data) {
-  DCHECK(instance_);
-
-  WebPluginContainer* container = instance_->container();
-  // It's possible that container() is NULL if the plugin has been removed from
-  // the DOM (but the PluginInstance is not destroyed yet).
-  if (!container)
-    return;
-
-  // [*] Note that the |origin| is only specified for cross-document and server-
-  //     sent messages, while |source| is only specified for cross-document
-  //     messages:
-  //      http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html
-  //     This currently behaves like Web Workers. On Firefox, Chrome, and Safari
-  //     at least, postMessage on Workers does not provide the origin or source.
-  //     TODO(dmichael):  Add origin if we change to a more iframe-like origin
-  //                      policy (see crbug.com/81537)
-  WebDOMMessageEvent msg_event(message_data);
-  container->EnqueueMessageEvent(msg_event);
-}
-
-PluginObject* MessageChannel::GetPluginObject(v8::Isolate* isolate) {
-  return PluginObject::FromV8Object(isolate,
-      v8::Local<v8::Object>::New(isolate, passthrough_object_));
-}
-
-void MessageChannel::EnqueuePluginMessage(v8::Isolate* isolate,
-                                          v8::Local<v8::Value> v8_value) {
-  plugin_message_queue_.push_back(VarConversionResult());
-  // Convert the v8 value in to an appropriate PP_Var like Dictionary,
-  // Array, etc. (We explicitly don't want an "Object" PP_Var, which we don't
-  // support for Messaging.)
-  // TODO(raymes): Possibly change this to use TryCatch to do the conversion and
-  // throw an exception if necessary.
-  V8VarConverter::VarResult conversion_result = var_converter_.FromV8Value(
-      v8_value, isolate->GetCurrentContext(),
-      base::BindOnce(&MessageChannel::FromV8ValueComplete,
-                     weak_ptr_factory_.GetWeakPtr(),
-                     &plugin_message_queue_.back()));
-  if (conversion_result.completed_synchronously) {
-    plugin_message_queue_.back().ConversionCompleted(
-        conversion_result.var,
-        conversion_result.success);
-  }
-}
-
-void MessageChannel::FromV8ValueComplete(VarConversionResult* result_holder,
-                                         const ScopedPPVar& result,
-                                         bool success) {
-  if (!instance_)
-    return;
-  result_holder->ConversionCompleted(result, success);
-  DrainCompletedPluginMessages();
-}
-
-void MessageChannel::DrainCompletedPluginMessages() {
-  DCHECK(instance_);
-  if (plugin_message_queue_state_ == WAITING_TO_START)
-    return;
-
-  while (!plugin_message_queue_.empty() &&
-         plugin_message_queue_.front().conversion_completed()) {
-    const VarConversionResult& front = plugin_message_queue_.front();
-    if (front.success()) {
-      instance_->HandleMessage(front.var());
-    } else {
-      PpapiGlobals::Get()->LogWithSource(instance()->pp_instance(),
-                                         PP_LOGLEVEL_ERROR,
-                                         std::string(),
-                                         kV8ToVarConversionError);
-    }
-    plugin_message_queue_.pop_front();
-  }
-}
-
-void MessageChannel::DrainJSMessageQueue() {
-  DCHECK(drain_js_message_queue_scheduled_);
-  drain_js_message_queue_scheduled_ = false;
-
-  if (!instance_)
-    return;
-  if (js_message_queue_state_ == SEND_DIRECTLY)
-    return;
-
-  // Take a reference on the PluginInstance. This is because JavaScript code
-  // may delete the plugin, which would destroy the PluginInstance and its
-  // corresponding MessageChannel.
-  scoped_refptr<PepperPluginInstanceImpl> instance_ref(instance_.get());
-  while (!js_message_queue_.empty()) {
-    PostMessageToJavaScriptImpl(js_message_queue_.front());
-    js_message_queue_.pop_front();
-  }
-  js_message_queue_state_ = SEND_DIRECTLY;
-}
-
-void MessageChannel::DrainJSMessageQueueSoon() {
-  if (drain_js_message_queue_scheduled_)
-    return;
-
-  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-      FROM_HERE, base::BindOnce(&MessageChannel::DrainJSMessageQueue,
-                                weak_ptr_factory_.GetWeakPtr()));
-  drain_js_message_queue_scheduled_ = true;
-}
-
-void MessageChannel::UnregisterSyncMessageStatusObserver() {
-  if (unregister_observer_callback_)
-    std::move(unregister_observer_callback_).Run();
-}
-
-v8::Local<v8::FunctionTemplate> MessageChannel::GetFunctionTemplate(
-    v8::Isolate* isolate,
-    const std::string& name,
-    void (MessageChannel::*member_func_ptr)(gin::Arguments* args)) {
-  v8::Local<v8::FunctionTemplate> function_template = template_cache_.Get(name);
-  if (!function_template.IsEmpty())
-    return function_template;
-  function_template = gin::CreateFunctionTemplate(
-      isolate,
-      base::BindRepeating(member_func_ptr, weak_ptr_factory_.GetWeakPtr()));
-  template_cache_.Set(name, function_template);
-  return function_template;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/message_channel.h b/content/renderer/pepper/message_channel.h
deleted file mode 100644
index f60b1e7..0000000
--- a/content/renderer/pepper/message_channel.h
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_MESSAGE_CHANNEL_H_
-#define CONTENT_RENDERER_PEPPER_MESSAGE_CHANNEL_H_
-
-#include <list>
-#include <map>
-
-#include "base/containers/circular_deque.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "content/renderer/pepper/v8_var_converter.h"
-#include "gin/handle.h"
-#include "gin/interceptor.h"
-#include "gin/wrappable.h"
-#include "ppapi/proxy/host_dispatcher.h"
-#include "ppapi/shared_impl/resource.h"
-#include "third_party/blink/public/web/web_serialized_script_value.h"
-#include "v8/include/v8-forward.h"
-#include "v8/include/v8-persistent-handle.h"
-#include "v8/include/v8-util.h"
-
-struct PP_Var;
-
-namespace gin {
-class Arguments;
-}  // namespace gin
-
-namespace ppapi {
-class ScopedPPVar;
-}  // namespace ppapi
-
-namespace content {
-
-class PepperPluginInstanceImpl;
-class PluginObject;
-
-// MessageChannel implements bidirectional postMessage functionality, allowing
-// calls from JavaScript to plugins and vice-versa. See
-// PPB_Messaging::PostMessage and PPP_Messaging::HandleMessage for more
-// information.
-//
-// Currently, only 1 MessageChannel can exist, to implement postMessage
-// functionality for the instance interfaces.  In the future, when we create a
-// MessagePort type in PPAPI, those may be implemented here as well with some
-// refactoring.
-//   - Separate message ports won't require the passthrough object.
-//   - The message target won't be limited to instance, and should support
-//     either plugin-provided or JS objects.
-// TODO(dmichael):  Add support for separate MessagePorts.
-class MessageChannel :
-    public gin::Wrappable<MessageChannel>,
-    public gin::NamedPropertyInterceptor,
-    public ppapi::proxy::HostDispatcher::SyncMessageStatusObserver {
- public:
-  static gin::WrapperInfo kWrapperInfo;
-
-  // Creates a MessageChannel, returning a pointer to it and sets |result| to
-  // the v8 object which is backed by the message channel. The returned pointer
-  // is only valid as long as the object in |result| is alive.
-  static MessageChannel* Create(PepperPluginInstanceImpl* instance,
-                                v8::Persistent<v8::Object>* result);
-
-  MessageChannel(const MessageChannel&) = delete;
-  MessageChannel& operator=(const MessageChannel&) = delete;
-
-  ~MessageChannel() override;
-
-  // Called when the instance is deleted. The MessageChannel might outlive the
-  // plugin instance because it is garbage collected.
-  void InstanceDeleted();
-
-  // Post a message to the onmessage handler for this channel's instance
-  // asynchronously.
-  void PostMessageToJavaScript(PP_Var message_data);
-
-  // Messages are queued initially. After the PepperPluginInstanceImpl is ready
-  // to send and handle messages, users of MessageChannel should call
-  // Start().
-  void Start();
-
-  // Set the V8Object to which we should forward any calls which aren't
-  // related to postMessage. Note that this can be empty; it only gets set if
-  // there is a scriptable 'InstanceObject' associated with this channel's
-  // instance.
-  void SetPassthroughObject(v8::Local<v8::Object> passthrough);
-
-  PepperPluginInstanceImpl* instance() { return instance_; }
-
-  void SetReadOnlyProperty(PP_Var key, PP_Var value);
-
- private:
-  // Struct for storing the result of a v8 object being converted to a PP_Var.
-  struct VarConversionResult;
-
-  explicit MessageChannel(PepperPluginInstanceImpl* instance);
-
-  // gin::NamedPropertyInterceptor
-  v8::Local<v8::Value> GetNamedProperty(v8::Isolate* isolate,
-                                        const std::string& property) override;
-  bool SetNamedProperty(v8::Isolate* isolate,
-                        const std::string& property,
-                        v8::Local<v8::Value> value) override;
-  std::vector<std::string> EnumerateNamedProperties(
-      v8::Isolate* isolate) override;
-
-  // gin::Wrappable
-  gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
-      v8::Isolate* isolate) override;
-
-  // ppapi::proxy::HostDispatcher::SyncMessageStatusObserver
-  void BeginBlockOnSyncMessage() override;
-  void EndBlockOnSyncMessage() override;
-
-  // Post a message to the plugin's HandleMessage function for this channel's
-  // instance.
-  void PostMessageToNative(gin::Arguments* args);
-  // Post a message to the plugin's HandleBlocking Message function for this
-  // channel's instance synchronously, and return a result.
-  void PostBlockingMessageToNative(gin::Arguments* args);
-
-  // Post a message to the onmessage handler for this channel's instance
-  // synchronously.  This is used by PostMessageToJavaScript.
-  void PostMessageToJavaScriptImpl(
-      const blink::WebSerializedScriptValue& message_data);
-
-  PluginObject* GetPluginObject(v8::Isolate* isolate);
-
-  void EnqueuePluginMessage(v8::Isolate* isolate,
-                            v8::Local<v8::Value> v8_value);
-
-  void FromV8ValueComplete(VarConversionResult* result_holder,
-                           const ppapi::ScopedPPVar& result_var,
-                           bool success);
-
-  // Drain the queue of messages that are going to the plugin. All "completed"
-  // messages at the head of the queue will be sent; any messages awaiting
-  // conversion as well as messages after that in the queue will not be sent.
-  void DrainCompletedPluginMessages();
-  // Drain the queue of messages that are going to JavaScript.
-  void DrainJSMessageQueue();
-  // PostTask to call DrainJSMessageQueue() soon. Use this when you want to
-  // send the messages, but can't immediately (e.g., because the instance is
-  // not ready or JavaScript is on the stack).
-  void DrainJSMessageQueueSoon();
-
-  void UnregisterSyncMessageStatusObserver();
-
-  v8::Local<v8::FunctionTemplate> GetFunctionTemplate(
-      v8::Isolate* isolate,
-      const std::string& name,
-      void (MessageChannel::*memberFuncPtr)(gin::Arguments* args));
-
-  raw_ptr<PepperPluginInstanceImpl> instance_;
-
-  // We pass all non-postMessage calls through to the passthrough_object_.
-  // This way, a plugin can use PPB_Class or PPP_Class_Deprecated and also
-  // postMessage.  This is necessary to support backwards-compatibility, and
-  // also trusted plugins for which we will continue to support synchronous
-  // scripting.
-  v8::Persistent<v8::Object> passthrough_object_;
-
-  enum MessageQueueState {
-    WAITING_TO_START,  // Waiting for Start() to be called. Queue messages.
-    QUEUE_MESSAGES,  // Queue messages temporarily.
-    SEND_DIRECTLY,   // Post messages directly.
-  };
-
-  // This queue stores values being posted to JavaScript.
-  base::circular_deque<blink::WebSerializedScriptValue> js_message_queue_;
-  MessageQueueState js_message_queue_state_;
-
-  // True if there is already a posted task to drain the JS message queue.
-  bool drain_js_message_queue_scheduled_;
-
-  // When the renderer is sending a blocking message to the plugin, we will
-  // queue Plugin->JS messages temporarily to avoid re-entering JavaScript. This
-  // counts how many blocking renderer->plugin messages are on the stack so that
-  // we only begin sending messages to JavaScript again when the depth reaches
-  // zero.
-  int blocking_message_depth_;
-
-  // This queue stores vars that are being sent to the plugin. Because
-  // conversion can happen asynchronously for object types, the queue stores
-  // the var until all previous vars have been converted and sent. This
-  // preserves the order in which JS->plugin messages are processed.
-  //
-  // Note we rely on raw VarConversionResult* pointers remaining valid after
-  // calls to push_back or pop_front; hence why we're using list. (deque would
-  // probably also work, but is less clearly specified).
-  std::list<VarConversionResult> plugin_message_queue_;
-  MessageQueueState plugin_message_queue_state_;
-
-  std::map<std::string, ppapi::ScopedPPVar> internal_named_properties_;
-
-  V8VarConverter var_converter_;
-
-  // A callback to invoke at shutdown to ensure we unregister ourselves as
-  // Observers for sync messages.
-  base::OnceClosure unregister_observer_callback_;
-
-  v8::StdGlobalValueMap<std::string, v8::FunctionTemplate> template_cache_;
-
-  // This is used to ensure pending tasks will not fire after this object is
-  // destroyed.
-  base::WeakPtrFactory<MessageChannel> weak_ptr_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_MESSAGE_CHANNEL_H_
diff --git a/content/renderer/pepper/mock_renderer_ppapi_host.cc b/content/renderer/pepper/mock_renderer_ppapi_host.cc
deleted file mode 100644
index 402d7c0..0000000
--- a/content/renderer/pepper/mock_renderer_ppapi_host.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/mock_renderer_ppapi_host.h"
-
-#include "base/notimplemented.h"
-#include "content/renderer/pepper/fake_pepper_plugin_instance.h"
-#include "ui/gfx/geometry/point.h"
-
-namespace content {
-
-MockRendererPpapiHost::MockRendererPpapiHost(RenderFrame* render_frame,
-                                             PP_Instance instance)
-    : sink_(),
-      ppapi_host_(&sink_, ppapi::PpapiPermissions()),
-      render_frame_(render_frame),
-      pp_instance_(instance),
-      has_user_gesture_(false),
-      plugin_instance_(new FakePepperPluginInstance) {}
-
-MockRendererPpapiHost::~MockRendererPpapiHost() {}
-
-ppapi::host::PpapiHost* MockRendererPpapiHost::GetPpapiHost() {
-  return &ppapi_host_;
-}
-
-bool MockRendererPpapiHost::IsValidInstance(PP_Instance instance) {
-  return instance == pp_instance_;
-}
-
-PepperPluginInstance* MockRendererPpapiHost::GetPluginInstance(
-    PP_Instance instance) {
-  return plugin_instance_.get();
-}
-
-RenderFrame* MockRendererPpapiHost::GetRenderFrameForInstance(
-    PP_Instance instance) {
-  if (instance == pp_instance_)
-    return render_frame_;
-  return nullptr;
-}
-
-blink::WebPluginContainer* MockRendererPpapiHost::GetContainerForInstance(
-    PP_Instance instance) {
-  NOTIMPLEMENTED();
-  return nullptr;
-}
-
-bool MockRendererPpapiHost::HasUserGesture(PP_Instance instance) {
-  return has_user_gesture_;
-}
-
-int MockRendererPpapiHost::GetRoutingIDForFrame(PP_Instance instance) {
-  return 0;
-}
-
-gfx::Point MockRendererPpapiHost::PluginPointToRenderFrame(
-    PP_Instance instance,
-    const gfx::Point& pt) {
-  return gfx::Point();
-}
-
-IPC::PlatformFileForTransit MockRendererPpapiHost::ShareHandleWithRemote(
-    base::PlatformFile handle,
-    bool should_close_source) {
-  NOTIMPLEMENTED();
-  return IPC::InvalidPlatformFileForTransit();
-}
-
-base::UnsafeSharedMemoryRegion
-MockRendererPpapiHost::ShareUnsafeSharedMemoryRegionWithRemote(
-    const base::UnsafeSharedMemoryRegion& region) {
-  NOTIMPLEMENTED();
-  return base::UnsafeSharedMemoryRegion();
-}
-
-base::ReadOnlySharedMemoryRegion
-MockRendererPpapiHost::ShareReadOnlySharedMemoryRegionWithRemote(
-    const base::ReadOnlySharedMemoryRegion& region) {
-  NOTIMPLEMENTED();
-  return base::ReadOnlySharedMemoryRegion();
-}
-
-bool MockRendererPpapiHost::IsRunningInProcess() {
-  return false;
-}
-
-std::string MockRendererPpapiHost::GetPluginName() {
-  return std::string();
-}
-
-void MockRendererPpapiHost::SetToExternalPluginHost() {
-  NOTIMPLEMENTED();
-}
-
-void MockRendererPpapiHost::CreateBrowserResourceHosts(
-    PP_Instance instance,
-    const std::vector<IPC::Message>& nested_msgs,
-    base::OnceCallback<void(const std::vector<int>&)> callback) {
-  std::move(callback).Run(std::vector<int>(nested_msgs.size(), 0));
-  return;
-}
-
-GURL MockRendererPpapiHost::GetDocumentURL(PP_Instance instance) {
-  NOTIMPLEMENTED();
-  return GURL();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/mock_renderer_ppapi_host.h b/content/renderer/pepper/mock_renderer_ppapi_host.h
deleted file mode 100644
index b213306..0000000
--- a/content/renderer/pepper/mock_renderer_ppapi_host.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_MOCK_RENDERER_PPAPI_HOST_H_
-#define CONTENT_RENDERER_PEPPER_MOCK_RENDERER_PPAPI_HOST_H_
-
-#include <memory>
-
-#include "base/memory/raw_ptr.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/content_renderer_pepper_host_factory.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/resource_message_test_sink.h"
-
-namespace content {
-class FakePepperPluginInstance;
-
-// A mock RendererPpapiHost for testing resource hosts. Messages sent by
-// resources through this will get added to the test sink.
-class MockRendererPpapiHost : public RendererPpapiHost {
- public:
-  // This function takes the RenderFrame and instance that the mock
-  // resource host will be associated with.
-  MockRendererPpapiHost(RenderFrame* render_frame, PP_Instance instance);
-
-  MockRendererPpapiHost(const MockRendererPpapiHost&) = delete;
-  MockRendererPpapiHost& operator=(const MockRendererPpapiHost&) = delete;
-
-  ~MockRendererPpapiHost() override;
-
-  ppapi::proxy::ResourceMessageTestSink& sink() { return sink_; }
-  PP_Instance pp_instance() const { return pp_instance_; }
-
-  // Sets whether there is currently a user gesture. Defaults to false.
-  void set_has_user_gesture(bool gesture) { has_user_gesture_ = gesture; }
-
-  // RendererPpapiHost.
-  ppapi::host::PpapiHost* GetPpapiHost() override;
-  bool IsValidInstance(PP_Instance instance) override;
-  PepperPluginInstance* GetPluginInstance(PP_Instance instance) override;
-  RenderFrame* GetRenderFrameForInstance(PP_Instance instance) override;
-  blink::WebPluginContainer* GetContainerForInstance(
-      PP_Instance instance) override;
-  bool HasUserGesture(PP_Instance instance) override;
-  int GetRoutingIDForFrame(PP_Instance instance) override;
-  gfx::Point PluginPointToRenderFrame(PP_Instance instance,
-                                      const gfx::Point& pt) override;
-  IPC::PlatformFileForTransit ShareHandleWithRemote(
-      base::PlatformFile handle,
-      bool should_close_source) override;
-  base::UnsafeSharedMemoryRegion ShareUnsafeSharedMemoryRegionWithRemote(
-      const base::UnsafeSharedMemoryRegion& region) override;
-  base::ReadOnlySharedMemoryRegion ShareReadOnlySharedMemoryRegionWithRemote(
-      const base::ReadOnlySharedMemoryRegion& region) override;
-  bool IsRunningInProcess() override;
-  std::string GetPluginName() override;
-  void SetToExternalPluginHost() override;
-  void CreateBrowserResourceHosts(
-      PP_Instance instance,
-      const std::vector<IPC::Message>& nested_msgs,
-      base::OnceCallback<void(const std::vector<int>&)> callback) override;
-  GURL GetDocumentURL(PP_Instance instance) override;
-
- private:
-  ppapi::proxy::ResourceMessageTestSink sink_;
-  ppapi::host::PpapiHost ppapi_host_;
-
-  raw_ptr<RenderFrame> render_frame_;
-  PP_Instance pp_instance_;
-
-  bool has_user_gesture_;
-
-  std::unique_ptr<FakePepperPluginInstance> plugin_instance_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_MOCK_RENDERER_PPAPI_HOST_H_
diff --git a/content/renderer/pepper/mock_resource.h b/content/renderer/pepper/mock_resource.h
deleted file mode 100644
index 38b055a..0000000
--- a/content/renderer/pepper/mock_resource.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_MOCK_RESOURCE_H_
-#define CONTENT_RENDERER_PEPPER_MOCK_RESOURCE_H_
-
-#include "ppapi/shared_impl/resource.h"
-
-namespace content {
-
-// Tests can derive from this to implement special test-specific resources.
-// It's assumed that a test will only need one mock resource, so it can
-// static_cast to get its own implementation.
-class MockResource : public ppapi::Resource {
- public:
-  MockResource(PP_Instance instance)
-      : Resource(ppapi::OBJECT_IS_IMPL, instance) {}
-
- private:
-  ~MockResource() override {}
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_MOCK_RESOURCE_H_
diff --git a/content/renderer/pepper/pepper_audio_controller.cc b/content/renderer/pepper/pepper_audio_controller.cc
deleted file mode 100644
index 20cb47b1..0000000
--- a/content/renderer/pepper/pepper_audio_controller.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2016 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_audio_controller.h"
-
-#include "content/renderer/pepper/pepper_audio_output_host.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/ppb_audio_impl.h"
-
-namespace content {
-
-PepperAudioController::PepperAudioController(
-    PepperPluginInstanceImpl* instance)
-    : instance_(instance) {
-  DCHECK(instance_);
-}
-
-PepperAudioController::~PepperAudioController() {
-  if (instance_)
-    OnPepperInstanceDeleted();
-}
-
-void PepperAudioController::AddInstance(PPB_Audio_Impl* audio) {
-  if (!instance_)
-    return;
-  if (ppb_audios_.count(audio))
-    return;
-
-  StartPlaybackIfFirstInstance();
-
-  ppb_audios_.insert(audio);
-}
-
-void PepperAudioController::AddInstance(PepperAudioOutputHost* audio_output) {
-  if (!instance_)
-    return;
-  if (audio_output_hosts_.count(audio_output))
-    return;
-
-  StartPlaybackIfFirstInstance();
-
-  audio_output_hosts_.insert(audio_output);
-}
-
-void PepperAudioController::RemoveInstance(PPB_Audio_Impl* audio) {
-  if (!instance_)
-    return;
-  if (!ppb_audios_.count(audio))
-    return;
-
-  ppb_audios_.erase(audio);
-
-  StopPlaybackIfLastInstance();
-}
-
-void PepperAudioController::RemoveInstance(
-    PepperAudioOutputHost* audio_output) {
-  if (!instance_)
-    return;
-  if (!audio_output_hosts_.count(audio_output))
-    return;
-
-  audio_output_hosts_.erase(audio_output);
-
-  StopPlaybackIfLastInstance();
-}
-
-void PepperAudioController::SetVolume(double volume) {
-  if (!instance_)
-    return;
-
-  for (PPB_Audio_Impl* ppb_audio : ppb_audios_) {
-    ppb_audio->SetVolume(volume);
-  }
-
-  for (PepperAudioOutputHost* audio_output_host : audio_output_hosts_) {
-    audio_output_host->SetVolume(volume);
-  }
-}
-
-void PepperAudioController::OnPepperInstanceDeleted() {
-  DCHECK(instance_);
-
-  if (!audio_output_hosts_.empty() || !ppb_audios_.empty())
-    NotifyPlaybackStopsOnEmpty();
-
-  ppb_audios_.clear();
-  audio_output_hosts_.clear();
-  instance_ = nullptr;
-}
-
-void PepperAudioController::NotifyPlaybackStopsOnEmpty() {
-  DCHECK(instance_);
-
-  mojom::PepperPluginInstanceHost* instance_host =
-      instance_->GetPepperPluginInstanceHost();
-  if (instance_host)
-    instance_host->StopsPlayback();
-}
-
-void PepperAudioController::StartPlaybackIfFirstInstance() {
-  DCHECK(instance_);
-
-  if (audio_output_hosts_.empty() && ppb_audios_.empty()) {
-    mojom::PepperPluginInstanceHost* instance_host =
-        instance_->GetPepperPluginInstanceHost();
-    if (instance_host)
-      instance_host->StartsPlayback();
-  }
-}
-
-void PepperAudioController::StopPlaybackIfLastInstance() {
-  DCHECK(instance_);
-
-  if (audio_output_hosts_.empty() && ppb_audios_.empty())
-    NotifyPlaybackStopsOnEmpty();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_audio_controller.h b/content/renderer/pepper/pepper_audio_controller.h
deleted file mode 100644
index 8327033..0000000
--- a/content/renderer/pepper/pepper_audio_controller.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2016 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_CONTROLLER_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_CONTROLLER_H_
-
-#include <set>
-
-#include "base/memory/raw_ptr.h"
-
-namespace content {
-
-class PepperAudioOutputHost;
-class PepperPluginInstanceImpl;
-class PPB_Audio_Impl;
-
-/**
- * This class controls all the active audio instances of a Pepper instance.
- * This class can only be a non-shareable member of PepperPluginInstanceImpl.
- */
-class PepperAudioController {
- public:
-  explicit PepperAudioController(PepperPluginInstanceImpl* instance);
-
-  PepperAudioController(const PepperAudioController&) = delete;
-  PepperAudioController& operator=(const PepperAudioController&) = delete;
-
-  virtual ~PepperAudioController();
-
-  // Adds an audio instance to the controller.
-  void AddInstance(PPB_Audio_Impl* audio);
-  void AddInstance(PepperAudioOutputHost* audio_output);
-
-  // Removes an audio instance from the controller.
-  void RemoveInstance(PPB_Audio_Impl* audio);
-  void RemoveInstance(PepperAudioOutputHost* audio_output);
-
-  // Sets the volume of all audio instances.
-  void SetVolume(double volume);
-
-  // The pepper instance has been deleted. This method can only be called
-  // once. The controller will be invalidated after this call, and then all
-  // other methods will be no-op.
-  void OnPepperInstanceDeleted();
-
- private:
-  // Notifies the RenderFrame that the playback has stopped.  This method should
-  // only be called when |ppb_audios_| turns from non-empty to empty.
-  void NotifyPlaybackStopsOnEmpty();
-
-  // Helper functions to deal with the first and last audio instance.
-  void StartPlaybackIfFirstInstance();
-  void StopPlaybackIfLastInstance();
-
-  // All active audio instances that are using the old
-  // PPB_Audio interface.
-  std::set<raw_ptr<PPB_Audio_Impl, SetExperimental>> ppb_audios_;
-
-  // All active audio output instances that are using the new
-  // PPB_AudioOutput interface.
-  std::set<raw_ptr<PepperAudioOutputHost, SetExperimental>> audio_output_hosts_;
-
-  // The Pepper instance which this controller is for. Will be null after
-  // OnPepperInstanceDeleted() is called.
-  raw_ptr<PepperPluginInstanceImpl> instance_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_CONTROLLER_H_
diff --git a/content/renderer/pepper/pepper_audio_encoder_host.cc b/content/renderer/pepper/pepper_audio_encoder_host.cc
deleted file mode 100644
index 52d050c7..0000000
--- a/content/renderer/pepper/pepper_audio_encoder_host.cc
+++ /dev/null
@@ -1,504 +0,0 @@
-// Copyright 2015 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_audio_encoder_host.h"
-
-#include <stddef.h>
-
-#include <utility>
-
-#include "base/containers/heap_array.h"
-#include "base/functional/bind.h"
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "base/task/bind_post_task.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/render_thread_impl.h"
-#include "ppapi/c/pp_codecs.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/shared_impl/media_stream_buffer.h"
-#include "third_party/opus/src/include/opus.h"
-
-using ppapi::proxy::SerializedHandle;
-
-namespace content {
-
-namespace {
-
-// Buffer up to 150ms (15 x 10ms per frame).
-const uint32_t kDefaultNumberOfAudioBuffers = 15;
-
-bool PP_HardwareAccelerationCompatibleAudio(bool accelerated,
-                                            PP_HardwareAcceleration requested) {
-  switch (requested) {
-    case PP_HARDWAREACCELERATION_ONLY:
-      return accelerated;
-    case PP_HARDWAREACCELERATION_NONE:
-      return !accelerated;
-    case PP_HARDWAREACCELERATION_WITHFALLBACK:
-      return true;
-      // No default case, to catch unhandled PP_HardwareAcceleration values.
-  }
-  return false;
-}
-
-}  // namespace
-
-// This class should be constructed and initialized on the main renderer
-// thread, used and destructed on the media thread.
-class PepperAudioEncoderHost::AudioEncoderImpl {
- public:
-  // Callback used to signal encoded data. If |size| is negative, an error
-  // occurred.
-  using BitstreamBufferReadyCB = base::OnceCallback<void(int32_t size)>;
-
-  AudioEncoderImpl();
-
-  AudioEncoderImpl(const AudioEncoderImpl&) = delete;
-  AudioEncoderImpl& operator=(const AudioEncoderImpl&) = delete;
-
-  ~AudioEncoderImpl();
-
-  // Used on the renderer thread.
-  static std::vector<PP_AudioProfileDescription> GetSupportedProfiles();
-  bool Initialize(const ppapi::proxy::PPB_AudioEncodeParameters& parameters);
-  int32_t GetNumberOfSamplesPerFrame();
-
-  // Used on the media thread.
-  void Encode(uint8_t* input_data,
-              size_t input_size,
-              uint8_t* output_data,
-              size_t output_size,
-              BitstreamBufferReadyCB callback);
-  void RequestBitrateChange(uint32_t bitrate);
-
- private:
-  base::HeapArray<uint8_t> encoder_memory_;
-  OpusEncoder* opus_encoder_;
-
-  // Initialization parameters, only valid if |encoder_memory_| is not
-  // nullptr.
-  ppapi::proxy::PPB_AudioEncodeParameters parameters_;
-};
-
-PepperAudioEncoderHost::AudioEncoderImpl::AudioEncoderImpl()
-    : opus_encoder_(nullptr) {}
-
-PepperAudioEncoderHost::AudioEncoderImpl::~AudioEncoderImpl() {}
-
-// static
-std::vector<PP_AudioProfileDescription>
-PepperAudioEncoderHost::AudioEncoderImpl::GetSupportedProfiles() {
-  std::vector<PP_AudioProfileDescription> profiles;
-  static const uint32_t sampling_rates[] = {8000, 12000, 16000, 24000, 48000};
-
-  for (uint32_t i = 0; i < std::size(sampling_rates); ++i) {
-    PP_AudioProfileDescription profile;
-    profile.profile = PP_AUDIOPROFILE_OPUS;
-    profile.max_channels = 2;
-    profile.sample_size = PP_AUDIOBUFFER_SAMPLESIZE_16_BITS;
-    profile.sample_rate = sampling_rates[i];
-    profile.hardware_accelerated = PP_FALSE;
-    profiles.push_back(profile);
-  }
-  return profiles;
-}
-
-bool PepperAudioEncoderHost::AudioEncoderImpl::Initialize(
-    const ppapi::proxy::PPB_AudioEncodeParameters& parameters) {
-  if (parameters.output_profile != PP_AUDIOPROFILE_OPUS)
-    return false;
-
-  DCHECK(encoder_memory_.empty());
-
-  int32_t encoder_size = opus_encoder_get_size(parameters.channels);
-  if (encoder_size < 1)
-    return false;
-
-  auto encoder_memory = base::HeapArray<uint8_t>::Uninit(encoder_size);
-  opus_encoder_ = reinterpret_cast<OpusEncoder*>(encoder_memory.data());
-
-  if (opus_encoder_init(opus_encoder_, parameters.input_sample_rate,
-                        parameters.channels, OPUS_APPLICATION_AUDIO) != OPUS_OK)
-    return false;
-
-  if (opus_encoder_ctl(opus_encoder_,
-                       OPUS_SET_BITRATE(parameters.initial_bitrate <= 0
-                                            ? OPUS_AUTO
-                                            : parameters.initial_bitrate)) !=
-      OPUS_OK)
-    return false;
-
-  encoder_memory_ = std::move(encoder_memory);
-  parameters_ = parameters;
-
-  return true;
-}
-
-int32_t PepperAudioEncoderHost::AudioEncoderImpl::GetNumberOfSamplesPerFrame() {
-  DCHECK(!encoder_memory_.empty());
-  // Opus supports 2.5, 5, 10, 20, 40 or 60ms audio frames. We take
-  // 10ms by default.
-  return parameters_.input_sample_rate / 100;
-}
-
-void PepperAudioEncoderHost::AudioEncoderImpl::Encode(
-    uint8_t* input_data,
-    size_t input_size,
-    uint8_t* output_data,
-    size_t output_size,
-    BitstreamBufferReadyCB callback) {
-  DCHECK(!encoder_memory_.empty());
-  int32_t result = opus_encode(
-      opus_encoder_, reinterpret_cast<opus_int16*>(input_data),
-      (input_size / parameters_.channels) / parameters_.input_sample_size,
-      output_data, output_size);
-  std::move(callback).Run(result);
-}
-
-void PepperAudioEncoderHost::AudioEncoderImpl::RequestBitrateChange(
-    uint32_t bitrate) {
-  DCHECK(!encoder_memory_.empty());
-  opus_encoder_ctl(opus_encoder_, OPUS_SET_BITRATE(bitrate));
-}
-
-PepperAudioEncoderHost::PepperAudioEncoderHost(RendererPpapiHost* host,
-                                               PP_Instance instance,
-                                               PP_Resource resource)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      renderer_ppapi_host_(host),
-      initialized_(false),
-      encoder_last_error_(PP_ERROR_FAILED),
-      media_task_runner_(
-          RenderThreadImpl::current()->GetMediaThreadTaskRunner()) {}
-
-PepperAudioEncoderHost::~PepperAudioEncoderHost() {
-  Close();
-}
-
-int32_t PepperAudioEncoderHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    ppapi::host::HostMessageContext* context) {
-  PPAPI_BEGIN_MESSAGE_MAP(PepperAudioEncoderHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(
-        PpapiHostMsg_AudioEncoder_GetSupportedProfiles,
-        OnHostMsgGetSupportedProfiles)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_AudioEncoder_Initialize,
-                                      OnHostMsgInitialize)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_AudioEncoder_Encode,
-                                      OnHostMsgEncode)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(
-        PpapiHostMsg_AudioEncoder_RecycleBitstreamBuffer,
-        OnHostMsgRecycleBitstreamBuffer)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(
-        PpapiHostMsg_AudioEncoder_RequestBitrateChange,
-        OnHostMsgRequestBitrateChange)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_AudioEncoder_Close,
-                                        OnHostMsgClose)
-  PPAPI_END_MESSAGE_MAP()
-  return PP_ERROR_FAILED;
-}
-
-int32_t PepperAudioEncoderHost::OnHostMsgGetSupportedProfiles(
-    ppapi::host::HostMessageContext* context) {
-  std::vector<PP_AudioProfileDescription> profiles;
-  GetSupportedProfiles(&profiles);
-
-  host()->SendReply(
-      context->MakeReplyMessageContext(),
-      PpapiPluginMsg_AudioEncoder_GetSupportedProfilesReply(profiles));
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperAudioEncoderHost::OnHostMsgInitialize(
-    ppapi::host::HostMessageContext* context,
-    const ppapi::proxy::PPB_AudioEncodeParameters& parameters) {
-  if (initialized_)
-    return PP_ERROR_FAILED;
-
-  if (!IsInitializationValid(parameters))
-    return PP_ERROR_NOTSUPPORTED;
-
-  std::unique_ptr<AudioEncoderImpl> encoder(new AudioEncoderImpl);
-  if (!encoder->Initialize(parameters))
-    return PP_ERROR_FAILED;
-  if (!AllocateBuffers(parameters, encoder->GetNumberOfSamplesPerFrame()))
-    return PP_ERROR_NOMEMORY;
-
-  initialized_ = true;
-  encoder_last_error_ = PP_OK;
-  encoder_.swap(encoder);
-
-  ppapi::host::ReplyMessageContext reply_context =
-      context->MakeReplyMessageContext();
-  reply_context.params.AppendHandle(SerializedHandle(
-      renderer_ppapi_host_->ShareUnsafeSharedMemoryRegionWithRemote(
-          audio_buffer_manager_->region())));
-  reply_context.params.AppendHandle(SerializedHandle(
-      renderer_ppapi_host_->ShareUnsafeSharedMemoryRegionWithRemote(
-          bitstream_buffer_manager_->region())));
-  host()->SendReply(reply_context,
-                    PpapiPluginMsg_AudioEncoder_InitializeReply(
-                        encoder_->GetNumberOfSamplesPerFrame(),
-                        audio_buffer_manager_->number_of_buffers(),
-                        audio_buffer_manager_->buffer_size(),
-                        bitstream_buffer_manager_->number_of_buffers(),
-                        bitstream_buffer_manager_->buffer_size()));
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperAudioEncoderHost::OnHostMsgEncode(
-    ppapi::host::HostMessageContext* context,
-    int32_t buffer_id) {
-  if (encoder_last_error_)
-    return encoder_last_error_;
-
-  if (buffer_id < 0 || buffer_id >= audio_buffer_manager_->number_of_buffers())
-    return PP_ERROR_FAILED;
-
-  audio_buffer_manager_->EnqueueBuffer(buffer_id);
-
-  DoEncode();
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperAudioEncoderHost::OnHostMsgRecycleBitstreamBuffer(
-    ppapi::host::HostMessageContext* context,
-    int32_t buffer_id) {
-  if (encoder_last_error_)
-    return encoder_last_error_;
-
-  if (buffer_id < 0 ||
-      buffer_id >= bitstream_buffer_manager_->number_of_buffers())
-    return PP_ERROR_FAILED;
-
-  bitstream_buffer_manager_->EnqueueBuffer(buffer_id);
-
-  DoEncode();
-
-  return PP_OK;
-}
-
-int32_t PepperAudioEncoderHost::OnHostMsgRequestBitrateChange(
-    ppapi::host::HostMessageContext* context,
-    uint32_t bitrate) {
-  if (encoder_last_error_)
-    return encoder_last_error_;
-
-  media_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&AudioEncoderImpl::RequestBitrateChange,
-                                base::Unretained(encoder_.get()), bitrate));
-
-  return PP_OK;
-}
-
-int32_t PepperAudioEncoderHost::OnHostMsgClose(
-    ppapi::host::HostMessageContext* context) {
-  encoder_last_error_ = PP_ERROR_FAILED;
-  Close();
-
-  return PP_OK;
-}
-
-void PepperAudioEncoderHost::GetSupportedProfiles(
-    std::vector<PP_AudioProfileDescription>* profiles) {
-  DCHECK(RenderThreadImpl::current());
-
-  *profiles = AudioEncoderImpl::GetSupportedProfiles();
-}
-
-bool PepperAudioEncoderHost::IsInitializationValid(
-    const ppapi::proxy::PPB_AudioEncodeParameters& parameters) {
-  DCHECK(RenderThreadImpl::current());
-
-  std::vector<PP_AudioProfileDescription> profiles;
-  GetSupportedProfiles(&profiles);
-
-  for (const PP_AudioProfileDescription& profile : profiles) {
-    if (parameters.output_profile == profile.profile &&
-        parameters.input_sample_size == profile.sample_size &&
-        parameters.input_sample_rate == profile.sample_rate &&
-        parameters.channels <= profile.max_channels &&
-        PP_HardwareAccelerationCompatibleAudio(
-            profile.hardware_accelerated == PP_TRUE, parameters.acceleration))
-      return true;
-  }
-
-  return false;
-}
-
-bool PepperAudioEncoderHost::AllocateBuffers(
-    const ppapi::proxy::PPB_AudioEncodeParameters& parameters,
-    int32_t samples_per_frame) {
-  DCHECK(RenderThreadImpl::current());
-
-  // Audio buffers size computation.
-  base::CheckedNumeric<uint32_t> audio_buffer_size = samples_per_frame;
-  audio_buffer_size *= parameters.channels;
-  audio_buffer_size *= parameters.input_sample_size;
-
-  base::CheckedNumeric<uint32_t> total_audio_buffer_size = audio_buffer_size;
-  total_audio_buffer_size += sizeof(ppapi::MediaStreamBuffer::Audio);
-  base::CheckedNumeric<size_t> total_audio_memory_size =
-      total_audio_buffer_size;
-  total_audio_memory_size *= kDefaultNumberOfAudioBuffers;
-
-  // Bitstream buffers size computation (individual bitstream buffers are
-  // twice the size of the raw data, to handle the worst case where
-  // compression doesn't work).
-  base::CheckedNumeric<uint32_t> bitstream_buffer_size = audio_buffer_size;
-  bitstream_buffer_size *= 2;
-  bitstream_buffer_size += sizeof(ppapi::MediaStreamBuffer::Bitstream);
-  base::CheckedNumeric<size_t> total_bitstream_memory_size =
-      bitstream_buffer_size;
-  total_bitstream_memory_size *= kDefaultNumberOfAudioBuffers;
-
-  if (!total_audio_memory_size.IsValid() ||
-      !total_bitstream_memory_size.IsValid())
-    return false;
-
-  base::UnsafeSharedMemoryRegion audio_region =
-      base::UnsafeSharedMemoryRegion::Create(
-          total_audio_memory_size.ValueOrDie());
-  if (!audio_region.IsValid())
-    return false;
-  std::unique_ptr<ppapi::MediaStreamBufferManager> audio_buffer_manager(
-      new ppapi::MediaStreamBufferManager(this));
-  if (!audio_buffer_manager->SetBuffers(
-          kDefaultNumberOfAudioBuffers,
-          base::ValueOrDieForType<int32_t>(total_audio_buffer_size),
-          std::move(audio_region), false))
-    return false;
-
-  for (int32_t i = 0; i < audio_buffer_manager->number_of_buffers(); ++i) {
-    ppapi::MediaStreamBuffer::Audio* buffer =
-        &(audio_buffer_manager->GetBufferPointer(i)->audio);
-    buffer->header.size = total_audio_buffer_size.ValueOrDie();
-    buffer->header.type = ppapi::MediaStreamBuffer::TYPE_AUDIO;
-    buffer->sample_rate =
-        static_cast<PP_AudioBuffer_SampleRate>(parameters.input_sample_rate);
-    buffer->number_of_channels = parameters.channels;
-    buffer->number_of_samples = samples_per_frame;
-    buffer->data_size = audio_buffer_size.ValueOrDie();
-  }
-
-  base::UnsafeSharedMemoryRegion bitstream_region =
-      base::UnsafeSharedMemoryRegion::Create(
-          total_bitstream_memory_size.ValueOrDie());
-  if (!bitstream_region.IsValid())
-    return false;
-  std::unique_ptr<ppapi::MediaStreamBufferManager> bitstream_buffer_manager(
-      new ppapi::MediaStreamBufferManager(this));
-  if (!bitstream_buffer_manager->SetBuffers(
-          kDefaultNumberOfAudioBuffers,
-          base::ValueOrDieForType<int32_t>(bitstream_buffer_size),
-          std::move(bitstream_region), true))
-    return false;
-
-  for (int32_t i = 0; i < bitstream_buffer_manager->number_of_buffers(); ++i) {
-    ppapi::MediaStreamBuffer::Bitstream* buffer =
-        &(bitstream_buffer_manager->GetBufferPointer(i)->bitstream);
-    buffer->header.size = bitstream_buffer_size.ValueOrDie();
-    buffer->header.type = ppapi::MediaStreamBuffer::TYPE_BITSTREAM;
-  }
-
-  audio_buffer_manager_.swap(audio_buffer_manager);
-  bitstream_buffer_manager_.swap(bitstream_buffer_manager);
-
-  return true;
-}
-
-void PepperAudioEncoderHost::DoEncode() {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK(!encoder_last_error_);
-
-  if (!audio_buffer_manager_->HasAvailableBuffer() ||
-      !bitstream_buffer_manager_->HasAvailableBuffer())
-    return;
-
-  int32_t audio_buffer_id = audio_buffer_manager_->DequeueBuffer();
-  int32_t bitstream_buffer_id = bitstream_buffer_manager_->DequeueBuffer();
-
-  ppapi::MediaStreamBuffer* audio_buffer =
-      audio_buffer_manager_->GetBufferPointer(audio_buffer_id);
-  ppapi::MediaStreamBuffer* bitstream_buffer =
-      bitstream_buffer_manager_->GetBufferPointer(bitstream_buffer_id);
-
-  media_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&AudioEncoderImpl::Encode,
-                     base::Unretained(encoder_.get()),
-                     static_cast<uint8_t*>(audio_buffer->audio.data),
-                     audio_buffer_manager_->buffer_size() -
-                         sizeof(ppapi::MediaStreamBuffer::Audio),
-                     static_cast<uint8_t*>(bitstream_buffer->bitstream.data),
-                     bitstream_buffer_manager_->buffer_size() -
-                         sizeof(ppapi::MediaStreamBuffer::Bitstream),
-                     base::BindPostTaskToCurrentDefault(base::BindOnce(
-                         &PepperAudioEncoderHost::BitstreamBufferReady,
-                         weak_ptr_factory_.GetWeakPtr(), audio_buffer_id,
-                         bitstream_buffer_id))));
-}
-
-void PepperAudioEncoderHost::BitstreamBufferReady(int32_t audio_buffer_id,
-                                                  int32_t bitstream_buffer_id,
-                                                  int32_t result) {
-  DCHECK(RenderThreadImpl::current());
-
-  if (encoder_last_error_)
-    return;
-
-  if (result < 0) {
-    NotifyPepperError(PP_ERROR_FAILED);
-    return;
-  }
-
-  host()->SendUnsolicitedReply(
-      pp_resource(), PpapiPluginMsg_AudioEncoder_EncodeReply(audio_buffer_id));
-
-  ppapi::MediaStreamBuffer::Bitstream* buffer =
-      &(bitstream_buffer_manager_->GetBufferPointer(bitstream_buffer_id)
-            ->bitstream);
-  buffer->data_size = static_cast<uint32_t>(result);
-
-  host()->SendUnsolicitedReply(
-      pp_resource(),
-      PpapiPluginMsg_AudioEncoder_BitstreamBufferReady(bitstream_buffer_id));
-}
-
-void PepperAudioEncoderHost::NotifyPepperError(int32_t error) {
-  DCHECK(RenderThreadImpl::current());
-
-  encoder_last_error_ = error;
-  Close();
-  host()->SendUnsolicitedReply(
-      pp_resource(),
-      PpapiPluginMsg_AudioEncoder_NotifyError(encoder_last_error_));
-}
-
-void PepperAudioEncoderHost::Close() {
-  DCHECK(RenderThreadImpl::current());
-
-  // Destroy the encoder and the audio/bitstream buffers on the media thread
-  // to avoid freeing memory the encoder might still be working on.
-  media_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&StopAudioEncoder, std::move(encoder_),
-                                std::move(audio_buffer_manager_),
-                                std::move(bitstream_buffer_manager_)));
-}
-
-// static
-void PepperAudioEncoderHost::StopAudioEncoder(
-    std::unique_ptr<AudioEncoderImpl> encoder,
-    std::unique_ptr<ppapi::MediaStreamBufferManager> audio_buffer_manager,
-    std::unique_ptr<ppapi::MediaStreamBufferManager> bitstream_buffer_manager) {
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_audio_encoder_host.h b/content/renderer/pepper/pepper_audio_encoder_host.h
deleted file mode 100644
index 3120031..0000000
--- a/content/renderer/pepper/pepper_audio_encoder_host.h
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2015 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_ENCODER_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_ENCODER_HOST_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/memory/ref_counted.h"
-#include "base/numerics/safe_math.h"
-#include "base/task/single_thread_task_runner.h"
-#include "ppapi/c/pp_codecs.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/resource_host.h"
-#include "ppapi/proxy/resource_message_params.h"
-#include "ppapi/proxy/serialized_structs.h"
-#include "ppapi/shared_impl/media_stream_buffer_manager.h"
-
-namespace content {
-
-class RendererPpapiHost;
-
-class PepperAudioEncoderHost
-    : public ppapi::host::ResourceHost,
-      public ppapi::MediaStreamBufferManager::Delegate {
- public:
-  PepperAudioEncoderHost(RendererPpapiHost* host,
-                         PP_Instance instance,
-                         PP_Resource resource);
-
-  PepperAudioEncoderHost(const PepperAudioEncoderHost&) = delete;
-  PepperAudioEncoderHost& operator=(const PepperAudioEncoderHost&) = delete;
-
-  ~PepperAudioEncoderHost() override;
-
- private:
-  class AudioEncoderImpl;
-
-  // ResourceHost implementation.
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-
-  int32_t OnHostMsgGetSupportedProfiles(
-      ppapi::host::HostMessageContext* context);
-  int32_t OnHostMsgInitialize(
-      ppapi::host::HostMessageContext* context,
-      const ppapi::proxy::PPB_AudioEncodeParameters& parameters);
-  int32_t OnHostMsgGetAudioBuffers(ppapi::host::HostMessageContext* context);
-  int32_t OnHostMsgEncode(ppapi::host::HostMessageContext* context,
-                          int32_t buffer_id);
-  int32_t OnHostMsgRecycleBitstreamBuffer(
-      ppapi::host::HostMessageContext* context,
-      int32_t buffer_id);
-  int32_t OnHostMsgRequestBitrateChange(
-      ppapi::host::HostMessageContext* context,
-      uint32_t bitrate);
-  int32_t OnHostMsgClose(ppapi::host::HostMessageContext* context);
-
-  void GetSupportedProfiles(std::vector<PP_AudioProfileDescription>* profiles);
-  bool IsInitializationValid(
-      const ppapi::proxy::PPB_AudioEncodeParameters& parameters);
-  bool AllocateBuffers(
-      const ppapi::proxy::PPB_AudioEncodeParameters& parameters,
-      int32_t samples_per_frame);
-  void DoEncode();
-  void BitstreamBufferReady(int32_t audio_buffer_id,
-                            int32_t bitstream_buffer_id,
-                            int32_t size);
-  void NotifyPepperError(int32_t error);
-  void Close();
-
-  static void StopAudioEncoder(
-      std::unique_ptr<AudioEncoderImpl> encoder,
-      std::unique_ptr<ppapi::MediaStreamBufferManager> audio_buffer_manager,
-      std::unique_ptr<ppapi::MediaStreamBufferManager>
-          bitstream_buffer_manager);
-
-  // Non-owning pointer.
-  RendererPpapiHost* renderer_ppapi_host_;
-
-  // Whether the encoder has been successfully initialized.
-  bool initialized_;
-
-  // Last error reported by the encoder.
-  // This represents the current error state of the encoder, i.e. PP_OK
-  // normally, or a Pepper error code if the encoder is uninitialized,
-  // has been notified of an encoder error, has encountered some
-  // other unrecoverable error, or has been closed by the plugin.
-  // This field is checked in most message handlers to decide whether
-  // operations should proceed or fail.
-  int32_t encoder_last_error_;
-
-  // Manages buffers containing audio samples from the plugin.
-  std::unique_ptr<ppapi::MediaStreamBufferManager> audio_buffer_manager_;
-
-  // Manages buffers containing encoded audio from the browser.
-  std::unique_ptr<ppapi::MediaStreamBufferManager> bitstream_buffer_manager_;
-
-  // Media task runner used to run the encoder.
-  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
-
-  // The encoder actually doing the work.
-  std::unique_ptr<AudioEncoderImpl> encoder_;
-
-  base::WeakPtrFactory<PepperAudioEncoderHost> weak_ptr_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_ENCODER_HOST_H_
diff --git a/content/renderer/pepper/pepper_audio_input_host.cc b/content/renderer/pepper/pepper_audio_input_host.cc
deleted file mode 100644
index 30d9266..0000000
--- a/content/renderer/pepper/pepper_audio_input_host.cc
+++ /dev/null
@@ -1,188 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_audio_input_host.h"
-
-#include "base/notreached.h"
-#include "build/build_config.h"
-#include "content/common/pepper_file_util.h"
-#include "content/public/renderer/render_frame.h"
-#include "content/renderer/pepper/pepper_media_device_manager.h"
-#include "content/renderer/pepper/pepper_platform_audio_input.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "ipc/ipc_message.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/proxy/serialized_structs.h"
-
-namespace content {
-
-PepperAudioInputHost::PepperAudioInputHost(RendererPpapiHostImpl* host,
-                                           PP_Instance instance,
-                                           PP_Resource resource)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      renderer_ppapi_host_(host),
-      audio_input_(nullptr),
-      enumeration_helper_(this,
-                          PepperMediaDeviceManager::GetForRenderFrame(
-                              host->GetRenderFrameForInstance(pp_instance())),
-                          PP_DEVICETYPE_DEV_AUDIOCAPTURE,
-                          host->GetDocumentURL(instance)) {}
-
-PepperAudioInputHost::~PepperAudioInputHost() { Close(); }
-
-int32_t PepperAudioInputHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    ppapi::host::HostMessageContext* context) {
-  int32_t result = PP_ERROR_FAILED;
-  if (enumeration_helper_.HandleResourceMessage(msg, context, &result))
-    return result;
-
-  PPAPI_BEGIN_MESSAGE_MAP(PepperAudioInputHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_AudioInput_Open, OnOpen)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_AudioInput_StartOrStop,
-                                      OnStartOrStop)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_AudioInput_Close, OnClose)
-  PPAPI_END_MESSAGE_MAP()
-  return PP_ERROR_FAILED;
-}
-
-void PepperAudioInputHost::StreamCreated(
-    base::UnsafeSharedMemoryRegion shared_memory_region,
-    base::SyncSocket::ScopedHandle socket) {
-  OnOpenComplete(PP_OK, std::move(shared_memory_region), std::move(socket));
-}
-
-void PepperAudioInputHost::StreamCreationFailed() {
-  OnOpenComplete(PP_ERROR_FAILED, base::UnsafeSharedMemoryRegion(),
-                 base::SyncSocket::ScopedHandle());
-}
-
-int32_t PepperAudioInputHost::OnOpen(ppapi::host::HostMessageContext* context,
-                                     const std::string& device_id,
-                                     PP_AudioSampleRate sample_rate,
-                                     uint32_t sample_frame_count) {
-  if (open_context_.is_valid())
-    return PP_ERROR_INPROGRESS;
-  if (audio_input_)
-    return PP_ERROR_FAILED;
-
-  GURL document_url = renderer_ppapi_host_->GetDocumentURL(pp_instance());
-  if (!document_url.is_valid())
-    return PP_ERROR_FAILED;
-
-  // When it is done, we'll get called back on StreamCreated() or
-  // StreamCreationFailed().
-  audio_input_ = PepperPlatformAudioInput::Create(
-      renderer_ppapi_host_->GetRenderFrameForInstance(pp_instance())->
-          GetRoutingID(),
-      device_id,
-      static_cast<int>(sample_rate),
-      static_cast<int>(sample_frame_count),
-      this);
-  if (audio_input_) {
-    open_context_ = context->MakeReplyMessageContext();
-    return PP_OK_COMPLETIONPENDING;
-  } else {
-    return PP_ERROR_FAILED;
-  }
-}
-
-int32_t PepperAudioInputHost::OnStartOrStop(
-    ppapi::host::HostMessageContext* /* context */,
-    bool capture) {
-  if (!audio_input_)
-    return PP_ERROR_FAILED;
-  if (capture)
-    audio_input_->StartCapture();
-  else
-    audio_input_->StopCapture();
-  return PP_OK;
-}
-
-int32_t PepperAudioInputHost::OnClose(
-    ppapi::host::HostMessageContext* /* context */) {
-  Close();
-  return PP_OK;
-}
-
-void PepperAudioInputHost::OnOpenComplete(
-    int32_t result,
-    base::UnsafeSharedMemoryRegion shared_memory_region,
-    base::SyncSocket::ScopedHandle socket_handle) {
-  // Make sure the handles are cleaned up.
-  base::SyncSocket scoped_socket(std::move(socket_handle));
-
-  if (!open_context_.is_valid()) {
-    NOTREACHED();
-  }
-
-  ppapi::proxy::SerializedHandle serialized_socket_handle(
-      ppapi::proxy::SerializedHandle::SOCKET);
-  ppapi::proxy::SerializedHandle serialized_shared_memory_handle(
-      ppapi::proxy::SerializedHandle::SHARED_MEMORY_REGION);
-
-  if (result == PP_OK) {
-    IPC::PlatformFileForTransit temp_socket =
-        IPC::InvalidPlatformFileForTransit();
-    base::UnsafeSharedMemoryRegion temp_shmem;
-    result = GetRemoteHandles(scoped_socket, shared_memory_region, &temp_socket,
-                              &temp_shmem);
-
-    serialized_socket_handle.set_socket(temp_socket);
-    serialized_shared_memory_handle.set_shmem_region(
-        base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
-            std::move(temp_shmem)));
-  }
-
-  // Send all the values, even on error. This simplifies some of our cleanup
-  // code since the handles will be in the other process and could be
-  // inconvenient to clean up. Our IPC code will automatically handle this for
-  // us, as long as the remote side always closes the handles it receives, even
-  // in the failure case.
-  open_context_.params.AppendHandle(std::move(serialized_socket_handle));
-  open_context_.params.AppendHandle(std::move(serialized_shared_memory_handle));
-  SendOpenReply(result);
-}
-
-int32_t PepperAudioInputHost::GetRemoteHandles(
-    const base::SyncSocket& socket,
-    const base::UnsafeSharedMemoryRegion& shared_memory_region,
-    IPC::PlatformFileForTransit* remote_socket_handle,
-    base::UnsafeSharedMemoryRegion* remote_shared_memory_region) {
-  *remote_socket_handle =
-      renderer_ppapi_host_->ShareHandleWithRemote(socket.handle(), false);
-  if (*remote_socket_handle == IPC::InvalidPlatformFileForTransit())
-    return PP_ERROR_FAILED;
-
-  *remote_shared_memory_region =
-      renderer_ppapi_host_->ShareUnsafeSharedMemoryRegionWithRemote(
-          shared_memory_region);
-  if (!remote_shared_memory_region->IsValid())
-    return PP_ERROR_FAILED;
-
-  return PP_OK;
-}
-
-void PepperAudioInputHost::Close() {
-  if (!audio_input_)
-    return;
-
-  audio_input_->ShutDown();
-  audio_input_ = nullptr;
-
-  if (open_context_.is_valid())
-    SendOpenReply(PP_ERROR_ABORTED);
-}
-
-void PepperAudioInputHost::SendOpenReply(int32_t result) {
-  open_context_.params.set_result(result);
-  host()->SendReply(open_context_, PpapiPluginMsg_AudioInput_OpenReply());
-  open_context_ = ppapi::host::ReplyMessageContext();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_audio_input_host.h b/content/renderer/pepper/pepper_audio_input_host.h
deleted file mode 100644
index 0f551fd..0000000
--- a/content/renderer/pepper/pepper_audio_input_host.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_INPUT_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_INPUT_HOST_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "base/sync_socket.h"
-#include "content/renderer/pepper/pepper_device_enumeration_host_helper.h"
-#include "ipc/ipc_platform_file.h"
-#include "ppapi/c/ppb_audio_config.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/resource_host.h"
-
-namespace content {
-class PepperPlatformAudioInput;
-class RendererPpapiHostImpl;
-
-class PepperAudioInputHost : public ppapi::host::ResourceHost {
- public:
-  PepperAudioInputHost(RendererPpapiHostImpl* host,
-                       PP_Instance instance,
-                       PP_Resource resource);
-
-  PepperAudioInputHost(const PepperAudioInputHost&) = delete;
-  PepperAudioInputHost& operator=(const PepperAudioInputHost&) = delete;
-
-  ~PepperAudioInputHost() override;
-
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-
-  // Called when the stream is created.
-  void StreamCreated(base::UnsafeSharedMemoryRegion shared_memory_region,
-                     base::SyncSocket::ScopedHandle socket);
-  void StreamCreationFailed();
-
- private:
-  int32_t OnOpen(ppapi::host::HostMessageContext* context,
-                 const std::string& device_id,
-                 PP_AudioSampleRate sample_rate,
-                 uint32_t sample_frame_count);
-  int32_t OnStartOrStop(ppapi::host::HostMessageContext* context, bool capture);
-  int32_t OnClose(ppapi::host::HostMessageContext* context);
-
-  void OnOpenComplete(int32_t result,
-                      base::UnsafeSharedMemoryRegion shared_memory_region,
-                      base::SyncSocket::ScopedHandle socket_handle);
-
-  int32_t GetRemoteHandles(
-      const base::SyncSocket& socket,
-      const base::UnsafeSharedMemoryRegion& shared_memory_region,
-      IPC::PlatformFileForTransit* remote_socket_handle,
-      base::UnsafeSharedMemoryRegion* remote_shared_memory_region);
-
-  void Close();
-
-  void SendOpenReply(int32_t result);
-
-  // Non-owning pointer.
-  raw_ptr<RendererPpapiHostImpl> renderer_ppapi_host_;
-
-  ppapi::host::ReplyMessageContext open_context_;
-
-  // Audio input object that we delegate audio IPC through.
-  // We don't own this pointer but are responsible for calling Shutdown on it.
-  raw_ptr<PepperPlatformAudioInput> audio_input_;
-
-  PepperDeviceEnumerationHostHelper enumeration_helper_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_INPUT_HOST_H_
diff --git a/content/renderer/pepper/pepper_audio_output_host.cc b/content/renderer/pepper/pepper_audio_output_host.cc
deleted file mode 100644
index ba643c1..0000000
--- a/content/renderer/pepper/pepper_audio_output_host.cc
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_audio_output_host.h"
-
-#include "base/check.h"
-#include "base/notreached.h"
-#include "build/build_config.h"
-#include "content/common/pepper_file_util.h"
-#include "content/public/renderer/render_frame.h"
-#include "content/renderer/pepper/pepper_audio_controller.h"
-#include "content/renderer/pepper/pepper_media_device_manager.h"
-#include "content/renderer/pepper/pepper_platform_audio_output_dev.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "ipc/ipc_message.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/proxy/serialized_structs.h"
-
-namespace content {
-
-PepperAudioOutputHost::PepperAudioOutputHost(RendererPpapiHostImpl* host,
-                                             PP_Instance instance,
-                                             PP_Resource resource)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      renderer_ppapi_host_(host),
-      audio_output_(nullptr),
-      enumeration_helper_(this,
-                          PepperMediaDeviceManager::GetForRenderFrame(
-                              host->GetRenderFrameForInstance(pp_instance())),
-                          PP_DEVICETYPE_DEV_AUDIOOUTPUT,
-                          host->GetDocumentURL(instance)) {
-}
-
-PepperAudioOutputHost::~PepperAudioOutputHost() {
-  PepperPluginInstanceImpl* instance = static_cast<PepperPluginInstanceImpl*>(
-      PepperPluginInstance::Get(pp_instance()));
-  if (instance) {
-    instance->audio_controller().RemoveInstance(this);
-  }
-  Close();
-}
-
-int32_t PepperAudioOutputHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    ppapi::host::HostMessageContext* context) {
-  int32_t result = PP_ERROR_FAILED;
-  if (enumeration_helper_.HandleResourceMessage(msg, context, &result))
-    return result;
-
-  PPAPI_BEGIN_MESSAGE_MAP(PepperAudioOutputHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_AudioOutput_Open, OnOpen)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_AudioOutput_StartOrStop,
-                                      OnStartOrStop)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_AudioOutput_Close, OnClose)
-  PPAPI_END_MESSAGE_MAP()
-  return PP_ERROR_FAILED;
-}
-
-void PepperAudioOutputHost::StreamCreated(
-    base::UnsafeSharedMemoryRegion shared_memory_region,
-    base::SyncSocket::ScopedHandle socket) {
-  OnOpenComplete(PP_OK, std::move(shared_memory_region), std::move(socket));
-}
-
-void PepperAudioOutputHost::StreamCreationFailed() {
-  OnOpenComplete(PP_ERROR_FAILED, base::UnsafeSharedMemoryRegion(),
-                 base::SyncSocket::ScopedHandle());
-}
-
-void PepperAudioOutputHost::SetVolume(double volume) {
-  if (audio_output_)
-    audio_output_->SetVolume(volume);
-}
-
-int32_t PepperAudioOutputHost::OnOpen(ppapi::host::HostMessageContext* context,
-                                      const std::string& device_id,
-                                      PP_AudioSampleRate sample_rate,
-                                      uint32_t sample_frame_count) {
-  if (open_context_.is_valid())
-    return PP_ERROR_INPROGRESS;
-
-  if (audio_output_)
-    return PP_ERROR_FAILED;
-
-  // When it is done, we'll get called back on StreamCreated() or
-  // StreamCreationFailed().
-  audio_output_ = PepperPlatformAudioOutputDev::Create(
-      renderer_ppapi_host_->GetRenderFrameForInstance(pp_instance())
-          ->GetRoutingID(),
-      device_id, static_cast<int>(sample_rate),
-      static_cast<int>(sample_frame_count), this);
-  if (audio_output_) {
-    open_context_ = context->MakeReplyMessageContext();
-    return PP_OK_COMPLETIONPENDING;
-  } else {
-    return PP_ERROR_FAILED;
-  }
-}
-
-int32_t PepperAudioOutputHost::OnStartOrStop(
-    ppapi::host::HostMessageContext* /* context */,
-    bool playback) {
-  if (!audio_output_)
-    return PP_ERROR_FAILED;
-
-  PepperPluginInstanceImpl* instance = static_cast<PepperPluginInstanceImpl*>(
-      PepperPluginInstance::Get(pp_instance()));
-
-  if (playback) {
-    if (instance)
-      instance->audio_controller().AddInstance(this);
-
-    audio_output_->StartPlayback();
-  } else {
-    if (instance)
-      instance->audio_controller().RemoveInstance(this);
-
-    audio_output_->StopPlayback();
-  }
-  return PP_OK;
-}
-
-int32_t PepperAudioOutputHost::OnClose(
-    ppapi::host::HostMessageContext* /* context */) {
-  Close();
-  return PP_OK;
-}
-
-void PepperAudioOutputHost::OnOpenComplete(
-    int32_t result,
-    base::UnsafeSharedMemoryRegion shared_memory_region,
-    base::SyncSocket::ScopedHandle socket_handle) {
-  // Make sure the handles are cleaned up.
-  base::SyncSocket scoped_socket(std::move(socket_handle));
-
-  if (!open_context_.is_valid()) {
-    NOTREACHED();
-  }
-
-  ppapi::proxy::SerializedHandle serialized_socket_handle(
-      ppapi::proxy::SerializedHandle::SOCKET);
-  ppapi::proxy::SerializedHandle serialized_shared_memory_handle(
-      ppapi::proxy::SerializedHandle::SHARED_MEMORY_REGION);
-
-  if (result == PP_OK) {
-    IPC::PlatformFileForTransit temp_socket =
-        IPC::InvalidPlatformFileForTransit();
-    base::UnsafeSharedMemoryRegion temp_shmem;
-    result = GetRemoteHandles(scoped_socket, shared_memory_region, &temp_socket,
-                              &temp_shmem);
-
-    serialized_socket_handle.set_socket(temp_socket);
-    serialized_shared_memory_handle.set_shmem_region(
-        base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
-            std::move(temp_shmem)));
-  }
-
-  // Send all the values, even on error. This simplifies some of our cleanup
-  // code since the handles will be in the other process and could be
-  // inconvenient to clean up. Our IPC code will automatically handle this for
-  // us, as long as the remote side always closes the handles it receives, even
-  // in the failure case.
-  open_context_.params.AppendHandle(std::move(serialized_socket_handle));
-  open_context_.params.AppendHandle(std::move(serialized_shared_memory_handle));
-  SendOpenReply(result);
-}
-
-int32_t PepperAudioOutputHost::GetRemoteHandles(
-    const base::SyncSocket& socket,
-    const base::UnsafeSharedMemoryRegion& shared_memory_region,
-    IPC::PlatformFileForTransit* remote_socket_handle,
-    base::UnsafeSharedMemoryRegion* remote_shared_memory_region) {
-  *remote_socket_handle =
-      renderer_ppapi_host_->ShareHandleWithRemote(socket.handle(), false);
-  if (*remote_socket_handle == IPC::InvalidPlatformFileForTransit())
-    return PP_ERROR_FAILED;
-
-  *remote_shared_memory_region =
-      renderer_ppapi_host_->ShareUnsafeSharedMemoryRegionWithRemote(
-          shared_memory_region);
-  if (!remote_shared_memory_region->IsValid())
-    return PP_ERROR_FAILED;
-
-  return PP_OK;
-}
-
-void PepperAudioOutputHost::Close() {
-  if (!audio_output_)
-    return;
-
-  audio_output_->ShutDown();
-  audio_output_ = nullptr;
-
-  if (open_context_.is_valid())
-    SendOpenReply(PP_ERROR_ABORTED);
-}
-
-void PepperAudioOutputHost::SendOpenReply(int32_t result) {
-  open_context_.params.set_result(result);
-  host()->SendReply(open_context_, PpapiPluginMsg_AudioOutput_OpenReply());
-  open_context_ = ppapi::host::ReplyMessageContext();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_audio_output_host.h b/content/renderer/pepper/pepper_audio_output_host.h
deleted file mode 100644
index 918ffe0..0000000
--- a/content/renderer/pepper/pepper_audio_output_host.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_OUTPUT_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_OUTPUT_HOST_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "base/sync_socket.h"
-#include "content/renderer/pepper/pepper_device_enumeration_host_helper.h"
-#include "ipc/ipc_platform_file.h"
-#include "ppapi/c/ppb_audio_config.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/resource_host.h"
-
-namespace content {
-class PepperPlatformAudioOutputDev;
-class RendererPpapiHostImpl;
-
-class PepperAudioOutputHost : public ppapi::host::ResourceHost {
- public:
-  PepperAudioOutputHost(RendererPpapiHostImpl* host,
-                        PP_Instance instance,
-                        PP_Resource resource);
-
-  PepperAudioOutputHost(const PepperAudioOutputHost&) = delete;
-  PepperAudioOutputHost& operator=(const PepperAudioOutputHost&) = delete;
-
-  ~PepperAudioOutputHost() override;
-
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-
-  // Called when the stream is created.
-  void StreamCreated(base::UnsafeSharedMemoryRegion shared_memory_region,
-                     base::SyncSocket::ScopedHandle socket);
-  void StreamCreationFailed();
-  void SetVolume(double volume);
-
- private:
-  int32_t OnOpen(ppapi::host::HostMessageContext* context,
-                 const std::string& device_id,
-                 PP_AudioSampleRate sample_rate,
-                 uint32_t sample_frame_count);
-  int32_t OnStartOrStop(ppapi::host::HostMessageContext* context,
-                        bool playback);
-  int32_t OnClose(ppapi::host::HostMessageContext* context);
-
-  void OnOpenComplete(int32_t result,
-                      base::UnsafeSharedMemoryRegion shared_memory_region,
-                      base::SyncSocket::ScopedHandle socket_handle);
-
-  int32_t GetRemoteHandles(
-      const base::SyncSocket& socket,
-      const base::UnsafeSharedMemoryRegion& shared_memory_region,
-      IPC::PlatformFileForTransit* remote_socket_handle,
-      base::UnsafeSharedMemoryRegion* remote_shared_memory_region);
-
-  void Close();
-
-  void SendOpenReply(int32_t result);
-
-  // Non-owning pointer.
-  raw_ptr<RendererPpapiHostImpl> renderer_ppapi_host_;
-
-  ppapi::host::ReplyMessageContext open_context_;
-
-  // Audio output object that we delegate audio IPC through.
-  // We don't own this pointer but are responsible for calling Shutdown on it.
-  raw_ptr<PepperPlatformAudioOutputDev> audio_output_;
-
-  PepperDeviceEnumerationHostHelper enumeration_helper_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_OUTPUT_HOST_H_
diff --git a/content/renderer/pepper/pepper_browser_connection.cc b/content/renderer/pepper/pepper_browser_connection.cc
deleted file mode 100644
index b8b4ac87..0000000
--- a/content/renderer/pepper/pepper_browser_connection.cc
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_browser_connection.h"
-
-#include <limits>
-
-#include "base/notreached.h"
-#include "content/public/renderer/render_thread.h"
-#include "content/renderer/pepper/pepper_in_process_router.h"
-#include "content/renderer/render_frame_impl.h"
-#include "ipc/ipc_message_macros.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/proxy/resource_message_params.h"
-
-namespace content {
-
-PepperBrowserConnection::PepperBrowserConnection(RenderFrame* render_frame)
-    : RenderFrameObserver(render_frame),
-      RenderFrameObserverTracker<PepperBrowserConnection>(render_frame),
-      next_sequence_number_(1) {}
-
-PepperBrowserConnection::~PepperBrowserConnection() {}
-
-bool PepperBrowserConnection::OnMessageReceived(const IPC::Message& msg) {
-  // Check if the message is an in-process reply.
-  if (PepperInProcessRouter::OnPluginMsgReceived(msg))
-    return true;
-
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(PepperBrowserConnection, msg)
-    IPC_MESSAGE_HANDLER(PpapiHostMsg_CreateResourceHostsFromHostReply,
-                        OnMsgCreateResourceHostsFromHostReply)
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-  return handled;
-}
-
-void PepperBrowserConnection::DidCreateInProcessInstance(
-    PP_Instance instance,
-    int render_frame_id,
-    const GURL& document_url,
-    const GURL& plugin_url) {
-  GetHost()->DidCreateInProcessInstance(instance, render_frame_id, document_url,
-                                        plugin_url);
-}
-
-void PepperBrowserConnection::DidDeleteInProcessInstance(PP_Instance instance) {
-  GetHost()->DidDeleteInProcessInstance(instance);
-}
-
-void PepperBrowserConnection::DidCreateOutOfProcessPepperInstance(
-    int32_t plugin_child_id,
-    int32_t pp_instance,
-    bool is_external,
-    int32_t render_frame_id,
-    const GURL& document_url,
-    const GURL& plugin_url,
-    bool is_priviledged_context) {
-  GetHost()->DidCreateOutOfProcessPepperInstance(
-      plugin_child_id, pp_instance, is_external, render_frame_id, document_url,
-      plugin_url, is_priviledged_context);
-}
-
-void PepperBrowserConnection::DidDeleteOutOfProcessPepperInstance(
-    int32_t plugin_child_id,
-    int32_t pp_instance,
-    bool is_external) {
-  GetHost()->DidDeleteOutOfProcessPepperInstance(plugin_child_id, pp_instance,
-                                                 is_external);
-}
-
-void PepperBrowserConnection::SendBrowserCreate(
-    int child_process_id,
-    PP_Instance instance,
-    const std::vector<IPC::Message>& nested_msgs,
-    PendingResourceIDCallback callback) {
-  int32_t sequence_number = GetNextSequence();
-  pending_create_map_[sequence_number] = std::move(callback);
-  ppapi::proxy::ResourceMessageCallParams params(0, sequence_number);
-  Send(new PpapiHostMsg_CreateResourceHostsFromHost(
-      routing_id(), child_process_id, params, instance, nested_msgs));
-}
-
-void PepperBrowserConnection::OnMsgCreateResourceHostsFromHostReply(
-    int32_t sequence_number,
-    const std::vector<int>& pending_resource_host_ids) {
-  // Check that the message is destined for the plugin this object is associated
-  // with.
-  auto it = pending_create_map_.find(sequence_number);
-  if (it != pending_create_map_.end()) {
-    std::move(it->second).Run(pending_resource_host_ids);
-    pending_create_map_.erase(it);
-  } else {
-    NOTREACHED();
-  }
-}
-
-int32_t PepperBrowserConnection::GetNextSequence() {
-  // Return the value with wraparound, making sure we don't make a sequence
-  // number with a 0 ID. Note that signed wraparound is undefined in C++ so we
-  // manually check.
-  int32_t ret = next_sequence_number_;
-  if (next_sequence_number_ == std::numeric_limits<int32_t>::max())
-    next_sequence_number_ = 1;  // Skip 0 which is invalid.
-  else
-    next_sequence_number_++;
-  return ret;
-}
-
-void PepperBrowserConnection::OnDestruct() {
-  delete this;
-}
-
-mojom::PepperHost* PepperBrowserConnection::GetHost() {
-  RenderFrameImpl* render_frame_impl =
-      static_cast<RenderFrameImpl*>(render_frame());
-  return render_frame_impl->GetPepperHost();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_browser_connection.h b/content/renderer/pepper/pepper_browser_connection.h
deleted file mode 100644
index f3c3f29..0000000
--- a/content/renderer/pepper/pepper_browser_connection.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_BROWSER_CONNECTION_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_BROWSER_CONNECTION_H_
-
-#include <stdint.h>
-
-#include <map>
-#include <vector>
-
-#include "base/functional/callback.h"
-#include "content/common/pepper_plugin.mojom.h"
-#include "content/public/renderer/render_frame_observer.h"
-#include "content/public/renderer/render_frame_observer_tracker.h"
-#include "ppapi/c/pp_file_info.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/c/pp_resource.h"
-
-class GURL;
-
-namespace content {
-
-// This class represents a connection from the renderer to the browser for
-// sending/receiving pepper ResourceHost related messages. When the browser
-// and renderer communicate about ResourceHosts, they should pass the plugin
-// process ID to identify which plugin they are talking about.
-class PepperBrowserConnection
-    : public RenderFrameObserver,
-      public RenderFrameObserverTracker<PepperBrowserConnection> {
- public:
-  using PendingResourceIDCallback =
-      base::OnceCallback<void(const std::vector<int>&)>;
-  explicit PepperBrowserConnection(RenderFrame* render_frame);
-
-  PepperBrowserConnection(const PepperBrowserConnection&) = delete;
-  PepperBrowserConnection& operator=(const PepperBrowserConnection&) = delete;
-
-  ~PepperBrowserConnection() override;
-
-  bool OnMessageReceived(const IPC::Message& message) override;
-
-  // TODO(teravest): Instead of having separate methods per message, we should
-  // add generic functionality similar to PluginResource::Call().
-
-  // Sends a request to the browser to create ResourceHosts for the given
-  // |instance| of a plugin identified by |child_process_id|. |callback| will be
-  // run when a reply is received with the pending resource IDs.
-  void SendBrowserCreate(PP_Instance instance,
-                         int child_process_id,
-                         const std::vector<IPC::Message>& create_messages,
-                         PendingResourceIDCallback callback);
-
-  // Called when the renderer creates an in-process instance.
-  void DidCreateInProcessInstance(PP_Instance instance,
-                                  int render_frame_id,
-                                  const GURL& document_url,
-                                  const GURL& plugin_url);
-
-  // Called when the renderer deletes an in-process instance.
-  void DidDeleteInProcessInstance(PP_Instance instance);
-
-  // Called when the renderer creates an out of process instance.
-  void DidCreateOutOfProcessPepperInstance(int32_t plugin_child_id,
-                                           int32_t pp_instance,
-                                           bool is_external,
-                                           int32_t render_frame_id,
-                                           const GURL& document_url,
-                                           const GURL& plugin_url,
-                                           bool is_priviledged_context);
-
-  // Called when the renderer deletes an out of process instance.
-  void DidDeleteOutOfProcessPepperInstance(int32_t plugin_child_id,
-                                           int32_t pp_instance,
-                                           bool is_external);
-  // Return a bound PepperHost.
-  mojom::PepperHost* GetHost();
-
- private:
-  // RenderFrameObserver implementation.
-  void OnDestruct() override;
-
-  // Message handlers.
-  void OnMsgCreateResourceHostsFromHostReply(
-      int32_t sequence_number,
-      const std::vector<int>& pending_resource_host_ids);
-
-  // Return the next sequence number.
-  int32_t GetNextSequence();
-
-  // Sequence number to track pending callbacks.
-  int32_t next_sequence_number_;
-
-  // Maps a sequence number to the callback to be run.
-  std::map<int32_t, PendingResourceIDCallback> pending_create_map_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_BROWSER_CONNECTION_H_
diff --git a/content/renderer/pepper/pepper_camera_device_host.cc b/content/renderer/pepper/pepper_camera_device_host.cc
deleted file mode 100644
index a9f59cf..0000000
--- a/content/renderer/pepper/pepper_camera_device_host.cc
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2015 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_camera_device_host.h"
-
-#include <memory>
-
-#include "content/public/renderer/render_frame.h"
-#include "content/renderer/pepper/pepper_platform_camera_device.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/proxy/ppapi_messages.h"
-
-namespace content {
-
-PepperCameraDeviceHost::PepperCameraDeviceHost(RendererPpapiHostImpl* host,
-                                               PP_Instance instance,
-                                               PP_Resource resource)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      renderer_ppapi_host_(host) {
-}
-
-PepperCameraDeviceHost::~PepperCameraDeviceHost() {
-  DetachPlatformCameraDevice();
-}
-
-bool PepperCameraDeviceHost::Init() {
-  return !!renderer_ppapi_host_->GetPluginInstance(pp_instance());
-}
-
-int32_t PepperCameraDeviceHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    ppapi::host::HostMessageContext* context) {
-  int32_t result = PP_ERROR_FAILED;
-
-  PPAPI_BEGIN_MESSAGE_MAP(PepperCameraDeviceHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_CameraDevice_Open, OnOpen)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(
-        PpapiHostMsg_CameraDevice_GetSupportedVideoCaptureFormats,
-        OnGetSupportedVideoCaptureFormats)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_CameraDevice_Close,
-                                        OnClose)
-  PPAPI_END_MESSAGE_MAP()
-  return result;
-}
-
-void PepperCameraDeviceHost::OnInitialized(bool succeeded) {
-  if (!open_reply_context_.is_valid())
-    return;
-
-  if (succeeded) {
-    open_reply_context_.params.set_result(PP_OK);
-  } else {
-    DetachPlatformCameraDevice();
-    open_reply_context_.params.set_result(PP_ERROR_FAILED);
-  }
-
-  host()->SendReply(open_reply_context_,
-                    PpapiPluginMsg_CameraDevice_OpenReply());
-  open_reply_context_ = ppapi::host::ReplyMessageContext();
-}
-
-void PepperCameraDeviceHost::OnVideoCaptureFormatsEnumerated(
-    const std::vector<PP_VideoCaptureFormat>& formats) {
-  if (!video_capture_formats_reply_context_.is_valid())
-    return;
-
-  if (formats.size() > 0)
-    video_capture_formats_reply_context_.params.set_result(PP_OK);
-  else
-    video_capture_formats_reply_context_.params.set_result(PP_ERROR_FAILED);
-  host()->SendReply(
-      video_capture_formats_reply_context_,
-      PpapiPluginMsg_CameraDevice_GetSupportedVideoCaptureFormatsReply(
-          formats));
-  video_capture_formats_reply_context_ = ppapi::host::ReplyMessageContext();
-}
-
-int32_t PepperCameraDeviceHost::OnOpen(ppapi::host::HostMessageContext* context,
-                                       const std::string& device_id) {
-  if (open_reply_context_.is_valid())
-    return PP_ERROR_INPROGRESS;
-
-  if (platform_camera_device_.get())
-    return PP_ERROR_FAILED;
-
-  GURL document_url = renderer_ppapi_host_->GetDocumentURL(pp_instance());
-  if (!document_url.is_valid())
-    return PP_ERROR_FAILED;
-
-  platform_camera_device_ = std::make_unique<PepperPlatformCameraDevice>(
-      renderer_ppapi_host_->GetRenderFrameForInstance(pp_instance())
-          ->GetRoutingID(),
-      device_id, this);
-
-  open_reply_context_ = context->MakeReplyMessageContext();
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperCameraDeviceHost::OnClose(
-    ppapi::host::HostMessageContext* context) {
-  DetachPlatformCameraDevice();
-  return PP_OK;
-}
-
-int32_t PepperCameraDeviceHost::OnGetSupportedVideoCaptureFormats(
-    ppapi::host::HostMessageContext* context) {
-  if (video_capture_formats_reply_context_.is_valid())
-    return PP_ERROR_INPROGRESS;
-  if (!platform_camera_device_)
-    return PP_ERROR_FAILED;
-
-  video_capture_formats_reply_context_ = context->MakeReplyMessageContext();
-  platform_camera_device_->GetSupportedVideoCaptureFormats();
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-void PepperCameraDeviceHost::DetachPlatformCameraDevice() {
-  if (platform_camera_device_) {
-    platform_camera_device_->DetachEventHandler();
-    platform_camera_device_.reset();
-  }
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_camera_device_host.h b/content/renderer/pepper/pepper_camera_device_host.h
deleted file mode 100644
index bdc17278..0000000
--- a/content/renderer/pepper/pepper_camera_device_host.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2015 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_CAMERA_DEVICE_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_CAMERA_DEVICE_HOST_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/memory/raw_ptr.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/ppb_buffer_impl.h"
-#include "ppapi/c/pp_size.h"
-#include "ppapi/c/private/pp_video_capture_format.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/resource_host.h"
-
-namespace content {
-class PepperPlatformCameraDevice;
-class RendererPpapiHostImpl;
-
-class PepperCameraDeviceHost : public ppapi::host::ResourceHost {
- public:
-  PepperCameraDeviceHost(RendererPpapiHostImpl* host,
-                         PP_Instance instance,
-                         PP_Resource resource);
-
-  PepperCameraDeviceHost(const PepperCameraDeviceHost&) = delete;
-  PepperCameraDeviceHost& operator=(const PepperCameraDeviceHost&) = delete;
-
-  ~PepperCameraDeviceHost() override;
-
-  bool Init();
-
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-
-  // These methods are called by PepperPlatformCameraDevice only.
-
-  // Called when camera device is initialized.
-  void OnInitialized(bool succeeded);
-
-  // Called when the video capture formats are enumerated.
-  void OnVideoCaptureFormatsEnumerated(
-      const std::vector<PP_VideoCaptureFormat>& formats);
-
- private:
-  // Plugin -> host message handlers.
-  int32_t OnOpen(ppapi::host::HostMessageContext* context,
-                 const std::string& device_id);
-  int32_t OnClose(ppapi::host::HostMessageContext* context);
-  int32_t OnGetSupportedVideoCaptureFormats(
-      ppapi::host::HostMessageContext* context);
-
-  // Utility methods.
-  void DetachPlatformCameraDevice();
-
-  std::unique_ptr<PepperPlatformCameraDevice> platform_camera_device_;
-
-  raw_ptr<RendererPpapiHostImpl> renderer_ppapi_host_;
-
-  ppapi::host::ReplyMessageContext open_reply_context_;
-
-  ppapi::host::ReplyMessageContext video_capture_formats_reply_context_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_CAMERA_DEVICE_HOST_H_
diff --git a/content/renderer/pepper/pepper_device_enumeration_host_helper.cc b/content/renderer/pepper/pepper_device_enumeration_host_helper.cc
deleted file mode 100644
index f2ea868..0000000
--- a/content/renderer/pepper/pepper_device_enumeration_host_helper.cc
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_device_enumeration_host_helper.h"
-
-#include "base/check.h"
-#include "base/functional/bind.h"
-#include "base/location.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/task/single_thread_task_runner.h"
-#include "ipc/ipc_message.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/host/resource_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/shared_impl/ppb_device_ref_shared.h"
-
-using ppapi::host::HostMessageContext;
-
-namespace content {
-
-// Makes sure that StopEnumerateDevices() is called for each EnumerateDevices().
-class PepperDeviceEnumerationHostHelper::ScopedEnumerationRequest final {
- public:
-  // |owner| must outlive this object.
-  ScopedEnumerationRequest(PepperDeviceEnumerationHostHelper* owner,
-                           Delegate::DevicesOnceCallback callback)
-      : callback_(std::move(callback)), requested_(false), sync_call_(false) {
-    if (!owner->delegate_) {
-      // If no delegate, return an empty list of devices.
-      base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-          FROM_HERE,
-          base::BindOnce(
-              &ScopedEnumerationRequest::EnumerateDevicesCallbackBody,
-              weak_ptr_factory_.GetWeakPtr(),
-              std::vector<ppapi::DeviceRefData>()));
-      return;
-    }
-
-    requested_ = true;
-
-    // Note that the callback passed into
-    // PepperDeviceEnumerationHostHelper::Delegate::EnumerateDevices() may be
-    // called synchronously. In that case, |callback| may destroy this
-    // object. So we don't pass in |callback| directly. Instead, we use
-    // EnumerateDevicesCallbackBody() to ensure that we always call |callback|
-    // asynchronously.
-    sync_call_ = true;
-    owner->delegate_->EnumerateDevices(
-        owner->device_type_,
-        base::BindOnce(&ScopedEnumerationRequest::EnumerateDevicesCallbackBody,
-                       weak_ptr_factory_.GetWeakPtr()));
-    sync_call_ = false;
-  }
-
-  ScopedEnumerationRequest(const ScopedEnumerationRequest&) = delete;
-  ScopedEnumerationRequest& operator=(const ScopedEnumerationRequest&) = delete;
-
-  bool requested() const { return requested_; }
-
- private:
-  void EnumerateDevicesCallbackBody(
-      const std::vector<ppapi::DeviceRefData>& devices) {
-    if (sync_call_) {
-      base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-          FROM_HERE,
-          base::BindOnce(
-              &ScopedEnumerationRequest::EnumerateDevicesCallbackBody,
-              weak_ptr_factory_.GetWeakPtr(), devices));
-    } else {
-      std::move(callback_).Run(devices);
-      // This object may have been destroyed at this point.
-    }
-  }
-
-  PepperDeviceEnumerationHostHelper::Delegate::DevicesOnceCallback callback_;
-  bool requested_;
-  bool sync_call_;
-  base::WeakPtrFactory<ScopedEnumerationRequest> weak_ptr_factory_{this};
-};
-
-// Makes sure that StopMonitoringDevices() is called for each
-// StartMonitoringDevices().
-class PepperDeviceEnumerationHostHelper::ScopedMonitoringRequest {
- public:
-  // |owner| must outlive this object.
-  ScopedMonitoringRequest(PepperDeviceEnumerationHostHelper* owner,
-                          Delegate::DevicesCallback callback)
-      : owner_(owner),
-        callback_(std::move(callback)),
-        requested_(false),
-        subscription_id_(0u) {
-    DCHECK(owner_);
-    if (!owner->delegate_) {
-      return;
-    }
-
-    requested_ = true;
-
-    // |callback| is never called synchronously by StartMonitoringDevices(),
-    // so it is OK to pass it directly, even if |callback| destroys |this|.
-    subscription_id_ = owner_->delegate_->StartMonitoringDevices(
-        owner_->device_type_, callback_);
-  }
-
-  ScopedMonitoringRequest(const ScopedMonitoringRequest&) = delete;
-  ScopedMonitoringRequest& operator=(const ScopedMonitoringRequest&) = delete;
-
-  ~ScopedMonitoringRequest() {
-    if (requested_ && owner_->delegate_) {
-      owner_->delegate_->StopMonitoringDevices(owner_->device_type_,
-                                               subscription_id_);
-    }
-  }
-
-  bool requested() const { return requested_; }
-
- private:
-  const raw_ptr<PepperDeviceEnumerationHostHelper> owner_;
-  PepperDeviceEnumerationHostHelper::Delegate::DevicesCallback callback_;
-  bool requested_;
-  size_t subscription_id_;
-};
-
-PepperDeviceEnumerationHostHelper::PepperDeviceEnumerationHostHelper(
-    ppapi::host::ResourceHost* resource_host,
-    base::WeakPtr<Delegate> delegate,
-    PP_DeviceType_Dev device_type,
-    const GURL& document_url)
-    : resource_host_(resource_host),
-      delegate_(delegate),
-      device_type_(device_type) {}
-
-PepperDeviceEnumerationHostHelper::~PepperDeviceEnumerationHostHelper() {}
-
-bool PepperDeviceEnumerationHostHelper::HandleResourceMessage(
-    const IPC::Message& msg,
-    HostMessageContext* context,
-    int32_t* result) {
-  bool return_value = false;
-  *result = InternalHandleResourceMessage(msg, context, &return_value);
-  return return_value;
-}
-
-int32_t PepperDeviceEnumerationHostHelper::InternalHandleResourceMessage(
-    const IPC::Message& msg,
-    HostMessageContext* context,
-    bool* handled) {
-  *handled = true;
-  PPAPI_BEGIN_MESSAGE_MAP(PepperDeviceEnumerationHostHelper, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(
-        PpapiHostMsg_DeviceEnumeration_EnumerateDevices, OnEnumerateDevices)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(
-        PpapiHostMsg_DeviceEnumeration_MonitorDeviceChange,
-        OnMonitorDeviceChange)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(
-        PpapiHostMsg_DeviceEnumeration_StopMonitoringDeviceChange,
-        OnStopMonitoringDeviceChange)
-  PPAPI_END_MESSAGE_MAP()
-
-  *handled = false;
-  return PP_ERROR_FAILED;
-}
-
-int32_t PepperDeviceEnumerationHostHelper::OnEnumerateDevices(
-    HostMessageContext* context) {
-  if (enumerate_devices_context_.is_valid())
-    return PP_ERROR_INPROGRESS;
-
-  enumerate_ = std::make_unique<ScopedEnumerationRequest>(
-      this, base::BindOnce(
-                &PepperDeviceEnumerationHostHelper::OnEnumerateDevicesComplete,
-                base::Unretained(this)));
-  if (!enumerate_->requested())
-    return PP_ERROR_FAILED;
-
-  enumerate_devices_context_ = context->MakeReplyMessageContext();
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperDeviceEnumerationHostHelper::OnMonitorDeviceChange(
-    HostMessageContext* /* context */,
-    uint32_t callback_id) {
-  monitor_ = std::make_unique<ScopedMonitoringRequest>(
-      this, base::BindRepeating(
-                &PepperDeviceEnumerationHostHelper::OnNotifyDeviceChange,
-                base::Unretained(this), callback_id));
-
-  return monitor_->requested() ? PP_OK : PP_ERROR_FAILED;
-}
-
-int32_t PepperDeviceEnumerationHostHelper::OnStopMonitoringDeviceChange(
-    HostMessageContext* /* context */) {
-  monitor_.reset(nullptr);
-  return PP_OK;
-}
-
-void PepperDeviceEnumerationHostHelper::OnEnumerateDevicesComplete(
-    const std::vector<ppapi::DeviceRefData>& devices) {
-  DCHECK(enumerate_devices_context_.is_valid());
-
-  enumerate_.reset(nullptr);
-
-  enumerate_devices_context_.params.set_result(PP_OK);
-  resource_host_->host()->SendReply(
-      enumerate_devices_context_,
-      PpapiPluginMsg_DeviceEnumeration_EnumerateDevicesReply(devices));
-  enumerate_devices_context_ = ppapi::host::ReplyMessageContext();
-}
-
-void PepperDeviceEnumerationHostHelper::OnNotifyDeviceChange(
-    uint32_t callback_id,
-    const std::vector<ppapi::DeviceRefData>& devices) {
-  resource_host_->host()->SendUnsolicitedReply(
-      resource_host_->pp_resource(),
-      PpapiPluginMsg_DeviceEnumeration_NotifyDeviceChange(callback_id,
-                                                          devices));
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_device_enumeration_host_helper.h b/content/renderer/pepper/pepper_device_enumeration_host_helper.h
deleted file mode 100644
index 3c7580d..0000000
--- a/content/renderer/pepper/pepper_device_enumeration_host_helper.h
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_DEVICE_ENUMERATION_HOST_HELPER_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_DEVICE_ENUMERATION_HOST_HELPER_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/functional/callback_forward.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "content/common/content_export.h"
-#include "ppapi/c/dev/ppb_device_ref_dev.h"
-#include "ppapi/host/host_message_context.h"
-#include "url/gurl.h"
-
-namespace ppapi {
-struct DeviceRefData;
-
-namespace host {
-class ResourceHost;
-}
-
-}  // namespace ppapi
-
-namespace IPC {
-class Message;
-}
-
-namespace content {
-
-// Resource hosts that support device enumeration can use this class to filter
-// and process PpapiHostMsg_DeviceEnumeration_* messages.
-// TODO(yzshen): Refactor ppapi::host::ResourceMessageFilter to support message
-// handling on the same thread, and then derive this class from the filter
-// class.
-class CONTENT_EXPORT PepperDeviceEnumerationHostHelper {
- public:
-  class Delegate {
-   public:
-    virtual ~Delegate() {}
-
-    using DevicesCallback = base::RepeatingCallback<void(
-        const std::vector<ppapi::DeviceRefData>& /* devices */)>;
-    using DevicesOnceCallback = base::OnceCallback<void(
-        const std::vector<ppapi::DeviceRefData>& /* devices */)>;
-
-    // Enumerates devices of the specified type.
-    virtual void EnumerateDevices(PP_DeviceType_Dev type,
-                                  DevicesOnceCallback callback) = 0;
-
-    // Starts monitoring devices of the specified |type|. Returns a
-    // subscription ID that must be used to stop monitoring for the device
-    // |type|. Does not invoke |callback| synchronously. |callback| is invoked
-    // when device changes of the specified |type| occur.
-    virtual size_t StartMonitoringDevices(PP_DeviceType_Dev type,
-                                          const DevicesCallback& callback) = 0;
-
-    // Stops monitoring devices of the specified |type|. The
-    // |subscription_id| is the return value of StartMonitoringDevices.
-    virtual void StopMonitoringDevices(PP_DeviceType_Dev type,
-                                       size_t subscription_id) = 0;
-  };
-
-  // |resource_host| and |delegate| must outlive this object.
-  PepperDeviceEnumerationHostHelper(ppapi::host::ResourceHost* resource_host,
-                                    base::WeakPtr<Delegate> delegate,
-                                    PP_DeviceType_Dev device_type,
-                                    const GURL& document_url);
-
-  PepperDeviceEnumerationHostHelper(const PepperDeviceEnumerationHostHelper&) =
-      delete;
-  PepperDeviceEnumerationHostHelper& operator=(
-      const PepperDeviceEnumerationHostHelper&) = delete;
-
-  ~PepperDeviceEnumerationHostHelper();
-
-  // Returns true if the message has been handled.
-  bool HandleResourceMessage(const IPC::Message& msg,
-                             ppapi::host::HostMessageContext* context,
-                             int32_t* result);
-
- private:
-  class ScopedEnumerationRequest;
-  class ScopedMonitoringRequest;
-
-  // Has a different signature than HandleResourceMessage() in order to utilize
-  // message dispatching macros.
-  int32_t InternalHandleResourceMessage(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context,
-      bool* handled);
-
-  int32_t OnEnumerateDevices(ppapi::host::HostMessageContext* context);
-  int32_t OnMonitorDeviceChange(ppapi::host::HostMessageContext* context,
-                                uint32_t callback_id);
-  int32_t OnStopMonitoringDeviceChange(
-      ppapi::host::HostMessageContext* context);
-
-  void OnEnumerateDevicesComplete(
-      const std::vector<ppapi::DeviceRefData>& devices);
-  void OnNotifyDeviceChange(uint32_t callback_id,
-                            const std::vector<ppapi::DeviceRefData>& devices);
-
-  // Non-owning pointers.
-  raw_ptr<ppapi::host::ResourceHost> resource_host_;
-  base::WeakPtr<Delegate> delegate_;
-
-  PP_DeviceType_Dev device_type_;
-
-  std::unique_ptr<ScopedEnumerationRequest> enumerate_;
-  std::unique_ptr<ScopedMonitoringRequest> monitor_;
-
-  ppapi::host::ReplyMessageContext enumerate_devices_context_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_DEVICE_ENUMERATION_HOST_HELPER_H_
diff --git a/content/renderer/pepper/pepper_device_enumeration_host_helper_unittest.cc b/content/renderer/pepper/pepper_device_enumeration_host_helper_unittest.cc
deleted file mode 100644
index 87822a31..0000000
--- a/content/renderer/pepper/pepper_device_enumeration_host_helper_unittest.cc
+++ /dev/null
@@ -1,251 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <map>
-
-#include "base/check.h"
-#include "base/compiler_specific.h"
-#include "base/memory/weak_ptr.h"
-#include "base/run_loop.h"
-#include "base/test/task_environment.h"
-#include "content/renderer/pepper/pepper_device_enumeration_host_helper.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/host/resource_host.h"
-#include "ppapi/proxy/ppapi_message_utils.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/proxy/resource_message_params.h"
-#include "ppapi/proxy/resource_message_test_sink.h"
-#include "ppapi/shared_impl/ppapi_permissions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "url/gurl.h"
-
-namespace content {
-
-namespace {
-
-std::vector<ppapi::DeviceRefData> TestEnumerationData() {
-  std::vector<ppapi::DeviceRefData> data;
-  ppapi::DeviceRefData data_item;
-  data_item.type = PP_DEVICETYPE_DEV_AUDIOCAPTURE;
-  data_item.name = "name_1";
-  data_item.id = "id_1";
-  data.push_back(data_item);
-  data_item.type = PP_DEVICETYPE_DEV_VIDEOCAPTURE;
-  data_item.name = "name_2";
-  data_item.id = "id_2";
-  data.push_back(data_item);
-
-  return data;
-}
-
-class TestDelegate : public PepperDeviceEnumerationHostHelper::Delegate {
- public:
-  TestDelegate() : last_used_id_(0u) {}
-
-  TestDelegate(const TestDelegate&) = delete;
-  TestDelegate& operator=(const TestDelegate&) = delete;
-
-  ~TestDelegate() override { CHECK(monitoring_callbacks_.empty()); }
-
-  void EnumerateDevices(PP_DeviceType_Dev /* type */,
-                        DevicesOnceCallback callback) override {
-    std::move(callback).Run(TestEnumerationData());
-  }
-
-  size_t StartMonitoringDevices(PP_DeviceType_Dev /* type */,
-                                const DevicesCallback& callback) override {
-    last_used_id_++;
-    monitoring_callbacks_[last_used_id_] = callback;
-    return last_used_id_;
-  }
-
-  void StopMonitoringDevices(PP_DeviceType_Dev /* type */,
-                             size_t subscription_id) override {
-    auto iter = monitoring_callbacks_.find(subscription_id);
-    CHECK(iter != monitoring_callbacks_.end());
-    monitoring_callbacks_.erase(iter);
-  }
-
-  // Returns false if |request_id| is not found.
-  bool SimulateDevicesChanged(
-      size_t subscription_id,
-      const std::vector<ppapi::DeviceRefData>& devices) {
-    auto iter = monitoring_callbacks_.find(subscription_id);
-    if (iter == monitoring_callbacks_.end())
-      return false;
-
-    iter->second.Run(devices);
-    return true;
-  }
-
-  size_t GetRegisteredCallbackCount() const {
-    return monitoring_callbacks_.size();
-  }
-
-  size_t last_used_id() const { return last_used_id_; }
-
-  base::WeakPtr<TestDelegate> AsWeakPtr() {
-    return weak_ptr_factory_.GetWeakPtr();
-  }
-
- private:
-  std::map<size_t, DevicesCallback> monitoring_callbacks_;
-  size_t last_used_id_;
-  base::WeakPtrFactory<TestDelegate> weak_ptr_factory_{this};
-};
-
-class PepperDeviceEnumerationHostHelperTest : public testing::Test {
- public:
-  PepperDeviceEnumerationHostHelperTest(
-      const PepperDeviceEnumerationHostHelperTest&) = delete;
-  PepperDeviceEnumerationHostHelperTest& operator=(
-      const PepperDeviceEnumerationHostHelperTest&) = delete;
-
- protected:
-  PepperDeviceEnumerationHostHelperTest()
-      : ppapi_host_(&sink_, ppapi::PpapiPermissions()),
-        resource_host_(&ppapi_host_, 12345, 67890),
-        device_enumeration_(&resource_host_,
-                            delegate_.AsWeakPtr(),
-                            PP_DEVICETYPE_DEV_AUDIOCAPTURE,
-                            GURL("http://example.com")) {}
-
-  ~PepperDeviceEnumerationHostHelperTest() override {}
-
-  void SimulateMonitorDeviceChangeReceived(uint32_t callback_id) {
-    PpapiHostMsg_DeviceEnumeration_MonitorDeviceChange msg(callback_id);
-    ppapi::proxy::ResourceMessageCallParams call_params(
-        resource_host_.pp_resource(), 123);
-    ppapi::host::HostMessageContext context(call_params);
-    int32_t result = PP_ERROR_FAILED;
-    ASSERT_TRUE(
-        device_enumeration_.HandleResourceMessage(msg, &context, &result));
-    EXPECT_EQ(PP_OK, result);
-  }
-
-  void CheckNotifyDeviceChangeMessage(
-      uint32_t callback_id,
-      const std::vector<ppapi::DeviceRefData>& expected) {
-    ppapi::proxy::ResourceMessageReplyParams reply_params;
-    IPC::Message reply_msg;
-    ASSERT_TRUE(sink_.GetFirstResourceReplyMatching(
-        PpapiPluginMsg_DeviceEnumeration_NotifyDeviceChange::ID,
-        &reply_params,
-        &reply_msg));
-    sink_.ClearMessages();
-
-    EXPECT_EQ(PP_OK, reply_params.result());
-
-    uint32_t reply_callback_id = 0;
-    std::vector<ppapi::DeviceRefData> reply_data;
-    ASSERT_TRUE(ppapi::UnpackMessage<
-        PpapiPluginMsg_DeviceEnumeration_NotifyDeviceChange>(
-        reply_msg, &reply_callback_id, &reply_data));
-    EXPECT_EQ(callback_id, reply_callback_id);
-    EXPECT_EQ(expected, reply_data);
-  }
-
-  TestDelegate delegate_;
-  ppapi::proxy::ResourceMessageTestSink sink_;
-  ppapi::host::PpapiHost ppapi_host_;
-  ppapi::host::ResourceHost resource_host_;
-  PepperDeviceEnumerationHostHelper device_enumeration_;
-  base::test::SingleThreadTaskEnvironment
-      task_environment_;  // required for async calls to work.
-};
-
-}  // namespace
-
-TEST_F(PepperDeviceEnumerationHostHelperTest, EnumerateDevices) {
-  PpapiHostMsg_DeviceEnumeration_EnumerateDevices msg;
-  ppapi::proxy::ResourceMessageCallParams call_params(
-      resource_host_.pp_resource(), 123);
-  ppapi::host::HostMessageContext context(call_params);
-  int32_t result = PP_ERROR_FAILED;
-  ASSERT_TRUE(
-      device_enumeration_.HandleResourceMessage(msg, &context, &result));
-  EXPECT_EQ(PP_OK_COMPLETIONPENDING, result);
-  base::RunLoop().RunUntilIdle();
-
-  // A reply message should have been sent to the test sink.
-  ppapi::proxy::ResourceMessageReplyParams reply_params;
-  IPC::Message reply_msg;
-  ASSERT_TRUE(sink_.GetFirstResourceReplyMatching(
-      PpapiPluginMsg_DeviceEnumeration_EnumerateDevicesReply::ID,
-      &reply_params,
-      &reply_msg));
-
-  EXPECT_EQ(call_params.sequence(), reply_params.sequence());
-  EXPECT_EQ(PP_OK, reply_params.result());
-
-  std::vector<ppapi::DeviceRefData> reply_data;
-  ASSERT_TRUE(ppapi::UnpackMessage<
-      PpapiPluginMsg_DeviceEnumeration_EnumerateDevicesReply>(reply_msg,
-                                                              &reply_data));
-  EXPECT_EQ(TestEnumerationData(), reply_data);
-}
-
-TEST_F(PepperDeviceEnumerationHostHelperTest, MonitorDeviceChange) {
-  uint32_t callback_id = 456;
-  SimulateMonitorDeviceChangeReceived(callback_id);
-
-  EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount());
-  size_t request_id = delegate_.last_used_id();
-
-  std::vector<ppapi::DeviceRefData> data;
-  ASSERT_TRUE(delegate_.SimulateDevicesChanged(request_id, data));
-
-  // StopEnumerateDevices() shouldn't be called because the MonitorDeviceChange
-  // message is a persistent request.
-  EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount());
-
-  CheckNotifyDeviceChangeMessage(callback_id, data);
-
-  ppapi::DeviceRefData data_item;
-  data_item.type = PP_DEVICETYPE_DEV_AUDIOCAPTURE;
-  data_item.name = "name_1";
-  data_item.id = "id_1";
-  data.push_back(data_item);
-  data_item.type = PP_DEVICETYPE_DEV_VIDEOCAPTURE;
-  data_item.name = "name_2";
-  data_item.id = "id_2";
-  data.push_back(data_item);
-  ASSERT_TRUE(delegate_.SimulateDevicesChanged(request_id, data));
-  EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount());
-
-  CheckNotifyDeviceChangeMessage(callback_id, data);
-
-  uint32_t callback_id2 = 789;
-  SimulateMonitorDeviceChangeReceived(callback_id2);
-
-  // StopEnumerateDevice() should have been called for the previous request.
-  EXPECT_EQ(1U, delegate_.GetRegisteredCallbackCount());
-  size_t request_id2 = delegate_.last_used_id();
-
-  data_item.type = PP_DEVICETYPE_DEV_AUDIOCAPTURE;
-  data_item.name = "name_3";
-  data_item.id = "id_3";
-  data.push_back(data_item);
-  ASSERT_TRUE(delegate_.SimulateDevicesChanged(request_id2, data));
-
-  CheckNotifyDeviceChangeMessage(callback_id2, data);
-
-  PpapiHostMsg_DeviceEnumeration_StopMonitoringDeviceChange msg;
-  ppapi::proxy::ResourceMessageCallParams call_params(
-      resource_host_.pp_resource(), 123);
-  ppapi::host::HostMessageContext context(call_params);
-  int32_t result = PP_ERROR_FAILED;
-  ASSERT_TRUE(
-      device_enumeration_.HandleResourceMessage(msg, &context, &result));
-  EXPECT_EQ(PP_OK, result);
-
-  EXPECT_EQ(0U, delegate_.GetRegisteredCallbackCount());
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_file_chooser_host.cc b/content/renderer/pepper/pepper_file_chooser_host.cc
deleted file mode 100644
index c47ebb9..0000000
--- a/content/renderer/pepper/pepper_file_chooser_host.cc
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_file_chooser_host.h"
-
-#include <stddef.h>
-
-#include <vector>
-
-#include "base/files/file_path.h"
-#include "base/functional/bind.h"
-#include "base/strings/utf_string_conversions.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/pepper_file_ref_renderer_host.h"
-#include "content/renderer/render_frame_impl.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h"
-#include "third_party/blink/public/platform/browser_interface_broker_proxy.h"
-#include "third_party/blink/public/platform/file_path_conversion.h"
-#include "third_party/blink/public/platform/web_string.h"
-
-namespace content {
-
-using blink::mojom::FileChooserParams;
-
-class PepperFileChooserHost::CompletionHandler {
- public:
-  explicit CompletionHandler(const base::WeakPtr<PepperFileChooserHost>& host)
-      : host_(host) {}
-
-  CompletionHandler(const CompletionHandler&) = delete;
-  CompletionHandler& operator=(const CompletionHandler&) = delete;
-
-  ~CompletionHandler() {}
-
-  bool OpenFileChooser(RenderFrameImpl* render_frame,
-                       blink::mojom::FileChooserParamsPtr params) {
-    if (!render_frame)
-      return false;
-    render_frame->GetBrowserInterfaceBroker().GetInterface(
-        file_chooser_.BindNewPipeAndPassReceiver());
-    file_chooser_.set_disconnect_handler(base::BindOnce(
-        &CompletionHandler::OnConnectionError, base::Unretained(this)));
-    file_chooser_->OpenFileChooser(
-        std::move(params), base::BindOnce(&CompletionHandler::DidChooseFiles,
-                                          base::Unretained(this)));
-    return true;
-  }
-
-  void DidChooseFiles(blink::mojom::FileChooserResultPtr result) {
-    if (host_.get()) {
-      std::vector<PepperFileChooserHost::ChosenFileInfo> files;
-      if (result) {
-        std::vector<blink::mojom::FileChooserFileInfoPtr> mojo_files =
-            std::move(result->files);
-        for (size_t i = 0; i < mojo_files.size(); i++) {
-          base::FilePath file_path =
-              mojo_files[i]->get_native_file()->file_path;
-          // Drop files of which names can not be converted to Unicode. We
-          // can't expose such files in Flash.
-          if (blink::FilePathToWebString(file_path).IsEmpty())
-            continue;
-          files.push_back(PepperFileChooserHost::ChosenFileInfo(
-              file_path, base::UTF16ToUTF8(
-                             mojo_files[i]->get_native_file()->display_name)));
-        }
-      }
-      host_->StoreChosenFiles(files);
-    }
-
-    // It is the responsibility of this method to delete the instance.
-    delete this;
-  }
-
- private:
-  void OnConnectionError() {
-    if (host_)
-      host_->StoreChosenFiles(
-          std::vector<PepperFileChooserHost::ChosenFileInfo>());
-    delete this;
-  }
-
-  base::WeakPtr<PepperFileChooserHost> host_;
-  mojo::Remote<blink::mojom::FileChooser> file_chooser_;
-};
-
-PepperFileChooserHost::ChosenFileInfo::ChosenFileInfo(
-    const base::FilePath& file_path,
-    const std::string& display_name)
-    : file_path(file_path), display_name(display_name) {}
-
-PepperFileChooserHost::PepperFileChooserHost(RendererPpapiHost* host,
-                                             PP_Instance instance,
-                                             PP_Resource resource)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      renderer_ppapi_host_(host),
-      handler_(nullptr) {}
-
-PepperFileChooserHost::~PepperFileChooserHost() {}
-
-int32_t PepperFileChooserHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    ppapi::host::HostMessageContext* context) {
-  PPAPI_BEGIN_MESSAGE_MAP(PepperFileChooserHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_FileChooser_Show, OnShow)
-  PPAPI_END_MESSAGE_MAP()
-  return PP_ERROR_FAILED;
-}
-
-void PepperFileChooserHost::StoreChosenFiles(
-    const std::vector<ChosenFileInfo>& files) {
-  std::vector<IPC::Message> create_msgs;
-  std::vector<base::FilePath> file_paths;
-  std::vector<std::string> display_names;
-  for (size_t i = 0; i < files.size(); i++) {
-    base::FilePath file_path = files[i].file_path;
-    file_paths.push_back(file_path);
-    create_msgs.push_back(PpapiHostMsg_FileRef_CreateForRawFS(file_path));
-    display_names.push_back(files[i].display_name);
-  }
-
-  if (!files.empty()) {
-    renderer_ppapi_host_->CreateBrowserResourceHosts(
-        pp_instance(), create_msgs,
-        base::BindOnce(&PepperFileChooserHost::DidCreateResourceHosts,
-                       weak_factory_.GetWeakPtr(), file_paths, display_names));
-  } else {
-    reply_context_.params.set_result(PP_ERROR_USERCANCEL);
-    std::vector<ppapi::FileRefCreateInfo> chosen_files;
-    host()->SendReply(reply_context_,
-                      PpapiPluginMsg_FileChooser_ShowReply(chosen_files));
-    reply_context_ = ppapi::host::ReplyMessageContext();
-    handler_ = nullptr;  // Handler deletes itself.
-  }
-}
-
-int32_t PepperFileChooserHost::OnShow(
-    ppapi::host::HostMessageContext* context,
-    bool save_as,
-    bool open_multiple,
-    const std::string& suggested_file_name,
-    const std::vector<std::string>& accept_mime_types) {
-  if (handler_)
-    return PP_ERROR_INPROGRESS;  // Already pending.
-
-  if (!host()->permissions().HasPermission(
-          ppapi::PERMISSION_BYPASS_USER_GESTURE) &&
-      !renderer_ppapi_host_->HasUserGesture(pp_instance())) {
-    return PP_ERROR_NO_USER_GESTURE;
-  }
-
-  auto params = FileChooserParams::New();
-  if (save_as) {
-    params->mode = FileChooserParams::Mode::kSave;
-    params->default_file_name =
-        base::FilePath::FromUTF8Unsafe(suggested_file_name).BaseName();
-  } else {
-    params->mode = open_multiple ? FileChooserParams::Mode::kOpenMultiple
-                                 : FileChooserParams::Mode::kOpen;
-  }
-  params->accept_types.reserve(accept_mime_types.size());
-  for (const auto& mime_type : accept_mime_types)
-    params->accept_types.push_back(base::UTF8ToUTF16(mime_type));
-  params->need_local_path = true;
-
-  params->requestor = renderer_ppapi_host_->GetDocumentURL(pp_instance());
-
-  handler_ = new CompletionHandler(weak_factory_.GetWeakPtr());
-  RenderFrameImpl* render_frame = static_cast<RenderFrameImpl*>(
-      renderer_ppapi_host_->GetRenderFrameForInstance(pp_instance()));
-
-  if (!handler_->OpenFileChooser(render_frame, std::move(params))) {
-    delete handler_;
-    handler_ = nullptr;
-    return PP_ERROR_NOACCESS;
-  }
-
-  reply_context_ = context->MakeReplyMessageContext();
-  return PP_OK_COMPLETIONPENDING;
-}
-
-void PepperFileChooserHost::DidCreateResourceHosts(
-    const std::vector<base::FilePath>& file_paths,
-    const std::vector<std::string>& display_names,
-    const std::vector<int>& browser_ids) {
-  DCHECK(file_paths.size() == display_names.size());
-  DCHECK(file_paths.size() == browser_ids.size());
-
-  std::vector<ppapi::FileRefCreateInfo> chosen_files;
-  for (size_t i = 0; i < browser_ids.size(); ++i) {
-    PepperFileRefRendererHost* renderer_host = new PepperFileRefRendererHost(
-        renderer_ppapi_host_, pp_instance(), 0, file_paths[i]);
-    int renderer_id =
-        renderer_ppapi_host_->GetPpapiHost()->AddPendingResourceHost(
-            std::unique_ptr<ppapi::host::ResourceHost>(renderer_host));
-    ppapi::FileRefCreateInfo info = ppapi::MakeExternalFileRefCreateInfo(
-        file_paths[i], display_names[i], browser_ids[i], renderer_id);
-    chosen_files.push_back(info);
-  }
-
-  reply_context_.params.set_result(PP_OK);
-  host()->SendReply(reply_context_,
-                    PpapiPluginMsg_FileChooser_ShowReply(chosen_files));
-  reply_context_ = ppapi::host::ReplyMessageContext();
-  handler_ = nullptr;  // Handler deletes itself.
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_file_chooser_host.h b/content/renderer/pepper/pepper_file_chooser_host.h
deleted file mode 100644
index 774d7e83..0000000
--- a/content/renderer/pepper/pepper_file_chooser_host.h
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_FILE_CHOOSER_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_FILE_CHOOSER_HOST_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "content/common/content_export.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/resource_host.h"
-#include "ppapi/proxy/resource_message_params.h"
-
-namespace content {
-
-class RendererPpapiHost;
-
-class CONTENT_EXPORT PepperFileChooserHost final
-    : public ppapi::host::ResourceHost {
- public:
-  // Structure to store the information about chosen files.
-  struct ChosenFileInfo {
-    ChosenFileInfo(const base::FilePath& file_path,
-                   const std::string& display_name);
-    base::FilePath file_path;
-    std::string display_name;  // May be empty.
-  };
-
-  PepperFileChooserHost(RendererPpapiHost* host,
-                        PP_Instance instance,
-                        PP_Resource resource);
-
-  PepperFileChooserHost(const PepperFileChooserHost&) = delete;
-  PepperFileChooserHost& operator=(const PepperFileChooserHost&) = delete;
-
-  ~PepperFileChooserHost() override;
-
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-
-  void StoreChosenFiles(const std::vector<ChosenFileInfo>& files);
-
- private:
-  class CompletionHandler;
-
-  int32_t OnShow(ppapi::host::HostMessageContext* context,
-                 bool save_as,
-                 bool open_multiple,
-                 const std::string& suggested_file_name,
-                 const std::vector<std::string>& accept_mime_types);
-
-  void DidCreateResourceHosts(const std::vector<base::FilePath>& file_paths,
-                              const std::vector<std::string>& display_names,
-                              const std::vector<int>& browser_ids);
-
-  // Non-owning pointer.
-  raw_ptr<RendererPpapiHost> renderer_ppapi_host_;
-
-  ppapi::host::ReplyMessageContext reply_context_;
-  raw_ptr<CompletionHandler, DanglingUntriaged> handler_;
-
-  base::WeakPtrFactory<PepperFileChooserHost> weak_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_FILE_CHOOSER_HOST_H_
diff --git a/content/renderer/pepper/pepper_file_chooser_host_unittest.cc b/content/renderer/pepper/pepper_file_chooser_host_unittest.cc
deleted file mode 100644
index 37e4160..0000000
--- a/content/renderer/pepper/pepper_file_chooser_host_unittest.cc
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_file_chooser_host.h"
-
-#include <stdint.h>
-
-#include <memory>
-#include <tuple>
-#include <utility>
-
-#include "base/files/file_path.h"
-#include "base/functional/bind.h"
-#include "base/memory/raw_ptr.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build/build_config.h"
-#include "content/public/test/render_view_test.h"
-#include "content/public/test/test_utils.h"
-#include "content/renderer/pepper/mock_renderer_ppapi_host.h"
-#include "content/renderer/render_frame_impl.h"
-#include "content/test/test_content_client.h"
-#include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "mojo/public/cpp/bindings/receiver_set.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/proxy/resource_message_params.h"
-#include "ppapi/proxy/resource_message_test_sink.h"
-#include "ppapi/shared_impl/file_ref_create_info.h"
-#include "ppapi/shared_impl/ppapi_permissions.h"
-#include "ppapi/shared_impl/proxy_lock.h"
-#include "ppapi/shared_impl/resource_tracker.h"
-#include "ppapi/shared_impl/test_globals.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h"
-
-namespace content {
-
-using blink::mojom::FileChooser;
-using blink::mojom::FileChooserFileInfo;
-using blink::mojom::FileChooserFileInfoPtr;
-using blink::mojom::FileChooserParams;
-using blink::mojom::FileChooserParamsPtr;
-
-namespace {
-
-class MockFileChooser : public FileChooser {
- public:
-  MockFileChooser(const blink::BrowserInterfaceBrokerProxy* broker,
-                  base::OnceClosure reached_callback)
-      : reached_callback_(std::move(reached_callback)) {
-    broker->SetBinderForTesting(
-        FileChooser::Name_,
-        base::BindRepeating(&MockFileChooser::BindFileChooserReceiver,
-                            base::Unretained(this)));
-    broker_ = broker;
-  }
-
-  ~MockFileChooser() override {
-    broker_->SetBinderForTesting(FileChooser::Name_, {});
-  }
-
-  const FileChooserParams& params() const {
-    DCHECK(params_);
-    return *params_;
-  }
-
-  void ResponseOnOpenFileChooser(std::vector<FileChooserFileInfoPtr> files) {
-    DCHECK(callback_);
-    DCHECK(params_);
-    std::move(callback_).Run(blink::mojom::FileChooserResult::New(
-        std::move(files), base::FilePath()));
-    receivers_.FlushForTesting();
-  }
-
- private:
-  void BindFileChooserReceiver(mojo::ScopedMessagePipeHandle handle) {
-    receivers_.Add(this, mojo::PendingReceiver<FileChooser>(std::move(handle)));
-  }
-
-  void OpenFileChooser(FileChooserParamsPtr params,
-                       OpenFileChooserCallback callback) override {
-    callback_ = std::move(callback);
-    params_ = std::move(params);
-    std::move(reached_callback_).Run();
-  }
-
-  void EnumerateChosenDirectory(
-      const base::FilePath& directory_path,
-      EnumerateChosenDirectoryCallback callback) override {}
-
-  raw_ptr<const blink::BrowserInterfaceBrokerProxy> broker_;
-  mojo::ReceiverSet<FileChooser> receivers_;
-  OpenFileChooserCallback callback_;
-  FileChooserParamsPtr params_;
-  base::OnceClosure reached_callback_;
-};
-
-class PepperFileChooserHostTest : public RenderViewTest {
- public:
-  PepperFileChooserHostTest() : pp_instance_(123456) {}
-
-  void SetUp() override {
-    SetContentClient(&client_);
-    RenderViewTest::SetUp();
-
-    globals_.GetResourceTracker()->DidCreateInstance(pp_instance_);
-    mock_file_chooser_ = std::make_unique<MockFileChooser>(
-        &GetMainRenderFrame()->GetBrowserInterfaceBroker(),
-        run_loop_.QuitClosure());
-  }
-  void TearDown() override {
-    mock_file_chooser_.reset();
-    globals_.GetResourceTracker()->DidDeleteInstance(pp_instance_);
-
-    RenderViewTest::TearDown();
-  }
-
-  PP_Instance pp_instance() const { return pp_instance_; }
-  MockFileChooser* mock_file_chooser() const {
-    return mock_file_chooser_.get();
-  }
-
- protected:
-  base::RunLoop run_loop_;
-
- private:
-  PP_Instance pp_instance_;
-
-  // Disables locking for the duration of the test.
-  ppapi::ProxyLock::LockingDisablerForTest disable_locking_;
-  ppapi::TestGlobals globals_;
-  TestContentClient client_;
-
-  std::unique_ptr<MockFileChooser> mock_file_chooser_;
-};
-
-}  // namespace
-
-TEST_F(PepperFileChooserHostTest, Show) {
-  PP_Resource pp_resource = 123;
-
-  MockRendererPpapiHost host(GetMainRenderFrame(), pp_instance());
-  PepperFileChooserHost chooser(&host, pp_instance(), pp_resource);
-
-  // Say there's a user gesture.
-  host.set_has_user_gesture(true);
-
-  std::vector<std::string> accept;
-  accept.push_back("text/plain");
-  PpapiHostMsg_FileChooser_Show show_msg(false, false, std::string(), accept);
-
-  ppapi::proxy::ResourceMessageCallParams call_params(pp_resource, 0);
-  ppapi::host::HostMessageContext context(call_params);
-  int32_t result = chooser.OnResourceMessageReceived(show_msg, &context);
-  EXPECT_EQ(PP_OK_COMPLETIONPENDING, result);
-
-  run_loop_.Run();
-  // The render view should have sent a chooser request to the browser
-
-  // Basic validation of request.
-  auto& params = mock_file_chooser()->params();
-  EXPECT_EQ(FileChooserParams::Mode::kOpen, params.mode);
-  ASSERT_EQ(1u, params.accept_types.size());
-  EXPECT_EQ(accept[0], base::UTF16ToUTF8(params.accept_types[0]));
-
-  // Send a chooser reply to the render view. Note our reply path has to have a
-  // path separator so we include both a Unix and a Windows one.
-  std::vector<blink::mojom::FileChooserFileInfoPtr> selected_info_vector;
-  std::u16string display_name = u"Hello, world";
-  selected_info_vector.push_back(
-      blink::mojom::FileChooserFileInfo::NewNativeFile(
-          blink::mojom::NativeFileInfo::New(
-              base::FilePath(FILE_PATH_LITERAL("myp\\ath/foo")), display_name,
-              std::vector<std::u16string>())));
-  mock_file_chooser()->ResponseOnOpenFileChooser(
-      std::move(selected_info_vector));
-
-  // This should have sent the Pepper reply to our test sink.
-  ppapi::proxy::ResourceMessageReplyParams reply_params;
-  IPC::Message reply_msg;
-  ASSERT_TRUE(host.sink().GetFirstResourceReplyMatching(
-      PpapiPluginMsg_FileChooser_ShowReply::ID, &reply_params, &reply_msg));
-
-  // Basic validation of reply.
-  EXPECT_EQ(call_params.sequence(), reply_params.sequence());
-  EXPECT_EQ(PP_OK, reply_params.result());
-  PpapiPluginMsg_FileChooser_ShowReply::Schema::Param reply_msg_param;
-  ASSERT_TRUE(
-      PpapiPluginMsg_FileChooser_ShowReply::Read(&reply_msg, &reply_msg_param));
-  const std::vector<ppapi::FileRefCreateInfo>& chooser_results =
-      std::get<0>(reply_msg_param);
-  ASSERT_EQ(1u, chooser_results.size());
-  EXPECT_EQ(base::UTF16ToUTF8(display_name), chooser_results[0].display_name);
-}
-
-TEST_F(PepperFileChooserHostTest, NoUserGesture) {
-  PP_Resource pp_resource = 123;
-
-  MockRendererPpapiHost host(GetMainRenderFrame(), pp_instance());
-  PepperFileChooserHost chooser(&host, pp_instance(), pp_resource);
-
-  // Say there's no user gesture.
-  host.set_has_user_gesture(false);
-
-  std::vector<std::string> accept;
-  accept.push_back("text/plain");
-  PpapiHostMsg_FileChooser_Show show_msg(false, false, std::string(), accept);
-
-  ppapi::proxy::ResourceMessageCallParams call_params(pp_resource, 0);
-  ppapi::host::HostMessageContext context(call_params);
-  int32_t result = chooser.OnResourceMessageReceived(show_msg, &context);
-  EXPECT_EQ(PP_ERROR_NO_USER_GESTURE, result);
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_file_ref_renderer_host.cc b/content/renderer/pepper/pepper_file_ref_renderer_host.cc
deleted file mode 100644
index e1498b7..0000000
--- a/content/renderer/pepper/pepper_file_ref_renderer_host.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_file_ref_renderer_host.h"
-
-#include <string>
-
-#include "base/strings/escape.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/shared_impl/file_ref_util.h"
-
-namespace content {
-
-PepperFileRefRendererHost::PepperFileRefRendererHost(
-    RendererPpapiHost* host,
-    PP_Instance instance,
-    PP_Resource resource,
-    PP_Resource file_system,
-    const std::string& internal_path)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      file_system_type_(PP_FILESYSTEMTYPE_INVALID),
-      internal_path_(internal_path) {
-  if (!ppapi::IsValidInternalPath(internal_path))
-    return;
-  ResourceHost* fs_host = host->GetPpapiHost()->GetResourceHost(file_system);
-  if (fs_host && fs_host->IsFileSystemHost()) {
-    fs_host_ = static_cast<PepperFileSystemHost*>(fs_host)->AsWeakPtr();
-    file_system_type_ = fs_host_->GetType();
-  }
-}
-
-PepperFileRefRendererHost::PepperFileRefRendererHost(
-    RendererPpapiHost* host,
-    PP_Instance instance,
-    PP_Resource resource,
-    const base::FilePath& external_path)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      file_system_type_(PP_FILESYSTEMTYPE_EXTERNAL),
-      external_path_(external_path) {
-  if (!ppapi::IsValidExternalPath(external_path))
-    file_system_type_ = PP_FILESYSTEMTYPE_INVALID;
-}
-
-PepperFileRefRendererHost::~PepperFileRefRendererHost() {}
-
-PP_FileSystemType PepperFileRefRendererHost::GetFileSystemType() const {
-  return file_system_type_;
-}
-
-GURL PepperFileRefRendererHost::GetFileSystemURL() const {
-  if (fs_host_.get() && fs_host_->IsOpened() &&
-      fs_host_->GetRootUrl().is_valid()) {
-    CHECK(!internal_path_.empty() && internal_path_[0] == '/');
-    // We strip off the leading slash when passing the URL to Resolve().
-    // Internal paths are required to be absolute, so we can require this.
-    return fs_host_->GetRootUrl().Resolve(
-        base::EscapePath(internal_path_.substr(1)));
-  }
-  return GURL();
-}
-
-base::FilePath PepperFileRefRendererHost::GetExternalFilePath() const {
-  if (file_system_type_ != PP_FILESYSTEMTYPE_EXTERNAL)
-    return base::FilePath();
-  return external_path_;
-}
-
-int32_t PepperFileRefRendererHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    ppapi::host::HostMessageContext* context) {
-  // We don't handle any messages from the plugin in this host.
-  NOTREACHED();
-}
-
-bool PepperFileRefRendererHost::IsFileRefHost() { return true; }
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_file_ref_renderer_host.h b/content/renderer/pepper/pepper_file_ref_renderer_host.h
deleted file mode 100644
index a995c7e..0000000
--- a/content/renderer/pepper/pepper_file_ref_renderer_host.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_FILE_REF_RENDERER_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_FILE_REF_RENDERER_HOST_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "base/files/file_path.h"
-#include "base/memory/weak_ptr.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/pepper_file_system_host.h"
-#include "ipc/ipc_message.h"
-#include "ppapi/c/pp_file_info.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/c/pp_resource.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/resource_host.h"
-#include "url/gurl.h"
-
-namespace content {
-
-class PepperFileRefRendererHost : public ppapi::host::ResourceHost {
- public:
-  PepperFileRefRendererHost(RendererPpapiHost* host,
-                            PP_Instance instance,
-                            PP_Resource resource,
-                            PP_Resource file_system,
-                            const std::string& internal_path);
-
-  PepperFileRefRendererHost(RendererPpapiHost* host,
-                            PP_Instance instance,
-                            PP_Resource resource,
-                            const base::FilePath& external_path);
-
-  PepperFileRefRendererHost(const PepperFileRefRendererHost&) = delete;
-  PepperFileRefRendererHost& operator=(const PepperFileRefRendererHost&) =
-      delete;
-
-  ~PepperFileRefRendererHost() override;
-
-  PP_FileSystemType GetFileSystemType() const;
-  GURL GetFileSystemURL() const;
-  base::FilePath GetExternalFilePath() const;
-
-  // ppapi::host::ResourceHost override.
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-  bool IsFileRefHost() override;
-
- private:
-  PP_FileSystemType file_system_type_;
-  std::string internal_path_;
-  base::FilePath external_path_;
-  base::WeakPtr<PepperFileSystemHost> fs_host_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_FILE_REF_RENDERER_HOST_H_
diff --git a/content/renderer/pepper/pepper_file_system_host.cc b/content/renderer/pepper/pepper_file_system_host.cc
deleted file mode 100644
index ef4e882..0000000
--- a/content/renderer/pepper/pepper_file_system_host.cc
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_file_system_host.h"
-
-#include <optional>
-
-#include "base/functional/bind.h"
-#include "base/functional/callback.h"
-#include "content/common/pepper_file_util.h"
-#include "content/public/renderer/render_frame.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/shared_impl/file_system_util.h"
-#include "ppapi/shared_impl/file_type_conversion.h"
-#include "storage/common/file_system/file_system_util.h"
-#include "third_party/blink/public/mojom/filesystem/file_system.mojom.h"
-#include "third_party/blink/public/platform/browser_interface_broker_proxy.h"
-#include "third_party/blink/public/web/web_document.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-#include "third_party/blink/public/web/web_view.h"
-
-namespace content {
-
-namespace {
-
-std::optional<blink::mojom::FileSystemType>
-PepperFileSystemTypeToMojoFileSystemType(PP_FileSystemType type) {
-  switch (type) {
-    case PP_FILESYSTEMTYPE_LOCALTEMPORARY:
-      return blink::mojom::FileSystemType::kTemporary;
-    case PP_FILESYSTEMTYPE_LOCALPERSISTENT:
-      return blink::mojom::FileSystemType::kPersistent;
-    case PP_FILESYSTEMTYPE_EXTERNAL:
-      return blink::mojom::FileSystemType::kExternal;
-    default:
-      return std::nullopt;
-  }
-}
-
-}  // namespace
-
-PepperFileSystemHost::PepperFileSystemHost(RendererPpapiHost* host,
-                                           PP_Instance instance,
-                                           PP_Resource resource,
-                                           PP_FileSystemType type)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      renderer_ppapi_host_(host),
-      type_(type),
-      opened_(false),
-      called_open_(false) {}
-
-PepperFileSystemHost::PepperFileSystemHost(RendererPpapiHost* host,
-                                           PP_Instance instance,
-                                           PP_Resource resource,
-                                           const GURL& root_url,
-                                           PP_FileSystemType type)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      renderer_ppapi_host_(host),
-      type_(type),
-      opened_(true),
-      root_url_(root_url),
-      called_open_(true) {}
-
-PepperFileSystemHost::~PepperFileSystemHost() {}
-
-int32_t PepperFileSystemHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    ppapi::host::HostMessageContext* context) {
-  PPAPI_BEGIN_MESSAGE_MAP(PepperFileSystemHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_FileSystem_Open,
-                                      OnHostMsgOpen)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(
-        PpapiHostMsg_FileSystem_InitIsolatedFileSystem,
-        OnHostMsgInitIsolatedFileSystem)
-  PPAPI_END_MESSAGE_MAP()
-  return PP_ERROR_FAILED;
-}
-
-bool PepperFileSystemHost::IsFileSystemHost() { return true; }
-
-void PepperFileSystemHost::DidOpenFileSystem(
-    const std::string& /* name_unused */,
-    const GURL& root,
-    base::File::Error error) {
-  if (error != base::File::FILE_OK) {
-    DidFailOpenFileSystem(error);
-    return;
-  }
-  opened_ = true;
-  root_url_ = root;
-  reply_context_.params.set_result(PP_OK);
-  host()->SendReply(reply_context_, PpapiPluginMsg_FileSystem_OpenReply());
-  reply_context_ = ppapi::host::ReplyMessageContext();
-}
-
-void PepperFileSystemHost::DidFailOpenFileSystem(base::File::Error error) {
-  int32_t pp_error = ppapi::FileErrorToPepperError(error);
-  opened_ = (pp_error == PP_OK);
-  reply_context_.params.set_result(pp_error);
-  host()->SendReply(reply_context_, PpapiPluginMsg_FileSystem_OpenReply());
-  reply_context_ = ppapi::host::ReplyMessageContext();
-}
-
-int32_t PepperFileSystemHost::OnHostMsgOpen(
-    ppapi::host::HostMessageContext* context,
-    int64_t expected_size) {
-  // Not allow multiple opens.
-  if (called_open_)
-    return PP_ERROR_INPROGRESS;
-  called_open_ = true;
-
-  std::optional<blink::mojom::FileSystemType> file_system_type =
-      PepperFileSystemTypeToMojoFileSystemType(type_);
-  if (!file_system_type.has_value())
-    return PP_ERROR_FAILED;
-
-  GURL document_url = renderer_ppapi_host_->GetDocumentURL(pp_instance());
-  if (!document_url.is_valid())
-    return PP_ERROR_FAILED;
-
-  reply_context_ = context->MakeReplyMessageContext();
-  blink::mojom::FileSystemManager* file_system_manager = GetFileSystemManager();
-  if (file_system_manager == nullptr)
-    return PP_ERROR_FAILED;
-
-  file_system_manager->Open(
-      url::Origin::Create(document_url), file_system_type.value(),
-      base::BindOnce(&PepperFileSystemHost::DidOpenFileSystem,
-                     weak_ptr_factory_.GetWeakPtr()));
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperFileSystemHost::OnHostMsgInitIsolatedFileSystem(
-    ppapi::host::HostMessageContext* context,
-    const std::string& fsid,
-    PP_IsolatedFileSystemType_Private type) {
-  // Do not allow multiple opens.
-  if (called_open_)
-    return PP_ERROR_INPROGRESS;
-  called_open_ = true;
-
-  // Do a sanity check.
-  if (!storage::ValidateIsolatedFileSystemId(fsid))
-    return PP_ERROR_BADARGUMENT;
-
-  RenderFrame* frame =
-      renderer_ppapi_host_->GetRenderFrameForInstance(pp_instance());
-  if (!frame)
-    return PP_ERROR_FAILED;
-
-  url::Origin main_frame_origin(
-      frame->GetWebView()->MainFrame()->GetSecurityOrigin());
-  const std::string root_name = ppapi::IsolatedFileSystemTypeToRootName(type);
-  if (root_name.empty())
-    return PP_ERROR_BADARGUMENT;
-  root_url_ = GURL(storage::GetIsolatedFileSystemRootURIString(
-      main_frame_origin.GetURL(), fsid, root_name));
-  opened_ = true;
-  return PP_OK;
-}
-
-blink::mojom::FileSystemManager* PepperFileSystemHost::GetFileSystemManager() {
-  if (!file_system_manager_remote_) {
-    RenderFrame* frame =
-        renderer_ppapi_host_->GetRenderFrameForInstance(pp_instance());
-    if (!frame)
-      return nullptr;
-    frame->GetBrowserInterfaceBroker().GetInterface(
-        file_system_manager_remote_.BindNewPipeAndPassReceiver());
-  }
-  return file_system_manager_remote_.get();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_file_system_host.h b/content/renderer/pepper/pepper_file_system_host.h
deleted file mode 100644
index b1f1953..0000000
--- a/content/renderer/pepper/pepper_file_system_host.h
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_FILE_SYSTEM_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_FILE_SYSTEM_HOST_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "base/files/file.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "ppapi/c/pp_file_info.h"
-#include "ppapi/c/private/ppb_isolated_file_system_private.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/resource_host.h"
-#include "third_party/blink/public/mojom/filesystem/file_system.mojom.h"
-#include "url/gurl.h"
-
-namespace content {
-
-class RendererPpapiHost;
-
-class PepperFileSystemHost final : public ppapi::host::ResourceHost {
- public:
-  // Creates a new PepperFileSystemHost for a file system of a given |type|. The
-  // host will not be connected to any specific file system, and will need to
-  // subsequently be opened before use.
-  PepperFileSystemHost(RendererPpapiHost* host,
-                       PP_Instance instance,
-                       PP_Resource resource,
-                       PP_FileSystemType type);
-  // Creates a new PepperFileSystemHost with an existing file system at the
-  // given |root_url| and of the given |type|. The file system must already be
-  // opened. Once created, the PepperFileSystemHost is already opened for use.
-  PepperFileSystemHost(RendererPpapiHost* host,
-                       PP_Instance instance,
-                       PP_Resource resource,
-                       const GURL& root_url,
-                       PP_FileSystemType type);
-
-  PepperFileSystemHost(const PepperFileSystemHost&) = delete;
-  PepperFileSystemHost& operator=(const PepperFileSystemHost&) = delete;
-
-  ~PepperFileSystemHost() override;
-
-  // ppapi::host::ResourceHost override.
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-  bool IsFileSystemHost() override;
-
-  // Supports FileRefs direct access on the host side.
-  PP_FileSystemType GetType() const { return type_; }
-  bool IsOpened() const { return opened_; }
-  GURL GetRootUrl() const { return root_url_; }
-
-  base::WeakPtr<PepperFileSystemHost> AsWeakPtr() {
-    return weak_ptr_factory_.GetWeakPtr();
-  }
-
- private:
-  // Callback for OpenFileSystem.
-  void DidOpenFileSystem(const std::string& name_unused,
-                         const GURL& root,
-                         base::File::Error error);
-  void DidFailOpenFileSystem(base::File::Error error);
-
-  int32_t OnHostMsgOpen(ppapi::host::HostMessageContext* context,
-                        int64_t expected_size);
-  int32_t OnHostMsgInitIsolatedFileSystem(
-      ppapi::host::HostMessageContext* context,
-      const std::string& fsid,
-      PP_IsolatedFileSystemType_Private type);
-
-  blink::mojom::FileSystemManager* GetFileSystemManager();
-
-  raw_ptr<RendererPpapiHost> renderer_ppapi_host_;
-  ppapi::host::ReplyMessageContext reply_context_;
-
-  PP_FileSystemType type_;
-  bool opened_;  // whether open is successful.
-  GURL root_url_;
-  bool called_open_;  // whether open has been called.
-  mojo::Remote<blink::mojom::FileSystemManager> file_system_manager_remote_;
-
-  base::WeakPtrFactory<PepperFileSystemHost> weak_ptr_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_FILE_SYSTEM_HOST_H_
diff --git a/content/renderer/pepper/pepper_graphics_2d_host.cc b/content/renderer/pepper/pepper_graphics_2d_host.cc
deleted file mode 100644
index 3c0c2e70..0000000
--- a/content/renderer/pepper/pepper_graphics_2d_host.cc
+++ /dev/null
@@ -1,1040 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_graphics_2d_host.h"
-
-#include <stddef.h>
-
-#include <utility>
-
-#include "base/check.h"
-#include "base/command_line.h"
-#include "base/compiler_specific.h"
-#include "base/functional/bind.h"
-#include "base/location.h"
-#include "base/memory/read_only_shared_memory_region.h"
-#include "base/numerics/checked_math.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/trace_event/trace_event.h"
-#include "build/build_config.h"
-#include "cc/paint/paint_flags.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/common/resources/resource_sizes.h"
-#include "components/viz/common/resources/shared_image_format_utils.h"
-#include "content/public/renderer/ppapi_gfx_conversion.h"
-#include "content/public/renderer/render_thread.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/ppb_image_data_impl.h"
-#include "content/renderer/render_thread_impl.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/client_shared_image.h"
-#include "gpu/command_buffer/client/raster_interface.h"
-#include "gpu/command_buffer/common/capabilities.h"
-#include "gpu/command_buffer/common/shared_image_usage.h"
-#include "gpu/ipc/client/client_shared_image_interface.h"
-#include "ppapi/c/pp_bool.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/c/pp_rect.h"
-#include "ppapi/c/pp_resource.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/shared_impl/ppb_view_shared.h"
-#include "ppapi/thunk/enter.h"
-#include "services/viz/public/cpp/gpu/context_provider_command_buffer.h"
-#include "skia/ext/platform_canvas.h"
-#include "third_party/blink/public/common/switches.h"
-#include "third_party/khronos/GLES2/gl2.h"
-#include "third_party/khronos/GLES2/gl2ext.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "third_party/skia/include/core/SkSwizzle.h"
-#include "ui/gfx/blit.h"
-#include "ui/gfx/geometry/point_conversions.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/rect_conversions.h"
-#include "ui/gfx/geometry/size_conversions.h"
-#include "ui/gfx/geometry/skia_conversions.h"
-#include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
-
-#if BUILDFLAG(IS_MAC)
-#include "base/apple/scoped_cftyperef.h"
-#endif
-
-using ppapi::thunk::EnterResourceNoLock;
-using ppapi::thunk::PPB_ImageData_API;
-
-namespace content {
-
-namespace {
-
-const int64_t kOffscreenCallbackDelayMs = 1000 / 30;  // 30 fps
-
-// Converts a rect inside an image of the given dimensions. The rect may be
-// NULL to indicate it should be the entire image. If the rect is outside of
-// the image, this will do nothing and return false.
-bool ValidateAndConvertRect(const PP_Rect* rect,
-                            int image_width,
-                            int image_height,
-                            gfx::Rect* dest) {
-  if (!rect) {
-    // Use the entire image area.
-    *dest = gfx::Rect(0, 0, image_width, image_height);
-  } else {
-    // Validate the passed-in area.
-    if (rect->point.x < 0 || rect->point.y < 0 || rect->size.width <= 0 ||
-        rect->size.height <= 0)
-      return false;
-
-    // Check the max bounds, being careful of overflow.
-    if (static_cast<int64_t>(rect->point.x) +
-            static_cast<int64_t>(rect->size.width) >
-        static_cast<int64_t>(image_width))
-      return false;
-    if (static_cast<int64_t>(rect->point.y) +
-            static_cast<int64_t>(rect->size.height) >
-        static_cast<int64_t>(image_height))
-      return false;
-
-    *dest = gfx::Rect(
-        rect->point.x, rect->point.y, rect->size.width, rect->size.height);
-  }
-  return true;
-}
-
-// Converts ImageData from PP_IMAGEDATAFORMAT_BGRA_PREMUL to
-// PP_IMAGEDATAFORMAT_RGBA_PREMUL, or reverse. It's assumed that the
-// destination image is always mapped (so will have non-NULL data).
-void ConvertImageData(PPB_ImageData_Impl* src_image,
-                      const SkIRect& src_rect,
-                      PPB_ImageData_Impl* dest_image,
-                      const SkRect& dest_rect) {
-  ImageDataAutoMapper auto_mapper(src_image);
-
-  DCHECK(src_image->format() != dest_image->format());
-  DCHECK(PPB_ImageData_Impl::IsImageDataFormatSupported(src_image->format()));
-  DCHECK(PPB_ImageData_Impl::IsImageDataFormatSupported(dest_image->format()));
-
-  SkBitmap src_bitmap(src_image->GetMappedBitmap());
-  SkBitmap dest_bitmap(dest_image->GetMappedBitmap());
-  if (src_rect.width() == src_image->width() &&
-      dest_rect.width() == dest_image->width()) {
-    // Fast path if the full frame can be converted at once.
-    SkSwapRB(
-        dest_bitmap.getAddr32(static_cast<int>(dest_rect.fLeft),
-                              static_cast<int>(dest_rect.fTop)),
-        src_bitmap.getAddr32(static_cast<int>(src_rect.fLeft),
-                             static_cast<int>(src_rect.fTop)),
-        src_rect.width() * src_rect.height());
-  } else {
-    // Slow path where we convert line by line.
-    for (int y = 0; y < src_rect.height(); y++) {
-      SkSwapRB(
-          dest_bitmap.getAddr32(static_cast<int>(dest_rect.fLeft),
-                                static_cast<int>(dest_rect.fTop + y)),
-          src_bitmap.getAddr32(static_cast<int>(src_rect.fLeft),
-                               static_cast<int>(src_rect.fTop + y)),
-          src_rect.width());
-    }
-  }
-}
-
-}  // namespace
-
-PepperGraphics2DHost::SharedImageInfo::SharedImageInfo(
-    gpu::SyncToken sync_token,
-    scoped_refptr<gpu::ClientSharedImage> shared_image,
-    gfx::Size size)
-    : sync_token(sync_token),
-      shared_image(std::move(shared_image)),
-      size(size) {}
-
-PepperGraphics2DHost::SharedImageInfo::SharedImageInfo(
-    const SharedImageInfo& shared_image_info) = default;
-
-PepperGraphics2DHost::SharedImageInfo::~SharedImageInfo() = default;
-
-struct PepperGraphics2DHost::QueuedOperation {
-  enum Type { PAINT, SCROLL, REPLACE, TRANSFORM };
-
-  QueuedOperation(Type t)
-      : type(t), paint_x(0), paint_y(0), scroll_dx(0), scroll_dy(0) {}
-
-  Type type;
-
-  // Valid when type == PAINT.
-  scoped_refptr<PPB_ImageData_Impl> paint_image;
-  int paint_x, paint_y;
-  gfx::Rect paint_src_rect;
-
-  // Valid when type == SCROLL.
-  gfx::Rect scroll_clip_rect;
-  int scroll_dx, scroll_dy;
-
-  // Valid when type == REPLACE.
-  scoped_refptr<PPB_ImageData_Impl> replace_image;
-
-  // Valid when type == TRANSFORM
-  float scale;
-  gfx::PointF translation;
-};
-
-// static
-PepperGraphics2DHost* PepperGraphics2DHost::Create(
-    RendererPpapiHost* host,
-    PP_Instance instance,
-    PP_Resource resource,
-    const PP_Size& size,
-    PP_Bool is_always_opaque,
-    scoped_refptr<PPB_ImageData_Impl> backing_store) {
-  PepperGraphics2DHost* resource_host =
-      new PepperGraphics2DHost(host, instance, resource);
-  if (!resource_host->Init(size.width,
-                           size.height,
-                           PP_ToBool(is_always_opaque),
-                           backing_store)) {
-    delete resource_host;
-    return nullptr;
-  }
-  return resource_host;
-}
-
-PepperGraphics2DHost::PepperGraphics2DHost(RendererPpapiHost* host,
-                                           PP_Instance instance,
-                                           PP_Resource resource)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      renderer_ppapi_host_(host),
-      bound_instance_(nullptr),
-      need_flush_ack_(false),
-      offscreen_flush_pending_(false),
-      is_always_opaque_(false),
-      scale_(1.0f),
-      is_running_in_process_(host->IsRunningInProcess()),
-      enable_gpu_memory_buffer_(
-          base::CommandLine::ForCurrentProcess()->HasSwitch(
-              blink::switches::kEnableGpuMemoryBufferCompositorResources)) {}
-
-PepperGraphics2DHost::~PepperGraphics2DHost() {
-  // Delete textures owned by PepperGraphics2DHost, but not those sent to the
-  // compositor, since those will be deleted by ReleaseTextureCallback() when it
-  // runs.
-  while (main_thread_context_ && !recycled_shared_images_.empty()) {
-    auto& shared_image_info = recycled_shared_images_.back();
-    main_thread_context_->SharedImageInterface()->DestroySharedImage(
-        shared_image_info.sync_token,
-        std::move(shared_image_info.shared_image));
-    recycled_shared_images_.pop_back();
-  }
-
-  // Unbind from the instance when destroyed if we're still bound.
-  if (bound_instance_)
-    bound_instance_->BindGraphics(bound_instance_->pp_instance(), 0);
-}
-
-bool PepperGraphics2DHost::Init(
-    int width,
-    int height,
-    bool is_always_opaque,
-    scoped_refptr<PPB_ImageData_Impl> backing_store) {
-  // The underlying PPB_ImageData_Impl will validate the dimensions.
-  image_data_ = backing_store;
-  if (!image_data_->Init(PPB_ImageData_Impl::GetNativeImageDataFormat(),
-                         width,
-                         height,
-                         true) ||
-      !image_data_->Map()) {
-    image_data_ = nullptr;
-    return false;
-  }
-  is_always_opaque_ = is_always_opaque;
-  scale_ = 1.0f;
-
-  return true;
-}
-
-int32_t PepperGraphics2DHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    ppapi::host::HostMessageContext* context) {
-  PPAPI_BEGIN_MESSAGE_MAP(PepperGraphics2DHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Graphics2D_PaintImageData,
-                                      OnHostMsgPaintImageData)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Graphics2D_Scroll,
-                                      OnHostMsgScroll)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Graphics2D_ReplaceContents,
-                                      OnHostMsgReplaceContents)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_Graphics2D_Flush,
-                                        OnHostMsgFlush)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Graphics2D_SetScale,
-                                      OnHostMsgSetScale)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Graphics2D_SetLayerTransform,
-                                      OnHostMsgSetLayerTransform)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Graphics2D_ReadImageData,
-                                      OnHostMsgReadImageData)
-  PPAPI_END_MESSAGE_MAP()
-  return PP_ERROR_FAILED;
-}
-
-bool PepperGraphics2DHost::IsGraphics2DHost() { return true; }
-
-bool PepperGraphics2DHost::ReadImageData(PP_Resource image,
-                                         const PP_Point* top_left) {
-  // Get and validate the image object to paint into.
-  EnterResourceNoLock<PPB_ImageData_API> enter(image, true);
-  if (enter.failed())
-    return false;
-  PPB_ImageData_Impl* image_resource =
-      static_cast<PPB_ImageData_Impl*>(enter.object());
-  if (!PPB_ImageData_Impl::IsImageDataFormatSupported(image_resource->format()))
-    return false;  // Must be in the right format.
-
-  // Validate the bitmap position.
-  int x = top_left->x;
-  if (x < 0 ||
-      static_cast<int64_t>(x) + static_cast<int64_t>(image_resource->width()) >
-          image_data_->width())
-    return false;
-  int y = top_left->y;
-  if (y < 0 ||
-      static_cast<int64_t>(y) + static_cast<int64_t>(image_resource->height()) >
-          image_data_->height())
-    return false;
-
-  ImageDataAutoMapper auto_mapper(image_resource);
-  if (!auto_mapper.is_valid())
-    return false;
-
-  SkIRect src_irect = {x, y, x + image_resource->width(),
-                       y + image_resource->height()};
-  SkRect dest_rect = {SkIntToScalar(0), SkIntToScalar(0),
-                      SkIntToScalar(image_resource->width()),
-                      SkIntToScalar(image_resource->height())};
-
-  if (image_resource->format() != image_data_->format()) {
-    // Convert the image data if the format does not match.
-    ConvertImageData(image_data_.get(), src_irect, image_resource, dest_rect);
-  } else {
-    SkCanvas* dest_canvas = image_resource->GetCanvas();
-
-    // We want to replace the contents of the bitmap rather than blend.
-    SkPaint paint;
-    paint.setBlendMode(SkBlendMode::kSrc);
-    dest_canvas->drawImageRect(image_data_->GetMappedBitmap().asImage(),
-                               SkRect::Make(src_irect), dest_rect,
-                               SkSamplingOptions(), &paint,
-                               SkCanvas::kStrict_SrcRectConstraint);
-  }
-  return true;
-}
-
-bool PepperGraphics2DHost::BindToInstance(
-    PepperPluginInstanceImpl* new_instance) {
-  if (new_instance && new_instance->pp_instance() != pp_instance())
-    return false;  // Can't bind other instance's contexts.
-  if (bound_instance_ == new_instance)
-    return true;  // Rebinding the same device, nothing to do.
-  if (bound_instance_ && new_instance)
-    return false;  // Can't change a bound device.
-
-  if (!new_instance) {
-    // When the device is detached, we'll not get any more paint callbacks so
-    // we need to clear the list, but we still want to issue any pending
-    // callbacks to the plugin.
-    if (need_flush_ack_)
-      ScheduleOffscreenFlushAck();
-  } else {
-    // Devices being replaced, redraw the plugin.
-    new_instance->InvalidateRect(gfx::Rect());
-  }
-
-  cached_bitmap_shared_image_ = nullptr;
-  composited_output_modified_ = true;
-
-  bound_instance_ = new_instance;
-  return true;
-}
-
-// The |backing_bitmap| must be clipped to the |plugin_rect| to avoid painting
-// outside the plugin area. This can happen if the plugin has been resized since
-// PaintImageData verified the image is within the plugin size.
-void PepperGraphics2DHost::Paint(cc::PaintCanvas* canvas,
-                                 const gfx::Rect& plugin_rect,
-                                 const gfx::Rect& paint_rect) {
-  TRACE_EVENT0("pepper", "PepperGraphics2DHost::Paint");
-  ImageDataAutoMapper auto_mapper(image_data_.get());
-  SkBitmap backing_bitmap = image_data_->GetMappedBitmap();
-
-  gfx::Rect invalidate_rect = plugin_rect;
-  invalidate_rect.Intersect(paint_rect);
-  SkRect sk_invalidate_rect = gfx::RectToSkRect(invalidate_rect);
-  cc::PaintCanvasAutoRestore auto_restore(canvas, true);
-  canvas->clipRect(sk_invalidate_rect);
-  gfx::Size pixel_image_size(image_data_->width(), image_data_->height());
-  gfx::Size image_size = gfx::ScaleToFlooredSize(pixel_image_size, scale_);
-
-  PepperPluginInstance* plugin_instance =
-      renderer_ppapi_host_->GetPluginInstance(pp_instance());
-  if (!plugin_instance)
-    return;
-  if (plugin_instance->IsFullPagePlugin()) {
-    // When we're resizing a window with a full-frame plugin, the plugin may
-    // not yet have bound a new device, which will leave parts of the
-    // background exposed if the window is getting larger. We want this to
-    // show white (typically less jarring) rather than black or uninitialized.
-    // We don't do this for non-full-frame plugins since we specifically want
-    // the page background to show through.
-    cc::PaintCanvasAutoRestore full_page_auto_restore(canvas, true);
-    SkRect image_data_rect =
-        gfx::RectToSkRect(gfx::Rect(plugin_rect.origin(), image_size));
-    canvas->clipRect(image_data_rect, SkClipOp::kDifference);
-
-    cc::PaintFlags flags;
-    flags.setBlendMode(SkBlendMode::kSrc);
-    flags.setColor(SK_ColorWHITE);
-    canvas->drawRect(sk_invalidate_rect, flags);
-  }
-
-  cc::PaintFlags flags;
-  if (is_always_opaque_) {
-    // When we know the device is opaque, we can disable blending for slightly
-    // more optimized painting.
-    flags.setBlendMode(SkBlendMode::kSrc);
-  }
-
-  SkPoint pixel_origin(PointToSkPoint(plugin_rect.origin()));
-  if (scale_ != 1.0f && scale_ > 0.0f) {
-    canvas->scale(scale_, scale_);
-    pixel_origin.scale(1.0f / scale_);
-  }
-  // TODO(khushalsagar): Can this be cached on image_data_, and invalidated when
-  // the bitmap changes?
-  canvas->drawImage(cc::PaintImage::CreateFromBitmap(std::move(backing_bitmap)),
-                    pixel_origin.x(), pixel_origin.y(), SkSamplingOptions(),
-                    &flags);
-}
-
-void PepperGraphics2DHost::ViewInitiatedPaint() {
-  TRACE_EVENT0("pepper", "PepperGraphics2DHost::ViewInitiatedPaint");
-  if (need_flush_ack_) {
-    SendFlushAck();
-    need_flush_ack_ = false;
-  }
-}
-
-float PepperGraphics2DHost::GetScale() const { return scale_; }
-
-bool PepperGraphics2DHost::IsAlwaysOpaque() const { return is_always_opaque_; }
-
-gfx::Size PepperGraphics2DHost::Size() const {
-  if (!image_data_.get())
-    return gfx::Size();
-  return gfx::Size(image_data_->width(), image_data_->height());
-}
-
-void PepperGraphics2DHost::ClearCache() {
-  cached_bitmap_shared_image_ = nullptr;
-}
-
-int32_t PepperGraphics2DHost::OnHostMsgPaintImageData(
-    ppapi::host::HostMessageContext* context,
-    const ppapi::HostResource& image_data,
-    const PP_Point& top_left,
-    bool src_rect_specified,
-    const PP_Rect& src_rect) {
-  EnterResourceNoLock<PPB_ImageData_API> enter(image_data.host_resource(),
-                                               true);
-  if (enter.failed())
-    return PP_ERROR_BADRESOURCE;
-  PPB_ImageData_Impl* image_resource =
-      static_cast<PPB_ImageData_Impl*>(enter.object());
-
-  QueuedOperation operation(QueuedOperation::PAINT);
-  operation.paint_image = image_resource;
-  if (!ValidateAndConvertRect(src_rect_specified ? &src_rect : nullptr,
-                              image_resource->width(), image_resource->height(),
-                              &operation.paint_src_rect))
-    return PP_ERROR_BADARGUMENT;
-
-  // Validate the bitmap position using the previously-validated rect, there
-  // should be no painted area outside of the image.
-  int64_t x64 = static_cast<int64_t>(top_left.x);
-  int64_t y64 = static_cast<int64_t>(top_left.y);
-  if (x64 + static_cast<int64_t>(operation.paint_src_rect.x()) < 0 ||
-      x64 + static_cast<int64_t>(operation.paint_src_rect.right()) >
-          image_data_->width())
-    return PP_ERROR_BADARGUMENT;
-  if (y64 + static_cast<int64_t>(operation.paint_src_rect.y()) < 0 ||
-      y64 + static_cast<int64_t>(operation.paint_src_rect.bottom()) >
-          image_data_->height())
-    return PP_ERROR_BADARGUMENT;
-  operation.paint_x = top_left.x;
-  operation.paint_y = top_left.y;
-
-  queued_operations_.push_back(operation);
-  return PP_OK;
-}
-
-int32_t PepperGraphics2DHost::OnHostMsgScroll(
-    ppapi::host::HostMessageContext* context,
-    bool clip_specified,
-    const PP_Rect& clip,
-    const PP_Point& amount) {
-  QueuedOperation operation(QueuedOperation::SCROLL);
-  if (!ValidateAndConvertRect(clip_specified ? &clip : nullptr,
-                              image_data_->width(), image_data_->height(),
-                              &operation.scroll_clip_rect))
-    return PP_ERROR_BADARGUMENT;
-
-  // If we're being asked to scroll by more than the clip rect size, just
-  // ignore this scroll command and say it worked.
-  int32_t dx = amount.x;
-  int32_t dy = amount.y;
-  if (dx <= -image_data_->width() || dx >= image_data_->width() ||
-      dy <= -image_data_->height() || dy >= image_data_->height())
-    return PP_ERROR_BADARGUMENT;
-
-  operation.scroll_dx = dx;
-  operation.scroll_dy = dy;
-
-  queued_operations_.push_back(operation);
-  return PP_OK;
-}
-
-int32_t PepperGraphics2DHost::OnHostMsgReplaceContents(
-    ppapi::host::HostMessageContext* context,
-    const ppapi::HostResource& image_data) {
-  EnterResourceNoLock<PPB_ImageData_API> enter(image_data.host_resource(),
-                                               true);
-  if (enter.failed())
-    return PP_ERROR_BADRESOURCE;
-  PPB_ImageData_Impl* image_resource =
-      static_cast<PPB_ImageData_Impl*>(enter.object());
-
-  if (!PPB_ImageData_Impl::IsImageDataFormatSupported(image_resource->format()))
-    return PP_ERROR_BADARGUMENT;
-
-  if (image_resource->width() != image_data_->width() ||
-      image_resource->height() != image_data_->height())
-    return PP_ERROR_BADARGUMENT;
-
-  QueuedOperation operation(QueuedOperation::REPLACE);
-  operation.replace_image = image_resource;
-  queued_operations_.push_back(operation);
-  return PP_OK;
-}
-
-int32_t PepperGraphics2DHost::OnHostMsgFlush(
-    ppapi::host::HostMessageContext* context) {
-  // Don't allow more than one pending flush at a time.
-  if (HasPendingFlush())
-    return PP_ERROR_INPROGRESS;
-
-  PP_Resource old_image_data = 0;
-  flush_reply_context_ = context->MakeReplyMessageContext();
-  if (is_running_in_process_)
-    return Flush(nullptr);
-
-  // Reuse image data when running out of process.
-  int32_t result = Flush(&old_image_data);
-
-  if (old_image_data) {
-    // If the Graphics2D has an old image data it's not using any more, send
-    // it back to the plugin for possible re-use. See ppb_image_data_proxy.cc
-    // for a description how this process works.
-    ppapi::HostResource old_image_data_host_resource;
-    old_image_data_host_resource.SetHostResource(pp_instance(), old_image_data);
-    host()->Send(new PpapiMsg_PPBImageData_NotifyUnusedImageData(
-        ppapi::API_ID_PPB_IMAGE_DATA, old_image_data_host_resource));
-  }
-
-  return result;
-}
-
-int32_t PepperGraphics2DHost::OnHostMsgSetScale(
-    ppapi::host::HostMessageContext* context,
-    float scale) {
-  if (scale > 0.0f) {
-    scale_ = scale;
-    return PP_OK;
-  }
-  return PP_ERROR_BADARGUMENT;
-}
-
-int32_t PepperGraphics2DHost::OnHostMsgSetLayerTransform(
-            ppapi::host::HostMessageContext* context,
-            float scale,
-            const PP_FloatPoint& translation) {
-  if (scale < 0.0f)
-    return PP_ERROR_BADARGUMENT;
-
-  QueuedOperation operation(QueuedOperation::TRANSFORM);
-  operation.scale = scale;
-  operation.translation = gfx::PointF(translation.x, translation.y);
-  queued_operations_.push_back(operation);
-  return PP_OK;
-}
-
-
-int32_t PepperGraphics2DHost::OnHostMsgReadImageData(
-    ppapi::host::HostMessageContext* context,
-    PP_Resource image,
-    const PP_Point& top_left) {
-  context->reply_msg = PpapiPluginMsg_Graphics2D_ReadImageDataAck();
-  return ReadImageData(image, &top_left) ? PP_OK : PP_ERROR_FAILED;
-}
-
-void PepperGraphics2DHost::ReleaseSoftwareCallback(
-    scoped_refptr<gpu::ClientSharedImage> shared_image,
-    scoped_refptr<gpu::SharedImageInterface> shared_image_interface,
-    const gpu::SyncToken& sync_token,
-    bool lost_resource) {
-  shared_image->UpdateDestructionSyncToken(sync_token);
-
-  // Only keep around a cached bitmap if the plugin is currently drawing (has
-  // need_flush_ack_ set).
-  if (need_flush_ack_ && bound_instance_) {
-    cached_bitmap_shared_image_ = std::move(shared_image);
-    cached_bitmap_shared_image_interface_ = std::move(shared_image_interface);
-  } else {
-    cached_bitmap_shared_image_ = nullptr;
-    cached_bitmap_shared_image_interface_ = nullptr;
-  }
-}
-
-// static
-void PepperGraphics2DHost::ReleaseTextureCallback(
-    base::WeakPtr<PepperGraphics2DHost> host,
-    scoped_refptr<viz::RasterContextProvider> context,
-    const gfx::Size& size,
-    scoped_refptr<gpu::ClientSharedImage> shared_image,
-    const gpu::SyncToken& sync_token,
-    bool lost) {
-  // Only recycle shared images from the same context, otherwise they may be
-  // lost.
-  if (host && !lost && context == host->main_thread_context_) {
-    host->recycled_shared_images_.emplace_back(sync_token,
-                                               std::move(shared_image), size);
-    return;
-  }
-
-  context->SharedImageInterface()->DestroySharedImage(sync_token,
-                                                      std::move(shared_image));
-}
-
-bool PepperGraphics2DHost::PrepareTransferableResource(
-    viz::TransferableResource* transferable_resource,
-    viz::ReleaseCallback* release_callback) {
-  // Reuse the |main_thread_context_| if it is not lost. If it is lost, we can't
-  // reuse the shared images, they are invalid. If the compositing mode changed,
-  // the context will be lost also, so we get both together.
-  if (!main_thread_context_ ||
-      main_thread_context_->RasterInterface()->GetGraphicsResetStatusKHR() !=
-          GL_NO_ERROR) {
-    recycled_shared_images_.clear();
-    main_thread_context_ = nullptr;
-
-    if (!is_gpu_compositing_disabled_) {
-      RenderThreadImpl* rti = RenderThreadImpl::current();
-      is_gpu_compositing_disabled_ = rti->IsGpuCompositingDisabled();
-      if (!is_gpu_compositing_disabled_) {
-        // Using gpu compositing.
-        main_thread_context_ = rti->SharedMainThreadContextProvider();
-      }
-
-      // The last transferable resource is invalid, either coming from a lost
-      // context or because we switched to software compositing. Force us to
-      // send the frame to the compositor again even if not changed.
-      composited_output_modified_ = true;
-    }
-  }
-
-  if (!composited_output_modified_)
-    return false;
-
-  // Context creation failed, so we're unable to give this frame to the
-  // compositor. Try again next time.
-  if (!is_gpu_compositing_disabled_ && !main_thread_context_)
-    return false;
-
-  // When gpu compositing, the compositor expects gpu resources, so we copy the
-  // |image_data_| into a texture.
-  if (main_thread_context_) {
-    auto* ri = main_thread_context_->RasterInterface();
-    auto* sii = main_thread_context_->SharedImageInterface();
-
-    // The bitmap in |image_data_| uses the skia N32 byte order.
-    constexpr bool bitmap_is_bgra = kN32_SkColorType == kBGRA_8888_SkColorType;
-    const bool texture_can_be_bgra =
-        main_thread_context_->ContextCapabilities().texture_format_bgra8888;
-    const bool upload_bgra = bitmap_is_bgra && texture_can_be_bgra;
-    const viz::SharedImageFormat format =
-        upload_bgra ? viz::SinglePlaneFormat::kBGRA_8888
-                    : viz::SinglePlaneFormat::kRGBA_8888;
-
-    bool overlays_supported = enable_gpu_memory_buffer_ &&
-                              main_thread_context_->SharedImageInterface()
-                                  ->GetCapabilities()
-                                  .supports_scanout_shared_images;
-
-    const gfx::Size size(image_data_->width(), image_data_->height());
-
-    scoped_refptr<gpu::ClientSharedImage> shared_image;
-    gpu::SyncToken in_sync_token;
-    while (!recycled_shared_images_.empty()) {
-      auto& shared_image_info = recycled_shared_images_.back();
-      if (shared_image_info.size == size) {
-        in_sync_token = shared_image_info.sync_token;
-        shared_image = std::move(shared_image_info.shared_image);
-        recycled_shared_images_.pop_back();
-        break;
-      }
-      sii->DestroySharedImage(shared_image_info.sync_token,
-                              std::move(shared_image_info.shared_image));
-      recycled_shared_images_.pop_back();
-    }
-    if (!shared_image) {
-      // We will potentially write to this SharedImage via the raster interface
-      // (which might be going over GLES2) and will later send it off to the
-      // display compositor.
-      gpu::SharedImageUsageSet usage = gpu::SHARED_IMAGE_USAGE_GLES2_WRITE |
-                                       gpu::SHARED_IMAGE_USAGE_DISPLAY_READ;
-      if (overlays_supported)
-        usage |= gpu::SHARED_IMAGE_USAGE_SCANOUT;
-      shared_image = sii->CreateSharedImage(
-          {format, size, gfx::ColorSpace(), usage, "PepperGraphics2DHost"},
-          gpu::kNullSurfaceHandle);
-      CHECK(shared_image);
-      in_sync_token = sii->GenUnverifiedSyncToken();
-    }
-
-    void* src = image_data_->Map();
-
-    // Convert to RGBA if we can't upload BGRA. This is slow sad times.
-    std::unique_ptr<uint32_t[]> swizzled;
-    if (bitmap_is_bgra != upload_bgra) {
-      size_t num_pixels = (base::CheckedNumeric<size_t>(image_data_->width()) *
-                           image_data_->height())
-                              .ValueOrDie();
-      swizzled = std::make_unique<uint32_t[]>(num_pixels);
-      SkSwapRB(swizzled.get(), static_cast<uint32_t*>(src), num_pixels);
-      src = swizzled.get();
-    }
-
-    SkImageInfo src_info = SkImageInfo::Make(size.width(), size.height(),
-                                             viz::ToClosestSkColorType(format),
-                                             kUnknown_SkAlphaType);
-    ri->WaitSyncTokenCHROMIUM(in_sync_token.GetConstData());
-
-    uint32_t texture_target = shared_image->GetTextureTarget();
-
-    ri->WritePixels(shared_image->mailbox(), /*dst_x_offset=*/0,
-                    /*dst_y_offset=*/0, texture_target,
-                    SkPixmap(src_info, src, src_info.minRowBytes()));
-
-    gpu::SyncToken out_sync_token;
-    ri->GenUnverifiedSyncTokenCHROMIUM(out_sync_token.GetData());
-
-    image_data_->Unmap();
-    swizzled.reset();
-
-    gpu::Mailbox gpu_mailbox = shared_image->mailbox();
-    *release_callback =
-        base::BindOnce(&ReleaseTextureCallback, weak_ptr_factory_.GetWeakPtr(),
-                       main_thread_context_, size, std::move(shared_image));
-    *transferable_resource = viz::TransferableResource::MakeGpu(
-        std::move(gpu_mailbox), texture_target, std::move(out_sync_token), size,
-        format, overlays_supported,
-        viz::TransferableResource::ResourceSource::kPepperGraphics2D);
-    composited_output_modified_ = false;
-    return true;
-  }
-
-  gfx::Size pixel_image_size(image_data_->width(), image_data_->height());
-  scoped_refptr<gpu::ClientSharedImage> shared_image;
-  scoped_refptr<gpu::ClientSharedImageInterface> shared_image_interface =
-      RenderThreadImpl::current()->GetRenderThreadSharedImageInterface();
-
-  if (cached_bitmap_shared_image_) {
-    // |shared_image_interface| changes after the gpu channel is lost.
-    // Reuse the shared bitmap only when sii remains the same.
-    if (cached_bitmap_shared_image_->size() == pixel_image_size &&
-        shared_image_interface == cached_bitmap_shared_image_interface_) {
-      shared_image = std::move(cached_bitmap_shared_image_);
-    } else {
-      cached_bitmap_shared_image_ = nullptr;
-      cached_bitmap_shared_image_interface_ = nullptr;
-    }
-  }
-
-    // Without shared_image_interface, we won't be able to prepare the resources
-    // for the compositor. Will retry next time.
-  if (!shared_image_interface) {
-    return false;
-  }
-
-  if (!shared_image) {
-    shared_image =
-        shared_image_interface->CreateSharedImageForSoftwareCompositor(
-            {viz::SinglePlaneFormat::kBGRA_8888, pixel_image_size,
-             gfx::ColorSpace(), gpu::SHARED_IMAGE_USAGE_CPU_WRITE_ONLY,
-             "PepperGraphics2DSharedBitmap"});
-  }
-
-  gpu::SyncToken sync_token = shared_image_interface->GenVerifiedSyncToken();
-  *transferable_resource = viz::TransferableResource::MakeSoftwareSharedImage(
-      shared_image, sync_token, pixel_image_size,
-      viz::SinglePlaneFormat::kBGRA_8888,
-      viz::TransferableResource::ResourceSource::kPepperGraphics2D);
-
-  void* src = image_data_->Map();
-  auto dest = shared_image->Map();
-  UNSAFE_TODO(
-      memcpy(dest->GetMemoryForPlane(0).data(), src,
-             viz::ResourceSizes::CheckedSizeInBytes<size_t>(
-                 pixel_image_size, viz::SinglePlaneFormat::kBGRA_8888)));
-  image_data_->Unmap();
-
-  *release_callback =
-      base::BindOnce(&PepperGraphics2DHost::ReleaseSoftwareCallback,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(shared_image),
-                     shared_image_interface);
-
-  composited_output_modified_ = false;
-
-  return true;
-}
-
-void PepperGraphics2DHost::AttachedToNewLayer() {
-  composited_output_modified_ = true;
-}
-
-int32_t PepperGraphics2DHost::Flush(PP_Resource* old_image_data) {
-  bool done_replace_contents = false;
-  bool no_update_visible = true;
-  bool is_plugin_visible = true;
-
-  for (size_t i = 0; i < queued_operations_.size(); i++) {
-    QueuedOperation& operation = queued_operations_[i];
-    gfx::Rect op_rect;
-    switch (operation.type) {
-      case QueuedOperation::TRANSFORM:
-        ExecuteTransform(operation.scale, operation.translation, &op_rect);
-        break;
-      case QueuedOperation::PAINT:
-        ExecutePaintImageData(operation.paint_image.get(),
-                              operation.paint_x,
-                              operation.paint_y,
-                              operation.paint_src_rect,
-                              &op_rect);
-        break;
-      case QueuedOperation::SCROLL:
-        ExecuteScroll(operation.scroll_clip_rect,
-                      operation.scroll_dx,
-                      operation.scroll_dy,
-                      &op_rect);
-        break;
-      case QueuedOperation::REPLACE:
-        // Since the out parameter |old_image_data| takes ownership of the
-        // reference, if there are more than one ReplaceContents calls queued
-        // the first |old_image_data| will get overwritten and leaked. So we
-        // only supply this for the first call.
-        ExecuteReplaceContents(
-            operation.replace_image.get(), &op_rect,
-            done_replace_contents ? nullptr : old_image_data);
-        done_replace_contents = true;
-        break;
-    }
-
-    // For correctness with accelerated compositing, we must issue an invalidate
-    // on the full op_rect even if it is partially or completely off-screen.
-    // However, if we issue an invalidate for a clipped-out region, WebKit will
-    // do nothing and we won't get any ViewFlushedPaint calls, leaving our
-    // callback stranded. So we still need to check whether the repainted area
-    // is visible to determine how to deal with the callback.
-    if (bound_instance_ && !op_rect.IsEmpty()) {
-      gfx::Point scroll_delta(operation.scroll_dx, operation.scroll_dy);
-      // In use-zoom-for-dsf mode, the viewport (thus cc) uses native
-      // pixels, so the damage and rects have to be scaled.
-      gfx::Rect op_rect_in_viewport = op_rect;
-      ConvertToLogicalPixels(scale_, &op_rect, nullptr);
-      if (!ConvertToLogicalPixels(scale_ / viewport_to_dip_scale_,
-                                  &op_rect_in_viewport,
-                                  operation.type == QueuedOperation::SCROLL
-                                      ? &scroll_delta
-                                      : nullptr)) {
-        // Conversion requires falling back to InvalidateRect.
-        operation.type = QueuedOperation::PAINT;
-      }
-
-      gfx::Rect clip = PP_ToGfxRect(bound_instance_->view_data().clip_rect);
-      is_plugin_visible = !clip.IsEmpty();
-
-      // Set |no_update_visible| to false if the change overlaps the visible
-      // area.
-      if (!gfx::IntersectRects(clip, op_rect).IsEmpty()) {
-        no_update_visible = false;
-      }
-
-      if (!op_rect_in_viewport.IsEmpty())
-        bound_instance_->InvalidateRect(op_rect_in_viewport);
-      composited_output_modified_ = true;
-    }
-  }
-  queued_operations_.clear();
-
-  if (!bound_instance_) {
-    // As promised in the API, we always schedule callback when unbound.
-    ScheduleOffscreenFlushAck();
-  } else if (no_update_visible && is_plugin_visible &&
-             bound_instance_->view_data().is_page_visible) {
-    // There's nothing visible to invalidate so just schedule the callback to
-    // execute in the next round of the message loop.
-    ScheduleOffscreenFlushAck();
-  } else {
-    need_flush_ack_ = true;
-  }
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-void PepperGraphics2DHost::ExecuteTransform(const float& scale,
-                                            const gfx::PointF& translate,
-                                            gfx::Rect* invalidated_rect) {
-  if (bound_instance_) {
-    bound_instance_->SetGraphics2DTransform(scale, translate);
-    *invalidated_rect =
-        gfx::Rect(0, 0, image_data_->width(), image_data_->height());
-  }
-}
-
-void PepperGraphics2DHost::ExecutePaintImageData(PPB_ImageData_Impl* image,
-                                                 int x,
-                                                 int y,
-                                                 const gfx::Rect& src_rect,
-                                                 gfx::Rect* invalidated_rect) {
-  // Ensure the source image is mapped to read from it.
-  ImageDataAutoMapper auto_mapper(image);
-  if (!auto_mapper.is_valid())
-    return;
-
-  // Portion within the source image to cut out.
-  SkIRect src_irect = {src_rect.x(), src_rect.y(), src_rect.right(),
-                       src_rect.bottom()};
-
-  // Location within the backing store to copy to.
-  *invalidated_rect = src_rect;
-  invalidated_rect->Offset(x, y);
-  SkRect dest_rect = {SkIntToScalar(invalidated_rect->x()),
-                      SkIntToScalar(invalidated_rect->y()),
-                      SkIntToScalar(invalidated_rect->right()),
-                      SkIntToScalar(invalidated_rect->bottom())};
-
-  if (image->format() != image_data_->format()) {
-    // Convert the image data if the format does not match.
-    ConvertImageData(image, src_irect, image_data_.get(), dest_rect);
-  } else {
-    // We're guaranteed to have a mapped canvas since we mapped it in Init().
-    SkCanvas* backing_canvas = image_data_->GetCanvas();
-
-    // We want to replace the contents of the bitmap rather than blend.
-    SkPaint paint;
-    paint.setBlendMode(SkBlendMode::kSrc);
-    backing_canvas->drawImageRect(
-        image->GetMappedBitmap().asImage(), SkRect::Make(src_irect), dest_rect,
-        SkSamplingOptions(), &paint, SkCanvas::kStrict_SrcRectConstraint);
-  }
-}
-
-void PepperGraphics2DHost::ExecuteScroll(const gfx::Rect& clip,
-                                         int dx,
-                                         int dy,
-                                         gfx::Rect* invalidated_rect) {
-  gfx::ScrollCanvas(image_data_->GetCanvas(), clip, gfx::Vector2d(dx, dy));
-  *invalidated_rect = clip;
-}
-
-void PepperGraphics2DHost::ExecuteReplaceContents(PPB_ImageData_Impl* image,
-                                                  gfx::Rect* invalidated_rect,
-                                                  PP_Resource* old_image_data) {
-  if (image->format() != image_data_->format()) {
-    DCHECK(image->width() == image_data_->width() &&
-           image->height() == image_data_->height());
-    // Convert the image data if the format does not match.
-    SkIRect src_irect = {0, 0, image->width(), image->height()};
-    SkRect dest_rect = {SkIntToScalar(0), SkIntToScalar(0),
-                        SkIntToScalar(image_data_->width()),
-                        SkIntToScalar(image_data_->height())};
-    ConvertImageData(image, src_irect, image_data_.get(), dest_rect);
-  } else {
-    // The passed-in image may not be mapped in our process, and we need to
-    // guarantee that the current backing store is always mapped.
-    if (!image->Map())
-      return;
-
-    if (old_image_data)
-      *old_image_data = image_data_->GetReference();
-    image_data_ = image;
-  }
-  *invalidated_rect =
-      gfx::Rect(0, 0, image_data_->width(), image_data_->height());
-}
-
-void PepperGraphics2DHost::SendFlushAck() {
-  host()->SendReply(flush_reply_context_, PpapiPluginMsg_Graphics2D_FlushAck());
-}
-
-void PepperGraphics2DHost::SendOffscreenFlushAck() {
-  DCHECK(offscreen_flush_pending_);
-
-  // We must clear this flag before issuing the callback. It will be
-  // common for the plugin to issue another invalidate in response to a flush
-  // callback, and we don't want to think that a callback is already pending.
-  offscreen_flush_pending_ = false;
-  SendFlushAck();
-}
-
-void PepperGraphics2DHost::ScheduleOffscreenFlushAck() {
-  offscreen_flush_pending_ = true;
-  base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
-      FROM_HERE,
-      base::BindOnce(&PepperGraphics2DHost::SendOffscreenFlushAck,
-                     weak_ptr_factory_.GetWeakPtr()),
-      base::Milliseconds(kOffscreenCallbackDelayMs));
-}
-
-bool PepperGraphics2DHost::HasPendingFlush() const {
-  return need_flush_ack_ || offscreen_flush_pending_;
-}
-
-// static
-bool PepperGraphics2DHost::ConvertToLogicalPixels(float scale,
-                                                  gfx::Rect* op_rect,
-                                                  gfx::Point* delta) {
-  if (scale == 1.0f || scale <= 0.0f)
-    return true;
-
-  gfx::Rect original_rect = *op_rect;
-  // Take the enclosing rectangle after scaling so a rectangle scaled down then
-  // scaled back up by the inverse scale would fully contain the entire area
-  // affected by the original rectangle.
-  *op_rect = gfx::ScaleToEnclosingRect(*op_rect, scale);
-  if (delta) {
-    gfx::Point original_delta = *delta;
-    float inverse_scale = 1.0f / scale;
-    *delta = gfx::ScaleToFlooredPoint(*delta, scale);
-
-    gfx::Rect inverse_scaled_rect =
-        gfx::ScaleToEnclosingRect(*op_rect, inverse_scale);
-    if (original_rect != inverse_scaled_rect)
-      return false;
-    gfx::Point inverse_scaled_point =
-        gfx::ScaleToFlooredPoint(*delta, inverse_scale);
-    if (original_delta != inverse_scaled_point)
-      return false;
-  }
-
-  return true;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_graphics_2d_host.h b/content/renderer/pepper/pepper_graphics_2d_host.h
deleted file mode 100644
index dbfb35d7..0000000
--- a/content/renderer/pepper/pepper_graphics_2d_host.h
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_GRAPHICS_2D_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_GRAPHICS_2D_HOST_H_
-
-#include <stdint.h>
-
-#include <vector>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "cc/paint/paint_canvas.h"
-#include "components/viz/common/resources/release_callback.h"
-#include "content/common/content_export.h"
-#include "gpu/command_buffer/common/mailbox.h"
-#include "gpu/command_buffer/common/sync_token.h"
-#include "ppapi/c/ppb_graphics_2d.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/resource_host.h"
-#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/geometry/point_f.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace gfx {
-class Rect;
-}
-
-namespace gpu {
-class ClientSharedImage;
-class SharedImageInterface;
-}
-
-namespace viz {
-class RasterContextProvider;
-struct TransferableResource;
-}
-
-namespace content {
-
-class PepperPluginInstanceImpl;
-class PPB_ImageData_Impl;
-class RendererPpapiHost;
-
-class CONTENT_EXPORT PepperGraphics2DHost final
-    : public ppapi::host::ResourceHost {
- public:
-  static PepperGraphics2DHost* Create(
-      RendererPpapiHost* host,
-      PP_Instance instance,
-      PP_Resource resource,
-      const PP_Size& size,
-      PP_Bool is_always_opaque,
-      scoped_refptr<PPB_ImageData_Impl> backing_store);
-
-  PepperGraphics2DHost(const PepperGraphics2DHost&) = delete;
-  PepperGraphics2DHost& operator=(const PepperGraphics2DHost&) = delete;
-
-  ~PepperGraphics2DHost() override;
-
-  // ppapi::host::ResourceHost override.
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-  bool IsGraphics2DHost() override;
-
-  bool ReadImageData(PP_Resource image, const PP_Point* top_left);
-  // Assciates this device with the given plugin instance. You can pass NULL
-  // to clear the existing device. Returns true on success. In this case, a
-  // repaint of the page will also be scheduled. Failure means that the device
-  // is already bound to a different instance, and nothing will happen.
-  bool BindToInstance(PepperPluginInstanceImpl* new_instance);
-  // Paints the current backing store to the web page.
-  void Paint(cc::PaintCanvas* canvas,
-             const gfx::Rect& plugin_rect,
-             const gfx::Rect& paint_rect);
-
-  bool PrepareTransferableResource(
-      viz::TransferableResource* transferable_resource,
-      viz::ReleaseCallback* release_callback);
-  void AttachedToNewLayer();
-
-  // Notifications about the view's progress painting.  See PluginInstance.
-  // These messages are used to send Flush callbacks to the plugin.
-  void ViewInitiatedPaint();
-
-  float GetScale() const;
-  void SetLayerTransform(float scale, const PP_Point& transform);
-  bool IsAlwaysOpaque() const;
-  gfx::Size Size() const;
-
-  void ClearCache();
-
-  void set_viewport_to_dip_scale(float viewport_to_dip_scale) {
-    DCHECK_LT(0, viewport_to_dip_scale_);
-    viewport_to_dip_scale_ = viewport_to_dip_scale;
-  }
-
- private:
-  PepperGraphics2DHost(RendererPpapiHost* host,
-                       PP_Instance instance,
-                       PP_Resource resource);
-
-  bool Init(int width,
-            int height,
-            bool is_always_opaque,
-            scoped_refptr<PPB_ImageData_Impl> backing_store);
-
-  int32_t OnHostMsgPaintImageData(ppapi::host::HostMessageContext* context,
-                                  const ppapi::HostResource& image_data,
-                                  const PP_Point& top_left,
-                                  bool src_rect_specified,
-                                  const PP_Rect& src_rect);
-  int32_t OnHostMsgScroll(ppapi::host::HostMessageContext* context,
-                          bool clip_specified,
-                          const PP_Rect& clip,
-                          const PP_Point& amount);
-  int32_t OnHostMsgReplaceContents(ppapi::host::HostMessageContext* context,
-                                   const ppapi::HostResource& image_data);
-  int32_t OnHostMsgFlush(ppapi::host::HostMessageContext* context);
-  int32_t OnHostMsgSetScale(ppapi::host::HostMessageContext* context,
-                            float scale);
-  int32_t OnHostMsgSetLayerTransform(ppapi::host::HostMessageContext* context,
-                                     float Scale,
-                                     const PP_FloatPoint& Transform);
-  int32_t OnHostMsgReadImageData(ppapi::host::HostMessageContext* context,
-                                 PP_Resource image,
-                                 const PP_Point& top_left);
-
-  // If |old_image_data| is not NULL, a previous used ImageData object will be
-  // reused.  This is used by ReplaceContents.
-  int32_t Flush(PP_Resource* old_image_data);
-
-  // Called internally to execute the different queued commands. The
-  // parameters to these functions will have already been validated. The last
-  // rect argument will be filled by each function with the area affected by
-  // the update that requires invalidation. If there were no pixels changed,
-  // this rect can be untouched.
-  void ExecuteTransform(const float& scale,
-                        const gfx::PointF& translate,
-                        gfx::Rect* invalidated_rect);
-  void ExecutePaintImageData(PPB_ImageData_Impl* image,
-                             int x,
-                             int y,
-                             const gfx::Rect& src_rect,
-                             gfx::Rect* invalidated_rect);
-  void ExecuteScroll(const gfx::Rect& clip,
-                     int dx,
-                     int dy,
-                     gfx::Rect* invalidated_rect);
-  void ExecuteReplaceContents(PPB_ImageData_Impl* image,
-                              gfx::Rect* invalidated_rect,
-                              PP_Resource* old_image_data);
-
-  void SendFlushAck();
-
-  // Function scheduled to execute by ScheduleOffscreenFlushAck that actually
-  // issues the offscreen callbacks.
-  void SendOffscreenFlushAck();
-
-  // Schedules the offscreen flush ACK at a future time.
-  void ScheduleOffscreenFlushAck();
-
-  // Returns true if there is any type of flush callback pending.
-  bool HasPendingFlush() const;
-
-  // Scale |op_rect| to logical pixels, taking care to include partially-
-  // covered logical pixels (aka DIPs). Also scale optional |delta| to logical
-  // pixels as well for scrolling cases. Returns false for scrolling cases where
-  // scaling either |op_rect| or |delta| would require scrolling to fall back to
-  // invalidation due to rounding errors, true otherwise.
-  static bool ConvertToLogicalPixels(float scale,
-                                     gfx::Rect* op_rect,
-                                     gfx::Point* delta);
-
-  // Callback when compositor is done with a software resource given to it.
-  void ReleaseSoftwareCallback(
-      scoped_refptr<gpu::ClientSharedImage> shared_image,
-      scoped_refptr<gpu::SharedImageInterface> shared_image_interface,
-      const gpu::SyncToken& sync_token,
-      bool lost_resource);
-  // Callback when compositor is done with a gpu resource given to it. Static
-  // for speed. Just kidding, it's so this can clean up the texture if the host
-  // has been destroyed.
-  static void ReleaseTextureCallback(
-      base::WeakPtr<PepperGraphics2DHost> host,
-      scoped_refptr<viz::RasterContextProvider> context,
-      const gfx::Size& size,
-      scoped_refptr<gpu::ClientSharedImage> shared_image,
-      const gpu::SyncToken& sync_token,
-      bool lost);
-
-  raw_ptr<RendererPpapiHost> renderer_ppapi_host_;
-
-  scoped_refptr<PPB_ImageData_Impl> image_data_;
-
-  // Non-owning pointer to the plugin instance this context is currently bound
-  // to, if any. If the context is currently unbound, this will be NULL.
-  raw_ptr<PepperPluginInstanceImpl> bound_instance_;
-
-  // Keeps track of all drawing commands queued before a Flush call.
-  struct QueuedOperation;
-  typedef std::vector<QueuedOperation> OperationQueue;
-  OperationQueue queued_operations_;
-
-  // True if we need to send an ACK to plugin.
-  bool need_flush_ack_;
-
-  // When doing offscreen flushes, we issue a task that issues the callback
-  // later. This is set when one of those tasks is pending so that we can
-  // enforce the "only one pending flush at a time" constraint in the API.
-  bool offscreen_flush_pending_;
-
-  // Set to true if the plugin declares that this device will always be opaque.
-  // This allows us to do more optimized painting in some cases.
-  bool is_always_opaque_;
-
-  // Set to the scale between what the plugin considers to be one pixel and one
-  // DIP
-  float scale_;
-
-  // The scale between the viewport and dip.
-  float viewport_to_dip_scale_ = 1.0f;
-
-  ppapi::host::ReplyMessageContext flush_reply_context_;
-
-  bool is_running_in_process_;
-
-  bool composited_output_modified_ = true;
-
-  // Local cache of the compositing mode. This is sticky, once true it stays
-  // that way.
-  bool is_gpu_compositing_disabled_ = false;
-  // The shared main thread context provider, used to upload 2d pepper frames
-  // if the compositor is expecting gpu content.
-  scoped_refptr<viz::RasterContextProvider> main_thread_context_;
-  struct SharedImageInfo {
-    SharedImageInfo(gpu::SyncToken sync_token,
-                    scoped_refptr<gpu::ClientSharedImage> shared_image,
-                    gfx::Size size);
-    SharedImageInfo(const SharedImageInfo& shared_image_info);
-    ~SharedImageInfo();
-    gpu::SyncToken sync_token;
-    scoped_refptr<gpu::ClientSharedImage> shared_image;
-    gfx::Size size;
-  };
-  // Shared images that are available for recycling.
-  std::vector<SharedImageInfo> recycled_shared_images_;
-
-  // This is a SharedImage for use with the software compositor that was
-  // recently released by the compositor and may be used to transfer bytes to
-  // the compositor again.
-  scoped_refptr<gpu::ClientSharedImage> cached_bitmap_shared_image_;
-  // Used for tracking whether the shared_image_interface has changed due to
-  // context lost.
-  scoped_refptr<gpu::SharedImageInterface>
-      cached_bitmap_shared_image_interface_;
-
-  // Whether to use gpu memory for compositor resources.
-  const bool enable_gpu_memory_buffer_;
-
-  base::WeakPtrFactory<PepperGraphics2DHost> weak_ptr_factory_{this};
-
-  friend class PepperGraphics2DHostTest;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_GRAPHICS_2D_HOST_H_
diff --git a/content/renderer/pepper/pepper_graphics_2d_host_unittest.cc b/content/renderer/pepper/pepper_graphics_2d_host_unittest.cc
deleted file mode 100644
index 671c44bb..0000000
--- a/content/renderer/pepper/pepper_graphics_2d_host_unittest.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/pepper_graphics_2d_host.h"
-
-#include <stddef.h>
-
-#include "base/test/task_environment.h"
-#include "content/public/renderer/ppapi_gfx_conversion.h"
-#include "content/renderer/pepper/mock_renderer_ppapi_host.h"
-#include "content/renderer/pepper/ppb_image_data_impl.h"
-#include "ppapi/shared_impl/ppb_view_shared.h"
-#include "ppapi/shared_impl/proxy_lock.h"
-#include "ppapi/shared_impl/test_globals.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/skia/include/core/SkCanvas.h"
-#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/geometry/rect.h"
-
-namespace content {
-
-class PepperGraphics2DHostTest : public testing::Test {
- public:
-  static bool ConvertToLogicalPixels(float scale,
-                                     gfx::Rect* op_rect,
-                                     gfx::Point* delta) {
-    return PepperGraphics2DHost::ConvertToLogicalPixels(scale, op_rect, delta);
-  }
-
-  PepperGraphics2DHostTest() : renderer_ppapi_host_(nullptr, 12345) {}
-
-  ~PepperGraphics2DHostTest() override {
-    ppapi::ProxyAutoLock proxy_lock;
-    host_.reset();
-  }
-
-  void Init(PP_Instance instance,
-            const PP_Size& backing_store_size,
-            const PP_Rect& plugin_rect) {
-    renderer_view_data_.rect = plugin_rect;
-    test_globals_.GetResourceTracker()->DidCreateInstance(instance);
-    scoped_refptr<PPB_ImageData_Impl> backing_store(
-        new PPB_ImageData_Impl(instance, PPB_ImageData_Impl::ForTest()));
-    host_.reset(PepperGraphics2DHost::Create(&renderer_ppapi_host_,
-                                             instance,
-                                             12345,
-                                             backing_store_size,
-                                             PP_FALSE,
-                                             backing_store));
-    DCHECK(host_.get());
-  }
-
-  void PaintImageData(PPB_ImageData_Impl* image_data) {
-    ppapi::HostResource image_data_resource;
-    image_data_resource.SetHostResource(image_data->pp_instance(),
-                                        image_data->pp_resource());
-    host_->OnHostMsgPaintImageData(nullptr, image_data_resource, PP_Point(),
-                                   false, PP_Rect());
-  }
-
-  void Flush() {
-    ppapi::host::HostMessageContext context(
-        ppapi::proxy::ResourceMessageCallParams(host_->pp_resource(), 0));
-    host_->OnHostMsgFlush(&context);
-    host_->ViewInitiatedPaint();
-    host_->SendOffscreenFlushAck();
-  }
-
-  void ResetPageBitmap(SkBitmap* bitmap) {
-    PP_Rect plugin_rect = renderer_view_data_.rect;
-    int width = plugin_rect.point.x + plugin_rect.size.width;
-    int height = plugin_rect.point.y + plugin_rect.size.height;
-    if (bitmap->isNull() || bitmap->width() != width ||
-        bitmap->height() != height) {
-      bitmap->allocN32Pixels(width, height);
-    }
-    bitmap->eraseColor(0);
-  }
-
- private:
-  ppapi::ViewData renderer_view_data_;
-  std::unique_ptr<PepperGraphics2DHost> host_;
-  base::test::SingleThreadTaskEnvironment task_environment_;
-  MockRendererPpapiHost renderer_ppapi_host_;
-  ppapi::TestGlobals test_globals_;
-};
-
-TEST_F(PepperGraphics2DHostTest, ConvertToLogicalPixels) {
-  static const struct {
-    int x1;
-    int y1;
-    int w1;
-    int h1;
-    int x2;
-    int y2;
-    int w2;
-    int h2;
-    int dx1;
-    int dy1;
-    int dx2;
-    int dy2;
-    float scale;
-    bool result;
-  } tests[] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0, true},
-               {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.0, true},
-               {0, 0, 4, 4, 0, 0, 2, 2, 0, 0, 0, 0, 0.5, true},
-               {1, 1, 4, 4, 0, 0, 3, 3, 0, 0, 0, 0, 0.5, false},
-               {53, 75, 100, 100, 53, 75, 100, 100, 0, 0, 0, 0, 1.0, true},
-               {53, 75, 100, 100, 106, 150, 200, 200, 0, 0, 0, 0, 2.0, true},
-               {53, 75, 100, 100, 26, 37, 51, 51, 0, 0, 0, 0, 0.5, false},
-               {53, 74, 100, 100, 26, 37, 51, 50, 0, 0, 0, 0, 0.5, false},
-               {-1, -1, 100, 100, -1, -1, 51, 51, 0, 0, 0, 0, 0.5, false},
-               {-2, -2, 100, 100, -1, -1, 50, 50, 4, -4, 2, -2, 0.5, true},
-               {-101, -100, 50, 50, -51, -50, 26, 25, 0, 0, 0, 0, 0.5, false},
-               {10, 10, 20, 20, 5, 5, 10, 10, 0, 0, 0, 0, 0.5, true},
-               // Cannot scroll due to partial coverage on sides
-               {11, 10, 20, 20, 5, 5, 11, 10, 0, 0, 0, 0, 0.5, false},
-               // Can scroll since backing store is actually smaller/scaling up
-               {11, 20, 100, 100, 22, 40, 200, 200, 7, 3, 14, 6, 2.0, true},
-               // Can scroll due to delta and bounds being aligned
-               {10, 10, 20, 20, 5, 5, 10, 10, 6, 4, 3, 2, 0.5, true},
-               // Cannot scroll due to dx
-               {10, 10, 20, 20, 5, 5, 10, 10, 5, 4, 2, 2, 0.5, false},
-               // Cannot scroll due to dy
-               {10, 10, 20, 20, 5, 5, 10, 10, 6, 3, 3, 1, 0.5, false},
-               // Cannot scroll due to top
-               {10, 11, 20, 20, 5, 5, 10, 11, 6, 4, 3, 2, 0.5, false},
-               // Cannot scroll due to left
-               {7, 10, 20, 20, 3, 5, 11, 10, 6, 4, 3, 2, 0.5, false},
-               // Cannot scroll due to width
-               {10, 10, 21, 20, 5, 5, 11, 10, 6, 4, 3, 2, 0.5, false},
-               // Cannot scroll due to height
-               {10, 10, 20, 51, 5, 5, 10, 26, 6, 4, 3, 2, 0.5, false},
-               // Check negative scroll deltas
-               {10, 10, 20, 20, 5, 5, 10, 10, -6, -4, -3, -2, 0.5, true},
-               {10, 10, 20, 20, 5, 5, 10, 10, -6, -3, -3, -1, 0.5, false}, };
-  for (size_t i = 0; i < std::size(tests); ++i) {
-    gfx::Rect r1(tests[i].x1, tests[i].y1, tests[i].w1, tests[i].h1);
-    gfx::Rect r2(tests[i].x2, tests[i].y2, tests[i].w2, tests[i].h2);
-    gfx::Rect orig = r1;
-    gfx::Point delta(tests[i].dx1, tests[i].dy1);
-    bool res = ConvertToLogicalPixels(tests[i].scale, &r1, &delta);
-    EXPECT_EQ(r2.ToString(), r1.ToString());
-    EXPECT_EQ(res, tests[i].result);
-    if (res) {
-      EXPECT_EQ(delta, gfx::Point(tests[i].dx2, tests[i].dy2));
-    }
-    // Reverse the scale and ensure all the original pixels are still inside
-    // the result.
-    ConvertToLogicalPixels(1.0f / tests[i].scale, &r1, nullptr);
-    EXPECT_TRUE(r1.Contains(orig));
-  }
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_hung_plugin_filter.cc b/content/renderer/pepper/pepper_hung_plugin_filter.cc
deleted file mode 100644
index 1cc07028..0000000
--- a/content/renderer/pepper/pepper_hung_plugin_filter.cc
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_hung_plugin_filter.h"
-
-#include "base/functional/bind.h"
-#include "content/child/child_process.h"
-
-namespace content {
-
-namespace {
-
-// We'll consider the plugin hung after not hearing anything for this long.
-const int kHungThresholdSec = 10;
-
-// If we ever are blocked for this long, we'll consider the plugin hung, even
-// if we continue to get messages (which is why the above hung threshold never
-// kicked in). Maybe the plugin is spamming us with events and never unblocking
-// and never processing our sync message.
-const int kBlockedHardThresholdSec = kHungThresholdSec * 1.5;
-
-}  // namespace
-
-PepperHungPluginFilter::PepperHungPluginFilter()
-    : io_task_runner_(ChildProcess::current()->io_task_runner()) {}
-
-void PepperHungPluginFilter::BindHungDetectorHost(
-    mojo::PendingRemote<mojom::PepperHungDetectorHost> hung_host) {
-  io_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PepperHungPluginFilter::BindHungDetectorHostOnIOThread,
-                     this, std::move(hung_host)));
-}
-
-void PepperHungPluginFilter::UnbindHungDetectorHostOnIOThread() {
-  hung_host_.reset();
-}
-
-void PepperHungPluginFilter::BindHungDetectorHostOnIOThread(
-    mojo::PendingRemote<mojom::PepperHungDetectorHost> hung_host) {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-  hung_host_.Bind(std::move(hung_host));
-}
-
-void PepperHungPluginFilter::BeginBlockOnSyncMessage() {
-  base::AutoLock lock(lock_);
-  last_message_received_ = base::TimeTicks::Now();
-  if (pending_sync_message_count_ == 0)
-    began_blocking_time_ = last_message_received_;
-  pending_sync_message_count_++;
-
-  EnsureTimerScheduled();
-}
-
-void PepperHungPluginFilter::EndBlockOnSyncMessage() {
-  base::AutoLock lock(lock_);
-  pending_sync_message_count_--;
-  DCHECK(pending_sync_message_count_ >= 0);
-
-  MayHaveBecomeUnhung();
-}
-
-void PepperHungPluginFilter::OnFilterRemoved() {
-  base::AutoLock lock(lock_);
-  MayHaveBecomeUnhung();
-}
-
-void PepperHungPluginFilter::OnChannelError() {
-  base::AutoLock lock(lock_);
-  MayHaveBecomeUnhung();
-}
-
-bool PepperHungPluginFilter::OnMessageReceived(const IPC::Message& message) {
-  // Just track incoming message times but don't handle any messages.
-  base::AutoLock lock(lock_);
-  last_message_received_ = base::TimeTicks::Now();
-  MayHaveBecomeUnhung();
-  return false;
-}
-
-PepperHungPluginFilter::~PepperHungPluginFilter() {}
-
-void PepperHungPluginFilter::HostDispatcherDestroyed() {
-  io_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PepperHungPluginFilter::UnbindHungDetectorHostOnIOThread,
-                     this));
-}
-
-void PepperHungPluginFilter::EnsureTimerScheduled() {
-  lock_.AssertAcquired();
-  if (timer_task_pending_)
-    return;
-
-  timer_task_pending_ = true;
-  io_task_runner_->PostDelayedTask(
-      FROM_HERE, base::BindOnce(&PepperHungPluginFilter::OnHangTimer, this),
-      base::Seconds(kHungThresholdSec));
-}
-
-void PepperHungPluginFilter::MayHaveBecomeUnhung() {
-  lock_.AssertAcquired();
-  if (!hung_plugin_showing_ || IsHung())
-    return;
-
-  SendHungMessage(false);
-  hung_plugin_showing_ = false;
-}
-
-base::TimeTicks PepperHungPluginFilter::GetHungTime() const {
-  lock_.AssertAcquired();
-
-  DCHECK(pending_sync_message_count_);
-  DCHECK(!began_blocking_time_.is_null());
-  DCHECK(!last_message_received_.is_null());
-
-  // Always considered hung at the hard threshold.
-  base::TimeTicks hard_time =
-      began_blocking_time_ + base::Seconds(kBlockedHardThresholdSec);
-
-  // Hung after a soft threshold from last message of any sort.
-  base::TimeTicks soft_time =
-      last_message_received_ + base::Seconds(kHungThresholdSec);
-
-  return std::min(soft_time, hard_time);
-}
-
-bool PepperHungPluginFilter::IsHung() const {
-  lock_.AssertAcquired();
-
-  if (!pending_sync_message_count_)
-    return false;  // Not blocked on a sync message.
-
-  return base::TimeTicks::Now() > GetHungTime();
-}
-
-void PepperHungPluginFilter::OnHangTimer() {
-  base::AutoLock lock(lock_);
-  timer_task_pending_ = false;
-
-  if (!pending_sync_message_count_)
-    return;  // Not blocked any longer.
-
-  base::TimeDelta delay = GetHungTime() - base::TimeTicks::Now();
-  if (delay.is_positive()) {
-    // Got a timer message while we're waiting on a sync message. We need
-    // to schedule another timer message because the latest sync message
-    // would not have scheduled one (we only have one out-standing timer at
-    // a time).
-    timer_task_pending_ = true;
-    io_task_runner_->PostDelayedTask(
-        FROM_HERE, base::BindOnce(&PepperHungPluginFilter::OnHangTimer, this),
-        delay);
-    return;
-  }
-
-  hung_plugin_showing_ = true;
-  SendHungMessage(true);
-}
-
-void PepperHungPluginFilter::SendHungMessage(bool is_hung) {
-  if (!io_task_runner_->BelongsToCurrentThread()) {
-    io_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&PepperHungPluginFilter::SendHungMessage,
-                                  this, is_hung));
-    return;
-  }
-
-  hung_host_->PluginHung(is_hung);
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_hung_plugin_filter.h b/content/renderer/pepper/pepper_hung_plugin_filter.h
deleted file mode 100644
index 8f8a68a..0000000
--- a/content/renderer/pepper/pepper_hung_plugin_filter.h
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_HUNG_PLUGIN_FILTER_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_HUNG_PLUGIN_FILTER_H_
-
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/lock.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/time/time.h"
-#include "content/common/pepper_plugin.mojom.h"
-#include "ipc/ipc_channel_proxy.h"
-#include "ipc/ipc_sync_message_filter.h"
-#include "mojo/public/cpp/bindings/pending_remote.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "ppapi/proxy/host_dispatcher.h"
-
-namespace content {
-
-// This class monitors a renderer <-> pepper plugin channel on the I/O thread
-// of the renderer for a hung plugin.
-//
-// If the plugin is not responding to sync messages, it will notify the browser
-// process and give the user the option to kill the hung plugin.
-//
-// Note that this class must be threadsafe since it will get the begin/end
-// block notifications on the main thread, but the filter is run on the I/O
-// thread. This is important since when we're blocked on a sync message to a
-// hung plugin, the main thread is frozen.
-//
-// NOTE: This class is refcounted (via IPC::MessageFilter).
-class PepperHungPluginFilter
-    : public ppapi::proxy::HostDispatcher::SyncMessageStatusObserver,
-      public IPC::MessageFilter {
- public:
-  PepperHungPluginFilter();
-
-  PepperHungPluginFilter(const PepperHungPluginFilter&) = delete;
-  PepperHungPluginFilter& operator=(const PepperHungPluginFilter&) = delete;
-
-  // The |hung_host| is the mojo channel to inform the browser about the new
-  // hung status.
-  void BindHungDetectorHost(
-      mojo::PendingRemote<mojom::PepperHungDetectorHost> hung_host);
-
-  // SyncMessageStatusReceiver implementation.
-  void BeginBlockOnSyncMessage() override;
-  void EndBlockOnSyncMessage() override;
-
-  // MessageFilter implementation.
-  void OnFilterRemoved() override;
-  void OnChannelError() override;
-  bool OnMessageReceived(const IPC::Message& message) override;
-
-  // Notification the HostDispatcher on the main thread has been destroyed.
-  void HostDispatcherDestroyed();
-
- protected:
-  ~PepperHungPluginFilter() override;
-
- private:
-  // Binds the mojo channel on the IO thread (where it will be used).
-  void BindHungDetectorHostOnIOThread(
-      mojo::PendingRemote<mojom::PepperHungDetectorHost> hung_host);
-
-  // Unbinds the mojo channel on the IO thread.
-  void UnbindHungDetectorHostOnIOThread();
-
-  // Makes sure that the hung timer is scheduled.
-  void EnsureTimerScheduled();
-
-  // Checks whether the plugin could have transitioned from hung to unhung and
-  // notifies the browser if so.
-  void MayHaveBecomeUnhung();
-
-  // Calculate the point at which the plugin could next be considered hung.
-  base::TimeTicks GetHungTime() const;
-
-  // Checks if the plugin is considered hung based on whether it has been
-  // blocked for long enough.
-  bool IsHung() const;
-
-  // Timer handler that checks for a hang after a timeout.
-  void OnHangTimer();
-
-  // Sends the hung/unhung message to the browser process.
-  void SendHungMessage(bool is_hung);
-
-  base::Lock lock_;
-
-  scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
-
-  // The channel back to the browser for informing it of the new status.
-  // This remote is bound and used on the IO thread.
-  mojo::Remote<mojom::PepperHungDetectorHost> hung_host_;
-
-  // The time when we start being blocked on a sync message. If there are
-  // nested ones, this is the time of the outermost one.
-  //
-  // This will be is_null() if we've never blocked.
-  base::TimeTicks began_blocking_time_;
-
-  // Time that the last message was received from the plugin.
-  //
-  // This will be is_null() if we've never received any messages.
-  base::TimeTicks last_message_received_;
-
-  // Number of nested sync messages that we're blocked on.
-  int pending_sync_message_count_ = 0;
-
-  // True when we've sent the "plugin is hung" message to the browser. We track
-  // this so we know to look for it becoming unhung and send the corresponding
-  // message to the browser.
-  bool hung_plugin_showing_ = false;
-
-  bool timer_task_pending_ = false;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_HUNG_PLUGIN_FILTER_H_
diff --git a/content/renderer/pepper/pepper_in_process_resource_creation.cc b/content/renderer/pepper/pepper_in_process_resource_creation.cc
deleted file mode 100644
index bacef52..0000000
--- a/content/renderer/pepper/pepper_in_process_resource_creation.cc
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_in_process_resource_creation.h"
-
-#include "base/functional/bind.h"
-#include "base/memory/weak_ptr.h"
-#include "base/notreached.h"
-#include "content/child/browser_font_resource_trusted.h"
-#include "content/renderer/pepper/pepper_in_process_router.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/ppapi_preferences_builder.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "gpu/config/gpu_feature_info.h"
-#include "ipc/ipc_message.h"
-#include "ipc/ipc_message_macros.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/file_chooser_resource.h"
-#include "ppapi/proxy/file_io_resource.h"
-#include "ppapi/proxy/file_ref_resource.h"
-#include "ppapi/proxy/file_system_resource.h"
-#include "ppapi/proxy/graphics_2d_resource.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/proxy/printing_resource.h"
-#include "ppapi/proxy/url_loader_resource.h"
-#include "ppapi/proxy/url_request_info_resource.h"
-#include "ppapi/proxy/url_response_info_resource.h"
-#include "ppapi/proxy/websocket_resource.h"
-#include "ppapi/shared_impl/ppapi_globals.h"
-#include "ppapi/shared_impl/ppapi_permissions.h"
-#include "ppapi/shared_impl/resource_tracker.h"
-#include "ppapi/shared_impl/var.h"
-#include "third_party/blink/public/web/web_view.h"
-
-// Note that the code in the creation functions in this file should generally
-// be the same as that in ppapi/proxy/resource_creation_proxy.cc. See
-// pepper_in_process_resource_creation.h for what this file is for.
-
-namespace content {
-
-// PepperInProcessResourceCreation --------------------------------------------
-
-PepperInProcessResourceCreation::PepperInProcessResourceCreation(
-    RendererPpapiHostImpl* host_impl,
-    PepperPluginInstanceImpl* instance)
-    : ResourceCreationImpl(instance), host_impl_(host_impl) {}
-
-PepperInProcessResourceCreation::~PepperInProcessResourceCreation() {}
-
-PP_Resource PepperInProcessResourceCreation::CreateBrowserFont(
-    PP_Instance instance,
-    const PP_BrowserFont_Trusted_Description* description) {
-  if (!BrowserFontResource_Trusted::IsPPFontDescriptionValid(*description))
-    return 0;
-  // BrowserFontResource_Trusted and in turn PPFontDescToWebFontDesc do not
-  // care about preferences of GPU features, so no need to query them from
-  // GPU process whether these features are blacklisted or not.
-  gpu::GpuFeatureInfo gpu_feature_info;
-  ppapi::Preferences prefs(PpapiPreferencesBuilder::Build(
-      host_impl_->GetRenderFrameForInstance(instance)
-          ->GetWebView()
-          ->GetWebPreferences(),
-      gpu_feature_info));
-  return (new BrowserFontResource_Trusted(
-              host_impl_->in_process_router()->GetPluginConnection(instance),
-              instance,
-              *description,
-              prefs))->GetReference();
-}
-
-PP_Resource PepperInProcessResourceCreation::CreateFileChooser(
-    PP_Instance instance,
-    PP_FileChooserMode_Dev mode,
-    const PP_Var& accept_types) {
-  scoped_refptr<ppapi::StringVar> string_var =
-      ppapi::StringVar::FromPPVar(accept_types);
-  std::string str = string_var.get() ? string_var->value() : std::string();
-  return (new ppapi::proxy::FileChooserResource(
-              host_impl_->in_process_router()->GetPluginConnection(instance),
-              instance,
-              mode,
-              str.c_str()))->GetReference();
-}
-
-PP_Resource PepperInProcessResourceCreation::CreateFileIO(
-    PP_Instance instance) {
-  return (new ppapi::proxy::FileIOResource(
-              host_impl_->in_process_router()->GetPluginConnection(instance),
-              instance))->GetReference();
-}
-
-PP_Resource PepperInProcessResourceCreation::CreateFileRef(
-    PP_Instance instance,
-    const ppapi::FileRefCreateInfo& create_info) {
-  return ppapi::proxy::FileRefResource::CreateFileRef(
-      host_impl_->in_process_router()->GetPluginConnection(instance),
-      instance,
-      create_info);
-}
-
-PP_Resource PepperInProcessResourceCreation::CreateFileSystem(
-    PP_Instance instance,
-    PP_FileSystemType type) {
-  return (new ppapi::proxy::FileSystemResource(
-              host_impl_->in_process_router()->GetPluginConnection(instance),
-              instance,
-              type))->GetReference();
-}
-
-PP_Resource PepperInProcessResourceCreation::CreateGraphics2D(
-    PP_Instance instance,
-    const PP_Size* size,
-    PP_Bool is_always_opaque) {
-  return (new ppapi::proxy::Graphics2DResource(
-              host_impl_->in_process_router()->GetPluginConnection(instance),
-              instance,
-              *size,
-              is_always_opaque))->GetReference();
-}
-
-PP_Resource PepperInProcessResourceCreation::CreatePrinting(
-    PP_Instance instance) {
-  return (new ppapi::proxy::PrintingResource(
-              host_impl_->in_process_router()->GetPluginConnection(instance),
-              instance))->GetReference();
-}
-
-PP_Resource PepperInProcessResourceCreation::CreateURLLoader(
-    PP_Instance instance) {
-  return (new ppapi::proxy::URLLoaderResource(
-              host_impl_->in_process_router()->GetPluginConnection(instance),
-              instance))->GetReference();
-}
-
-PP_Resource PepperInProcessResourceCreation::CreateURLRequestInfo(
-    PP_Instance instance) {
-  return (new ppapi::proxy::URLRequestInfoResource(
-              host_impl_->in_process_router()->GetPluginConnection(instance),
-              instance,
-              ppapi::URLRequestInfoData()))->GetReference();
-}
-
-PP_Resource PepperInProcessResourceCreation::CreateWebSocket(
-    PP_Instance instance) {
-  return (new ppapi::proxy::WebSocketResource(
-              host_impl_->in_process_router()->GetPluginConnection(instance),
-              instance))->GetReference();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_in_process_resource_creation.h b/content/renderer/pepper/pepper_in_process_resource_creation.h
deleted file mode 100644
index 2b07f42f..0000000
--- a/content/renderer/pepper/pepper_in_process_resource_creation.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_IN_PROCESS_RESOURCE_CREATION_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_IN_PROCESS_RESOURCE_CREATION_H_
-
-#include "base/memory/raw_ptr.h"
-#include "content/renderer/pepper/resource_creation_impl.h"
-#include "ppapi/proxy/connection.h"
-
-namespace content {
-
-class RendererPpapiHostImpl;
-
-// This class provides creation functions for the new resources with IPC
-// backends that live in content/renderer/pepper.
-//
-// (See pepper_in_process_router.h for more information.)
-//
-// This is a bit confusing. The "old-style" resources live in
-// content/renderer/pepper and are created by the ResourceCreationImpl in that
-// directory. The "new-style" IPC-only resources are in ppapi/proxy and are
-// created by the RessourceCreationProxy in that directory.
-//
-// This class allows us to run new-style IPC-only resources in-process. We use
-// the PepperInProcessRouter to run it in process. But then we have a problem
-// with allocating the resources since src/webkit can't depend on IPC or see
-// our IPC backend in content. This class overrides the normal in-process
-// resource creation and adds in the resources that we implement in
-// ppapi/proxy.
-//
-// When we convert all resources to use the new-style, we can just use the
-// ResourceCreationProxy for all resources. This class is just glue to manage
-// the temporary "two different cases."
-class PepperInProcessResourceCreation : public ResourceCreationImpl {
- public:
-  PepperInProcessResourceCreation(RendererPpapiHostImpl* host_impl,
-                                  PepperPluginInstanceImpl* instance);
-
-  PepperInProcessResourceCreation(const PepperInProcessResourceCreation&) =
-      delete;
-  PepperInProcessResourceCreation& operator=(
-      const PepperInProcessResourceCreation&) = delete;
-
-  ~PepperInProcessResourceCreation() override;
-
-  // ResourceCreation_API implementation.
-  PP_Resource CreateBrowserFont(
-      PP_Instance instance,
-      const PP_BrowserFont_Trusted_Description* description) override;
-  PP_Resource CreateFileChooser(PP_Instance instance,
-                                PP_FileChooserMode_Dev mode,
-                                const PP_Var& accept_types) override;
-  PP_Resource CreateFileIO(PP_Instance instance) override;
-  PP_Resource CreateFileRef(
-      PP_Instance instance,
-      const ppapi::FileRefCreateInfo& create_info) override;
-  PP_Resource CreateFileSystem(PP_Instance instance,
-                               PP_FileSystemType type) override;
-  PP_Resource CreateGraphics2D(PP_Instance pp_instance,
-                               const PP_Size* size,
-                               PP_Bool is_always_opaque) override;
-  PP_Resource CreatePrinting(PP_Instance instance) override;
-  PP_Resource CreateURLLoader(PP_Instance instance) override;
-  PP_Resource CreateURLRequestInfo(PP_Instance instance) override;
-  PP_Resource CreateWebSocket(PP_Instance instance) override;
-
- private:
-  // Non-owning pointer to the host for the current plugin.
-  raw_ptr<RendererPpapiHostImpl> host_impl_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_IN_PROCESS_RESOURCE_CREATION_H_
diff --git a/content/renderer/pepper/pepper_in_process_router.cc b/content/renderer/pepper/pepper_in_process_router.cc
deleted file mode 100644
index bfe0006..0000000
--- a/content/renderer/pepper/pepper_in_process_router.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_in_process_router.h"
-
-#include <memory>
-
-#include "base/functional/bind.h"
-#include "base/location.h"
-#include "base/task/single_thread_task_runner.h"
-#include "content/public/renderer/render_frame.h"
-#include "content/public/renderer/render_thread.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "ipc/ipc_message.h"
-#include "ipc/ipc_sender.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/shared_impl/ppapi_globals.h"
-#include "ppapi/shared_impl/resource_tracker.h"
-
-using ppapi::UnpackMessage;
-
-namespace content {
-
-class PepperInProcessRouter::Channel : public IPC::Sender {
- public:
-  Channel(const base::RepeatingCallback<bool(IPC::Message*)>& callback)
-      : callback_(callback) {}
-
-  ~Channel() override {}
-
-  bool Send(IPC::Message* message) override { return callback_.Run(message); }
-
- private:
-  base::RepeatingCallback<bool(IPC::Message*)> callback_;
-};
-
-PepperInProcessRouter::PepperInProcessRouter(RendererPpapiHostImpl* host_impl)
-    : host_impl_(host_impl), pending_message_id_(0), reply_result_(false) {
-  browser_channel_ = std::make_unique<Channel>(base::BindRepeating(
-      &PepperInProcessRouter::SendToBrowser, base::Unretained(this)));
-  host_to_plugin_router_ = std::make_unique<Channel>(base::BindRepeating(
-      &PepperInProcessRouter::SendToPlugin, base::Unretained(this)));
-  plugin_to_host_router_ = std::make_unique<Channel>(base::BindRepeating(
-      &PepperInProcessRouter::SendToHost, base::Unretained(this)));
-}
-
-PepperInProcessRouter::~PepperInProcessRouter() {}
-
-IPC::Sender* PepperInProcessRouter::GetPluginToRendererSender() {
-  return plugin_to_host_router_.get();
-}
-
-IPC::Sender* PepperInProcessRouter::GetRendererToPluginSender() {
-  return host_to_plugin_router_.get();
-}
-
-ppapi::proxy::Connection PepperInProcessRouter::GetPluginConnection(
-    PP_Instance instance) {
-  int routing_id = 0;
-  RenderFrame* frame = host_impl_->GetRenderFrameForInstance(instance);
-  if (frame)
-    routing_id = frame->GetRoutingID();
-  return ppapi::proxy::Connection(
-      browser_channel_.get(), plugin_to_host_router_.get(), routing_id);
-}
-
-// static
-bool PepperInProcessRouter::OnPluginMsgReceived(const IPC::Message& msg) {
-  // Emulate the proxy by dispatching the relevant message here.
-  ppapi::proxy::ResourceMessageReplyParams reply_params;
-  IPC::Message nested_msg;
-
-  if (msg.type() == PpapiPluginMsg_ResourceReply::ID) {
-    // Resource reply from the renderer (no routing id).
-    if (!UnpackMessage<PpapiPluginMsg_ResourceReply>(
-            msg, &reply_params, &nested_msg)) {
-      NOTREACHED();
-    }
-  } else if (msg.type() == PpapiHostMsg_InProcessResourceReply::ID) {
-    // Resource reply from the browser (has a routing id).
-    if (!UnpackMessage<PpapiHostMsg_InProcessResourceReply>(
-            msg, &reply_params, &nested_msg)) {
-      NOTREACHED();
-    }
-  } else {
-    return false;
-  }
-  ppapi::Resource* resource =
-      ppapi::PpapiGlobals::Get()->GetResourceTracker()->GetResource(
-          reply_params.pp_resource());
-  // If the resource doesn't exist, it may have been destroyed so just ignore
-  // the message.
-  if (resource)
-    resource->OnReplyReceived(reply_params, nested_msg);
-  return true;
-}
-
-bool PepperInProcessRouter::SendToHost(IPC::Message* msg) {
-  std::unique_ptr<IPC::Message> message(msg);
-
-  if (!message->is_sync()) {
-    // If this is a resource destroyed message, post a task to dispatch it.
-    // Dispatching it synchronously can cause the host to re-enter the proxy
-    // code while we're still in the resource destructor, leading to a crash.
-    // http://crbug.com/276368.
-    // This won't cause message reordering problems because the resource
-    // destroyed message is always the last one sent for a resource.
-    if (message->type() == PpapiHostMsg_ResourceDestroyed::ID) {
-      base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-          FROM_HERE, base::BindOnce(&PepperInProcessRouter::DispatchHostMsg,
-                                    weak_factory_.GetWeakPtr(),
-                                    base::Owned(message.release())));
-      return true;
-    } else {
-      bool result = host_impl_->GetPpapiHost()->OnMessageReceived(*message);
-      DCHECK(result) << "The message was not handled by the host.";
-      return true;
-    }
-  }
-
-  pending_message_id_ = IPC::SyncMessage::GetMessageId(*message);
-  reply_deserializer_ =
-      static_cast<IPC::SyncMessage*>(message.get())->TakeReplyDeserializer();
-  reply_result_ = false;
-
-  bool result = host_impl_->GetPpapiHost()->OnMessageReceived(*message);
-  DCHECK(result) << "The message was not handled by the host.";
-
-  pending_message_id_ = 0;
-  reply_deserializer_.reset(nullptr);
-  return reply_result_;
-}
-
-bool PepperInProcessRouter::SendToPlugin(IPC::Message* msg) {
-  std::unique_ptr<IPC::Message> message(msg);
-  CHECK(!msg->is_sync());
-  if (IPC::SyncMessage::IsMessageReplyTo(*message, pending_message_id_)) {
-    if (!msg->is_reply_error())
-      reply_result_ = reply_deserializer_->SerializeOutputParameters(*message);
-  } else {
-    CHECK(!pending_message_id_);
-    // Dispatch plugin messages from the message loop.
-    base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE, base::BindOnce(&PepperInProcessRouter::DispatchPluginMsg,
-                                  weak_factory_.GetWeakPtr(),
-                                  base::Owned(message.release())));
-  }
-  return true;
-}
-
-void PepperInProcessRouter::DispatchHostMsg(IPC::Message* msg) {
-  bool handled = host_impl_->GetPpapiHost()->OnMessageReceived(*msg);
-  DCHECK(handled);
-}
-
-void PepperInProcessRouter::DispatchPluginMsg(IPC::Message* msg) {
-  bool handled = OnPluginMsgReceived(*msg);
-  DCHECK(handled);
-}
-
-bool PepperInProcessRouter::SendToBrowser(IPC::Message* msg) {
-  return RenderThread::Get()->Send(msg);
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_in_process_router.h b/content/renderer/pepper/pepper_in_process_router.h
deleted file mode 100644
index df2665da..0000000
--- a/content/renderer/pepper/pepper_in_process_router.h
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_IN_PROCESS_ROUTER_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_IN_PROCESS_ROUTER_H_
-
-#include <memory>
-
-#include "base/functional/callback.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/proxy/connection.h"
-#include "ppapi/proxy/resource_message_params.h"
-
-namespace IPC {
-class Message;
-class MessageReplyDeserializer;
-}  // namespace
-
-namespace content {
-
-class RendererPpapiHostImpl;
-
-// This class fakes an IPC channel so that we can take the new resources with
-// IPC backends and run them in-process.
-//
-// (See pepper_in_process_resource_creation.h for more background.)
-//
-// This class just provides the fake routing for in-process plugins.
-// Asynchronous messages are converted into an asynchronous execution of the
-// message receiver on the opposite end. Synchronous messages just call right
-// through.
-//
-// The resources in ppapi/proxy assume that there is an IPC connection to
-// both the renderer and the browser processes. They take a connection object
-// that includes both of these channels. However, in-process plugins don't
-// have a BrowserPpapiHost on the browser side to receive these messages.
-//
-// As a result, we can't support resources that rely on sending messages to the
-// browser process. Since this class is a stopgap until all interfaces are
-// converted and all plugins are run out-of-procss, we just choose not to
-// support faking IPC channels for resources that send messages directly to the
-// browser process. These resources will just have to use the "old" in-process
-// implementation until the conversion is complete and all this code can be
-// deleted.
-//
-// To keep things consistent, we provide an IPC::Sender for the browser channel
-// in the connection object supplied to resources. This dummy browser channel
-// will just assert and delete the message if anything is ever sent over it.
-//
-// There are two restrictions for in-process resource calls:
-// Sync messages can only be sent from the plugin to the host.
-// The host must handle sync messages synchronously.
-class PepperInProcessRouter {
- public:
-  // The given host parameter owns this class and must outlive us.
-  PepperInProcessRouter(RendererPpapiHostImpl* host_impl);
-
-  PepperInProcessRouter(const PepperInProcessRouter&) = delete;
-  PepperInProcessRouter& operator=(const PepperInProcessRouter&) = delete;
-
-  ~PepperInProcessRouter();
-
-  // Returns the dummy sender for the cooresponding end of the in-process
-  // emulated channel.
-  IPC::Sender* GetPluginToRendererSender();
-  IPC::Sender* GetRendererToPluginSender();
-
-  // Returns a connection pair for use by a resource proxy. This includes
-  // the plugin->renderer sender as well as a dummy sender to the browser
-  // process. See the class comment above about the dummy sender.
-  ppapi::proxy::Connection GetPluginConnection(PP_Instance instance);
-
-  // Handles resource reply messages from the host.
-  static bool OnPluginMsgReceived(const IPC::Message& msg);
-
- private:
-  bool SendToHost(IPC::Message* msg);
-  bool SendToPlugin(IPC::Message* msg);
-  void DispatchHostMsg(IPC::Message* msg);
-  void DispatchPluginMsg(IPC::Message* msg);
-  bool SendToBrowser(IPC::Message* msg);
-
-  raw_ptr<RendererPpapiHostImpl> host_impl_;
-
-  class Channel;
-  std::unique_ptr<Channel> browser_channel_;
-
-  // Renderer -> plugin channel.
-  std::unique_ptr<Channel> host_to_plugin_router_;
-
-  // Plugin -> renderer channel.
-  std::unique_ptr<Channel> plugin_to_host_router_;
-
-  // Pending sync message id.
-  int pending_message_id_;
-
-  // Reply deserializer of the pending sync message.
-  std::unique_ptr<IPC::MessageReplyDeserializer> reply_deserializer_;
-
-  // Reply result of the pending sync message.
-  bool reply_result_;
-
-  base::WeakPtrFactory<PepperInProcessRouter> weak_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_IN_PROCESS_ROUTER_H_
diff --git a/content/renderer/pepper/pepper_media_device_manager.cc b/content/renderer/pepper/pepper_media_device_manager.cc
deleted file mode 100644
index c449f7c1..0000000
--- a/content/renderer/pepper/pepper_media_device_manager.cc
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/pepper_media_device_manager.h"
-#include <vector>
-
-#include "base/check.h"
-#include "base/feature_list.h"
-#include "base/functional/bind.h"
-#include "base/location.h"
-#include "base/notreached.h"
-#include "base/task/single_thread_task_runner.h"
-#include "content/public/common/content_features.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "content/renderer/render_frame_impl.h"
-#include "media/media_buildflags.h"
-#include "mojo/public/cpp/bindings/pending_remote.h"
-#include "ppapi/shared_impl/ppb_device_ref_shared.h"
-#include "services/service_manager/public/cpp/interface_provider.h"
-#include "third_party/blink/public/mojom/devtools/console_message.mojom.h"
-#include "third_party/blink/public/web/modules/mediastream/web_media_stream_device_observer.h"
-
-namespace content {
-
-namespace {
-
-const char kPepperInsecureOriginMessage[] =
-    "Microphone and Camera access no longer works on insecure origins. To use "
-    "this feature, you should consider switching your application to a "
-    "secure origin, such as HTTPS. See https://goo.gl/rStTGz for more "
-    "details.";
-
-PP_DeviceType_Dev FromMediaDeviceType(MediaDeviceType type) {
-  switch (type) {
-    case MediaDeviceType::kMediaAudioInput:
-      return PP_DEVICETYPE_DEV_AUDIOCAPTURE;
-    case MediaDeviceType::kMediaVideoInput:
-      return PP_DEVICETYPE_DEV_VIDEOCAPTURE;
-    case MediaDeviceType::kMediaAudioOutput:
-      return PP_DEVICETYPE_DEV_AUDIOOUTPUT;
-    default:
-      NOTREACHED();
-  }
-}
-
-MediaDeviceType ToMediaDeviceType(PP_DeviceType_Dev type) {
-  switch (type) {
-    case PP_DEVICETYPE_DEV_AUDIOCAPTURE:
-      return MediaDeviceType::kMediaAudioInput;
-    case PP_DEVICETYPE_DEV_VIDEOCAPTURE:
-      return MediaDeviceType::kMediaVideoInput;
-    case PP_DEVICETYPE_DEV_AUDIOOUTPUT:
-      return MediaDeviceType::kMediaAudioOutput;
-    default:
-      NOTREACHED();
-  }
-}
-
-ppapi::DeviceRefData FromMediaDeviceInfo(
-    MediaDeviceType type,
-    const blink::WebMediaDeviceInfo& info) {
-  ppapi::DeviceRefData data;
-  data.id = info.device_id;
-  // Some Flash content can't handle an empty string, so stick a space in to
-  // make them happy. See crbug.com/408404.
-  data.name = info.label.empty() ? std::string(" ") : info.label;
-  data.type = FromMediaDeviceType(type);
-  return data;
-}
-
-std::vector<ppapi::DeviceRefData> FromMediaDeviceInfoArray(
-    MediaDeviceType type,
-    const blink::WebMediaDeviceInfoArray& device_infos) {
-  std::vector<ppapi::DeviceRefData> devices;
-  devices.reserve(device_infos.size());
-  for (const auto& device_info : device_infos)
-    devices.push_back(FromMediaDeviceInfo(type, device_info));
-
-  return devices;
-}
-
-}  // namespace
-
-base::WeakPtr<PepperMediaDeviceManager>
-PepperMediaDeviceManager::GetForRenderFrame(
-    RenderFrame* render_frame) {
-  PepperMediaDeviceManager* handler =
-      PepperMediaDeviceManager::Get(render_frame);
-  if (!handler)
-    handler = new PepperMediaDeviceManager(render_frame);
-  return handler->weak_ptr_factory_.GetWeakPtr();
-}
-
-PepperMediaDeviceManager::PepperMediaDeviceManager(RenderFrame* render_frame)
-    : RenderFrameObserver(render_frame),
-      RenderFrameObserverTracker<PepperMediaDeviceManager>(render_frame) {}
-
-PepperMediaDeviceManager::~PepperMediaDeviceManager() {
-  DCHECK(open_callbacks_.empty());
-}
-
-void PepperMediaDeviceManager::EnumerateDevices(PP_DeviceType_Dev type,
-                                                DevicesOnceCallback callback) {
-  bool request_audio_input = type == PP_DEVICETYPE_DEV_AUDIOCAPTURE;
-  bool request_video_input = type == PP_DEVICETYPE_DEV_VIDEOCAPTURE;
-  bool request_audio_output = type == PP_DEVICETYPE_DEV_AUDIOOUTPUT;
-  CHECK(request_audio_input || request_video_input || request_audio_output);
-  GetMediaDevicesDispatcher()->EnumerateDevices(
-      request_audio_input, request_video_input, request_audio_output,
-      false /* request_video_input_capabilities */,
-      false /* request_audio_input_capabilities */,
-      base::BindOnce(&PepperMediaDeviceManager::DevicesEnumerated,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback),
-                     ToMediaDeviceType(type)));
-}
-
-size_t PepperMediaDeviceManager::StartMonitoringDevices(
-    PP_DeviceType_Dev type,
-    const DevicesCallback& callback) {
-  bool subscribe_audio_input = type == PP_DEVICETYPE_DEV_AUDIOCAPTURE;
-  bool subscribe_video_input = type == PP_DEVICETYPE_DEV_VIDEOCAPTURE;
-  bool subscribe_audio_output = type == PP_DEVICETYPE_DEV_AUDIOOUTPUT;
-  CHECK(subscribe_audio_input || subscribe_video_input ||
-        subscribe_audio_output);
-  mojo::PendingRemote<blink::mojom::MediaDevicesListener> listener;
-  size_t subscription_id =
-      receivers_.Add(this, listener.InitWithNewPipeAndPassReceiver());
-  GetMediaDevicesDispatcher()->AddMediaDevicesListener(
-      subscribe_audio_input, subscribe_video_input, subscribe_audio_output,
-      std::move(listener));
-  SubscriptionList& subscriptions =
-      device_change_subscriptions_[static_cast<size_t>(
-          ToMediaDeviceType(type))];
-  subscriptions.push_back(Subscription{subscription_id, callback});
-
-  return subscription_id;
-}
-
-void PepperMediaDeviceManager::StopMonitoringDevices(PP_DeviceType_Dev type,
-                                                     size_t subscription_id) {
-  SubscriptionList& subscriptions =
-      device_change_subscriptions_[static_cast<size_t>(
-          ToMediaDeviceType(type))];
-  std::erase_if(subscriptions,
-                [subscription_id](const Subscription& subscription) {
-                  return subscription.first == subscription_id;
-                });
-  receivers_.Remove(subscription_id);
-}
-
-int PepperMediaDeviceManager::OpenDevice(PP_DeviceType_Dev type,
-                                         const std::string& device_id,
-                                         PP_Instance pp_instance,
-                                         OpenDeviceCallback callback) {
-  open_callbacks_[next_id_] = std::move(callback);
-  int request_id = next_id_++;
-
-  RendererPpapiHostImpl* host =
-      RendererPpapiHostImpl::GetForPPInstance(pp_instance);
-  if (!host->IsSecureContext(pp_instance)) {
-    RenderFrame* render_frame = host->GetRenderFrameForInstance(pp_instance);
-    if (render_frame) {
-      render_frame->AddMessageToConsole(
-          blink::mojom::ConsoleMessageLevel::kWarning,
-          kPepperInsecureOriginMessage);
-    }
-    base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&PepperMediaDeviceManager::OnDeviceOpened,
-                       weak_ptr_factory_.GetWeakPtr(), request_id, false,
-                       std::string(), blink::MediaStreamDevice()));
-    return request_id;
-  }
-
-  GetMediaStreamDispatcherHost()->OpenDevice(
-      request_id, device_id,
-      PepperMediaDeviceManager::FromPepperDeviceType(type),
-      base::BindOnce(&PepperMediaDeviceManager::OnDeviceOpened,
-                     weak_ptr_factory_.GetWeakPtr(), request_id));
-
-  return request_id;
-}
-
-void PepperMediaDeviceManager::CancelOpenDevice(int request_id) {
-  open_callbacks_.erase(request_id);
-
-  GetMediaStreamDispatcherHost()->CancelRequest(request_id);
-}
-
-void PepperMediaDeviceManager::CloseDevice(const std::string& label) {
-  if (!GetMediaStreamDeviceObserver()->RemoveStreams(
-          blink::WebString::FromUTF8(label)))
-    return;
-
-  GetMediaStreamDispatcherHost()->CloseDevice(label);
-}
-
-base::UnguessableToken PepperMediaDeviceManager::GetSessionID(
-    PP_DeviceType_Dev type,
-    const std::string& label) {
-  switch (type) {
-    case PP_DEVICETYPE_DEV_AUDIOCAPTURE:
-      return GetMediaStreamDeviceObserver()->GetAudioSessionId(
-          blink::WebString::FromUTF8(label));
-    case PP_DEVICETYPE_DEV_VIDEOCAPTURE:
-      return GetMediaStreamDeviceObserver()->GetVideoSessionId(
-          blink::WebString::FromUTF8(label));
-    default:
-      NOTREACHED();
-  }
-}
-
-// static
-blink::mojom::MediaStreamType PepperMediaDeviceManager::FromPepperDeviceType(
-    PP_DeviceType_Dev type) {
-  switch (type) {
-    case PP_DEVICETYPE_DEV_INVALID:
-      return blink::mojom::MediaStreamType::NO_SERVICE;
-    case PP_DEVICETYPE_DEV_AUDIOCAPTURE:
-      return blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE;
-    case PP_DEVICETYPE_DEV_VIDEOCAPTURE:
-      return blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE;
-    default:
-      NOTREACHED();
-  }
-}
-
-void PepperMediaDeviceManager::OnDevicesChanged(
-    MediaDeviceType type,
-    const blink::WebMediaDeviceInfoArray& device_infos) {
-  std::vector<ppapi::DeviceRefData> devices =
-      FromMediaDeviceInfoArray(type, device_infos);
-  SubscriptionList& subscriptions =
-      device_change_subscriptions_[static_cast<size_t>(type)];
-  for (auto& subscription : subscriptions)
-    subscription.second.Run(devices);
-}
-
-void PepperMediaDeviceManager::OnDeviceOpened(
-    int request_id,
-    bool success,
-    const std::string& label,
-    const blink::MediaStreamDevice& device) {
-  auto iter = open_callbacks_.find(request_id);
-  if (iter == open_callbacks_.end()) {
-    // The callback may have been unregistered.
-    return;
-  }
-
-  if (success)
-    GetMediaStreamDeviceObserver()->AddStream(blink::WebString::FromUTF8(label),
-                                              device);
-
-  OpenDeviceCallback callback = std::move(iter->second);
-  open_callbacks_.erase(iter);
-
-  std::move(callback).Run(request_id, success, success ? label : std::string());
-}
-
-void PepperMediaDeviceManager::DevicesEnumerated(
-    DevicesOnceCallback client_callback,
-    MediaDeviceType type,
-    const std::vector<blink::WebMediaDeviceInfoArray>& enumeration,
-    std::vector<blink::mojom::VideoInputDeviceCapabilitiesPtr>
-        video_input_capabilities,
-    std::vector<blink::mojom::AudioInputDeviceCapabilitiesPtr>
-        audio_input_capabilities) {
-  std::move(client_callback)
-      .Run(FromMediaDeviceInfoArray(type,
-                                    enumeration[static_cast<size_t>(type)]));
-}
-
-blink::mojom::MediaStreamDispatcherHost*
-PepperMediaDeviceManager::GetMediaStreamDispatcherHost() {
-  if (!dispatcher_host_) {
-    CHECK(render_frame());
-    render_frame()->GetBrowserInterfaceBroker().GetInterface(
-        dispatcher_host_.BindNewPipeAndPassReceiver());
-  }
-  return dispatcher_host_.get();
-}
-
-blink::WebMediaStreamDeviceObserver*
-PepperMediaDeviceManager::GetMediaStreamDeviceObserver() const {
-  DCHECK(render_frame());
-  blink::WebMediaStreamDeviceObserver* const observer =
-      static_cast<RenderFrameImpl*>(render_frame())
-          ->MediaStreamDeviceObserver();
-  DCHECK(observer);
-  return observer;
-}
-
-blink::mojom::MediaDevicesDispatcherHost*
-PepperMediaDeviceManager::GetMediaDevicesDispatcher() {
-  if (!media_devices_dispatcher_) {
-    CHECK(render_frame());
-    render_frame()->GetBrowserInterfaceBroker().GetInterface(
-        media_devices_dispatcher_.BindNewPipeAndPassReceiver());
-  }
-
-  return media_devices_dispatcher_.get();
-}
-
-void PepperMediaDeviceManager::OnDestruct() {
-  delete this;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_media_device_manager.h b/content/renderer/pepper/pepper_media_device_manager.h
deleted file mode 100644
index fff8597..0000000
--- a/content/renderer/pepper/pepper_media_device_manager.h
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_DEVICE_MANAGER_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_DEVICE_MANAGER_H_
-
-#include <map>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/memory/weak_ptr.h"
-#include "content/public/renderer/render_frame_observer.h"
-#include "content/public/renderer/render_frame_observer_tracker.h"
-#include "content/renderer/pepper/pepper_device_enumeration_host_helper.h"
-#include "mojo/public/cpp/bindings/receiver_set.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "ppapi/c/pp_instance.h"
-#include "third_party/blink/public/common/mediastream/media_devices.h"
-#include "third_party/blink/public/mojom/mediastream/media_devices.mojom.h"
-#include "third_party/blink/public/mojom/mediastream/media_stream.mojom.h"
-
-namespace blink {
-class WebMediaStreamDeviceObserver;
-}  // namespace blink
-
-using blink::mojom::MediaDeviceType;
-
-namespace content {
-
-class PepperMediaDeviceManager final
-    : public PepperDeviceEnumerationHostHelper::Delegate,
-      public blink::mojom::MediaDevicesListener,
-      public RenderFrameObserver,
-      public RenderFrameObserverTracker<PepperMediaDeviceManager> {
- public:
-  static base::WeakPtr<PepperMediaDeviceManager> GetForRenderFrame(
-      RenderFrame* render_frame);
-
-  PepperMediaDeviceManager(const PepperMediaDeviceManager&) = delete;
-  PepperMediaDeviceManager& operator=(const PepperMediaDeviceManager&) = delete;
-
-  ~PepperMediaDeviceManager() override;
-
-  // PepperDeviceEnumerationHostHelper::Delegate implementation:
-  void EnumerateDevices(PP_DeviceType_Dev type,
-                        DevicesOnceCallback callback) override;
-  size_t StartMonitoringDevices(PP_DeviceType_Dev type,
-                                const DevicesCallback& callback) override;
-  void StopMonitoringDevices(PP_DeviceType_Dev type,
-                             size_t subscription_id) override;
-
-  // blink::mojom::MediaDevicesListener implementation.
-  void OnDevicesChanged(
-      MediaDeviceType type,
-      const blink::WebMediaDeviceInfoArray& device_infos) override;
-
-  using OpenDeviceCallback =
-      base::OnceCallback<void(int /* request_id */,
-                              bool /* succeeded */,
-                              const std::string& /* label */)>;
-
-  // Opens the specified device. The request ID passed into the callback will be
-  // the same as the return value. If successful, the label passed into the
-  // callback identifies a audio/video steam, which can be used to call
-  // CloseDevice() and GetSesssionID().
-  int OpenDevice(PP_DeviceType_Dev type,
-                 const std::string& device_id,
-                 PP_Instance pp_instance,
-                 OpenDeviceCallback callback);
-  // Cancels an request to open device, using the request ID returned by
-  // OpenDevice(). It is guaranteed that the callback passed into OpenDevice()
-  // won't be called afterwards.
-  void CancelOpenDevice(int request_id);
-  void CloseDevice(const std::string& label);
-  // Gets audio/video session ID given a label.
-  base::UnguessableToken GetSessionID(PP_DeviceType_Dev type,
-                                      const std::string& label);
-
-  // Stream type conversion.
-  static blink::mojom::MediaStreamType FromPepperDeviceType(
-      PP_DeviceType_Dev type);
-
- private:
-  explicit PepperMediaDeviceManager(RenderFrame* render_frame);
-
-  // RenderFrameObserver implementation.
-  void OnDestruct() override;
-
-  // Called by StopEnumerateDevices() after returing to the event loop, to avoid
-  // a reentrancy problem.
-  void StopEnumerateDevicesDelayed(int request_id);
-
-  void OnDeviceOpened(int request_id,
-                      bool success,
-                      const std::string& label,
-                      const blink::MediaStreamDevice& device);
-
-  void DevicesEnumerated(
-      DevicesOnceCallback callback,
-      MediaDeviceType type,
-      const std::vector<blink::WebMediaDeviceInfoArray>& enumeration,
-      std::vector<blink::mojom::VideoInputDeviceCapabilitiesPtr>
-          video_input_capabilities,
-      std::vector<blink::mojom::AudioInputDeviceCapabilitiesPtr>
-          audio_input_capabilities);
-
-  blink::mojom::MediaStreamDispatcherHost* GetMediaStreamDispatcherHost();
-  blink::WebMediaStreamDeviceObserver* GetMediaStreamDeviceObserver() const;
-  blink::mojom::MediaDevicesDispatcherHost* GetMediaDevicesDispatcher();
-
-  int next_id_ = 1;
-  using OpenCallbackMap = std::map<int, OpenDeviceCallback>;
-  OpenCallbackMap open_callbacks_;
-
-  using Subscription = std::pair<size_t, DevicesCallback>;
-  using SubscriptionList = std::vector<Subscription>;
-  SubscriptionList device_change_subscriptions_[static_cast<size_t>(
-      MediaDeviceType::kNumMediaDeviceTypes)];
-
-  mojo::Remote<blink::mojom::MediaStreamDispatcherHost> dispatcher_host_;
-  mojo::Remote<blink::mojom::MediaDevicesDispatcherHost>
-      media_devices_dispatcher_;
-
-  mojo::ReceiverSet<blink::mojom::MediaDevicesListener> receivers_;
-
-  base::WeakPtrFactory<PepperMediaDeviceManager> weak_ptr_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_DEVICE_MANAGER_H_
diff --git a/content/renderer/pepper/pepper_media_stream_audio_track_host.cc b/content/renderer/pepper/pepper_media_stream_audio_track_host.cc
deleted file mode 100644
index 77941aa..0000000
--- a/content/renderer/pepper/pepper_media_stream_audio_track_host.cc
+++ /dev/null
@@ -1,386 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/pepper_media_stream_audio_track_host.h"
-
-#include <algorithm>
-
-#include "base/check_op.h"
-#include "base/functional/bind.h"
-#include "base/location.h"
-#include "base/numerics/ostream_operators.h"
-#include "base/numerics/safe_math.h"
-#include "base/task/single_thread_task_runner.h"
-#include "media/base/audio_bus.h"
-#include "media/base/audio_sample_types.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/c/ppb_audio_buffer.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/shared_impl/media_stream_audio_track_shared.h"
-#include "ppapi/shared_impl/media_stream_buffer.h"
-#include "ppapi/shared_impl/ppb_audio_config_shared.h"
-
-using media::AudioParameters;
-using ppapi::host::HostMessageContext;
-using ppapi::MediaStreamAudioTrackShared;
-
-namespace {
-
-// Audio buffer durations in milliseconds.
-const uint32_t kMinDuration = 10;
-const uint32_t kDefaultDuration = 10;
-
-const int32_t kDefaultNumberOfAudioBuffers = 4;
-const int32_t kMaxNumberOfAudioBuffers = 1000;  // 10 sec
-
-// Returns true if the |sample_rate| is supported in
-// |PP_AudioBuffer_SampleRate|, otherwise false.
-PP_AudioBuffer_SampleRate GetPPSampleRate(int sample_rate) {
-  switch (sample_rate) {
-    case 8000:
-      return PP_AUDIOBUFFER_SAMPLERATE_8000;
-    case 16000:
-      return PP_AUDIOBUFFER_SAMPLERATE_16000;
-    case 22050:
-      return PP_AUDIOBUFFER_SAMPLERATE_22050;
-    case 32000:
-      return PP_AUDIOBUFFER_SAMPLERATE_32000;
-    case 44100:
-      return PP_AUDIOBUFFER_SAMPLERATE_44100;
-    case 48000:
-      return PP_AUDIOBUFFER_SAMPLERATE_48000;
-    case 96000:
-      return PP_AUDIOBUFFER_SAMPLERATE_96000;
-    case 192000:
-      return PP_AUDIOBUFFER_SAMPLERATE_192000;
-    default:
-      return PP_AUDIOBUFFER_SAMPLERATE_UNKNOWN;
-  }
-}
-
-}  // namespace
-
-namespace content {
-
-PepperMediaStreamAudioTrackHost::AudioSink::AudioSink(
-    PepperMediaStreamAudioTrackHost* host)
-    : host_(host),
-      active_buffer_index_(-1),
-      active_buffers_generation_(0),
-      active_buffer_frame_offset_(0),
-      buffers_generation_(0),
-      main_task_runner_(base::SingleThreadTaskRunner::GetCurrentDefault()),
-      number_of_buffers_(kDefaultNumberOfAudioBuffers),
-      bytes_per_second_(0),
-      bytes_per_frame_(0),
-      user_buffer_duration_(kDefaultDuration) {}
-
-PepperMediaStreamAudioTrackHost::AudioSink::~AudioSink() {
-  DCHECK_EQ(main_task_runner_,
-            base::SingleThreadTaskRunner::GetCurrentDefault());
-}
-
-void PepperMediaStreamAudioTrackHost::AudioSink::EnqueueBuffer(int32_t index) {
-  DCHECK_EQ(main_task_runner_,
-            base::SingleThreadTaskRunner::GetCurrentDefault());
-  DCHECK_GE(index, 0);
-  DCHECK_LT(index, host_->buffer_manager()->number_of_buffers());
-  base::AutoLock lock(lock_);
-  buffers_.push_back(index);
-}
-
-int32_t PepperMediaStreamAudioTrackHost::AudioSink::Configure(
-    int32_t number_of_buffers, int32_t duration,
-    const ppapi::host::ReplyMessageContext& context) {
-  DCHECK_EQ(main_task_runner_,
-            base::SingleThreadTaskRunner::GetCurrentDefault());
-
-  if (pending_configure_reply_.is_valid()) {
-    return PP_ERROR_INPROGRESS;
-  }
-  pending_configure_reply_ = context;
-
-  bool changed = false;
-  if (number_of_buffers != number_of_buffers_)
-    changed = true;
-  if (duration != 0 && duration != user_buffer_duration_) {
-    user_buffer_duration_ = duration;
-    changed = true;
-  }
-  number_of_buffers_ = number_of_buffers;
-
-  if (changed) {
-    // Initialize later in OnSetFormat if bytes_per_second_ is not known yet.
-    if (bytes_per_second_ > 0 && bytes_per_frame_ > 0)
-      InitBuffers();
-  } else {
-    SendConfigureReply(PP_OK);
-  }
-  return PP_OK_COMPLETIONPENDING;
-}
-
-void PepperMediaStreamAudioTrackHost::AudioSink::SendConfigureReply(
-    int32_t result) {
-  if (pending_configure_reply_.is_valid()) {
-    pending_configure_reply_.params.set_result(result);
-    host_->host()->SendReply(
-        pending_configure_reply_,
-        PpapiPluginMsg_MediaStreamAudioTrack_ConfigureReply());
-    pending_configure_reply_ = ppapi::host::ReplyMessageContext();
-  }
-}
-
-void PepperMediaStreamAudioTrackHost::AudioSink::SetFormatOnMainThread(
-    int bytes_per_second, int bytes_per_frame) {
-  bytes_per_second_ = bytes_per_second;
-  bytes_per_frame_ = bytes_per_frame;
-  InitBuffers();
-}
-
-void PepperMediaStreamAudioTrackHost::AudioSink::InitBuffers() {
-  DCHECK_EQ(main_task_runner_,
-            base::SingleThreadTaskRunner::GetCurrentDefault());
-  {
-    base::AutoLock lock(lock_);
-    // Clear |buffers_|, so the audio thread will drop all incoming audio data.
-    buffers_.clear();
-    buffers_generation_++;
-  }
-  int32_t frame_rate = bytes_per_second_ / bytes_per_frame_;
-  base::CheckedNumeric<int32_t> frames_per_buffer = user_buffer_duration_;
-  frames_per_buffer *= frame_rate;
-  frames_per_buffer /= base::Time::kMillisecondsPerSecond;
-  base::CheckedNumeric<int32_t> buffer_audio_size =
-      frames_per_buffer * bytes_per_frame_;
-  // The size is slightly bigger than necessary, because 8 extra bytes are
-  // added into the struct. Also see |MediaStreamBuffer|. Also, the size of the
-  // buffer may be larger than requested, since the size of each buffer will be
-  // 4-byte aligned.
-  base::CheckedNumeric<int32_t> buffer_size = buffer_audio_size;
-  buffer_size += sizeof(ppapi::MediaStreamBuffer::Audio);
-  DCHECK_GT(buffer_size.ValueOrDie(), 0);
-
-  // We don't need to hold |lock_| during |host->InitBuffers()| call, because
-  // we just cleared |buffers_| , so the audio thread will drop all incoming
-  // audio data, and not use buffers in |host_|.
-  bool result = host_->InitBuffers(number_of_buffers_,
-                                   buffer_size.ValueOrDie(),
-                                   kRead);
-  if (!result) {
-    SendConfigureReply(PP_ERROR_NOMEMORY);
-    return;
-  }
-
-  // Fill the |buffers_|, so the audio thread can continue receiving audio data.
-  base::AutoLock lock(lock_);
-  output_buffer_size_ = buffer_audio_size.ValueOrDie();
-  for (int32_t i = 0; i < number_of_buffers_; ++i) {
-    int32_t index = host_->buffer_manager()->DequeueBuffer();
-    DCHECK_GE(index, 0);
-    buffers_.push_back(index);
-  }
-
-  SendConfigureReply(PP_OK);
-}
-
-void PepperMediaStreamAudioTrackHost::AudioSink::
-    SendEnqueueBufferMessageOnMainThread(int32_t index,
-                                         int32_t buffers_generation) {
-  DCHECK_EQ(main_task_runner_,
-            base::SingleThreadTaskRunner::GetCurrentDefault());
-  // If |InitBuffers()| is called after this task being posted from the audio
-  // thread, the buffer should become invalid already. We should ignore it.
-  // And because only the main thread modifies the |buffers_generation_|,
-  // so we don't need to lock |lock_| here (main thread).
-  if (buffers_generation == buffers_generation_)
-    host_->SendEnqueueBufferMessageToPlugin(index);
-}
-
-void PepperMediaStreamAudioTrackHost::AudioSink::OnData(
-    const media::AudioBus& audio_bus,
-    base::TimeTicks estimated_capture_time) {
-  DCHECK(audio_thread_checker_.CalledOnValidThread());
-  DCHECK(audio_params_.IsValid());
-  DCHECK_EQ(audio_bus.channels(), audio_params_.channels());
-  // Here, |audio_params_.frames_per_buffer()| refers to the incomming audio
-  // buffer. However, this doesn't necessarily equal
-  // |buffer->number_of_samples|, which is configured by the user when they set
-  // buffer duration.
-  DCHECK_EQ(audio_bus.frames(), audio_params_.frames_per_buffer());
-  DCHECK(!estimated_capture_time.is_null());
-
-  if (first_frame_capture_time_.is_null())
-    first_frame_capture_time_ = estimated_capture_time;
-
-  base::AutoLock lock(lock_);
-  for (int frame_offset = 0; frame_offset < audio_bus.frames(); ) {
-    if (active_buffers_generation_ != buffers_generation_) {
-      // Buffers have changed, so drop the active buffer.
-      active_buffer_index_ = -1;
-    }
-    if (active_buffer_index_ == -1 && !buffers_.empty()) {
-      active_buffers_generation_ = buffers_generation_;
-      active_buffer_frame_offset_ = 0;
-      active_buffer_index_ = buffers_.front();
-      buffers_.pop_front();
-    }
-    if (active_buffer_index_ == -1) {
-      // Eek! We're dropping frames. Bad, bad, bad!
-      break;
-    }
-
-    // TODO(penghuang): Support re-sampling and channel mixing by using
-    // media::AudioConverter.
-    ppapi::MediaStreamBuffer::Audio* buffer =
-        &(host_->buffer_manager()->GetBufferPointer(active_buffer_index_)
-          ->audio);
-    if (active_buffer_frame_offset_ == 0) {
-      // The active buffer is new, so initialise the header and metadata fields.
-      buffer->header.size = host_->buffer_manager()->buffer_size();
-      buffer->header.type = ppapi::MediaStreamBuffer::TYPE_AUDIO;
-      const base::TimeTicks time_at_offset =
-          estimated_capture_time +
-          frame_offset * base::Seconds(1) / audio_params_.sample_rate();
-      buffer->timestamp =
-          (time_at_offset - first_frame_capture_time_).InSecondsF();
-      buffer->sample_rate =
-          static_cast<PP_AudioBuffer_SampleRate>(audio_params_.sample_rate());
-      buffer->data_size = output_buffer_size_;
-      buffer->number_of_channels = audio_params_.channels();
-      buffer->number_of_samples =
-          buffer->data_size * audio_params_.channels() / bytes_per_frame_;
-    }
-
-    const int frames_per_buffer =
-        buffer->number_of_samples / audio_params_.channels();
-    const int frames_to_copy =
-        std::min(frames_per_buffer - active_buffer_frame_offset_,
-                 audio_bus.frames() - frame_offset);
-    audio_bus.ToInterleavedPartial<media::SignedInt16SampleTypeTraits>(
-        frame_offset, frames_to_copy,
-        reinterpret_cast<int16_t*>(buffer->data + active_buffer_frame_offset_ *
-                                                      bytes_per_frame_));
-    active_buffer_frame_offset_ += frames_to_copy;
-    frame_offset += frames_to_copy;
-
-    DCHECK_LE(active_buffer_frame_offset_, frames_per_buffer);
-    if (active_buffer_frame_offset_ == frames_per_buffer) {
-      main_task_runner_->PostTask(
-          FROM_HERE,
-          base::BindOnce(&AudioSink::SendEnqueueBufferMessageOnMainThread,
-                         weak_factory_.GetWeakPtr(), active_buffer_index_,
-                         buffers_generation_));
-      active_buffer_index_ = -1;
-    }
-  }
-}
-
-void PepperMediaStreamAudioTrackHost::AudioSink::OnSetFormat(
-    const AudioParameters& params) {
-  DCHECK(params.IsValid());
-  // TODO(amistry): How do you handle the case where the user configures a
-  // duration that's shorter than the received buffer duration? One option is to
-  // double buffer, where the size of the intermediate ring buffer is at least
-  // max(user requested duration, received buffer duration). There are other
-  // ways of dealing with it, but which one is "correct"?
-  DCHECK_LE(params.GetBufferDuration().InMilliseconds(), kMinDuration);
-  DCHECK_NE(GetPPSampleRate(params.sample_rate()),
-            PP_AUDIOBUFFER_SAMPLERATE_UNKNOWN);
-
-  // TODO(penghuang): support setting format more than once.
-  if (audio_params_.IsValid()) {
-    DCHECK_EQ(params.sample_rate(), audio_params_.sample_rate());
-    DCHECK_EQ(params.channels(), audio_params_.channels());
-  } else {
-    audio_thread_checker_.DetachFromThread();
-    audio_params_ = params;
-
-    static_assert(ppapi::kBitsPerAudioOutputSample == 16,
-                  "Data must be pcm_s16le.");
-    int bytes_per_frame = params.GetBytesPerFrame(media::kSampleFormatS16);
-    int bytes_per_second = params.sample_rate() * bytes_per_frame;
-    main_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&AudioSink::SetFormatOnMainThread,
-                                  weak_factory_.GetWeakPtr(), bytes_per_second,
-                                  bytes_per_frame));
-  }
-}
-
-PepperMediaStreamAudioTrackHost::PepperMediaStreamAudioTrackHost(
-    RendererPpapiHost* host,
-    PP_Instance instance,
-    PP_Resource resource,
-    const blink::WebMediaStreamTrack& track)
-    : PepperMediaStreamTrackHostBase(host, instance, resource),
-      track_(track),
-      connected_(false),
-      audio_sink_(this) {
-  DCHECK(!track_.IsNull());
-}
-
-PepperMediaStreamAudioTrackHost::~PepperMediaStreamAudioTrackHost() {
-  OnClose();
-}
-
-int32_t PepperMediaStreamAudioTrackHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    HostMessageContext* context) {
-  PPAPI_BEGIN_MESSAGE_MAP(PepperMediaStreamAudioTrackHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(
-        PpapiHostMsg_MediaStreamAudioTrack_Configure, OnHostMsgConfigure)
-  PPAPI_END_MESSAGE_MAP()
-  return PepperMediaStreamTrackHostBase::OnResourceMessageReceived(msg,
-                                                                   context);
-}
-
-int32_t PepperMediaStreamAudioTrackHost::OnHostMsgConfigure(
-    HostMessageContext* context,
-    const MediaStreamAudioTrackShared::Attributes& attributes) {
-  if (!MediaStreamAudioTrackShared::VerifyAttributes(attributes))
-    return PP_ERROR_BADARGUMENT;
-
-  int32_t buffers = attributes.buffers
-                        ? std::min(kMaxNumberOfAudioBuffers, attributes.buffers)
-                        : kDefaultNumberOfAudioBuffers;
-  return audio_sink_.Configure(buffers, attributes.duration,
-                               context->MakeReplyMessageContext());
-}
-
-void PepperMediaStreamAudioTrackHost::OnClose() {
-  if (connected_) {
-    blink::WebMediaStreamAudioSink::RemoveFromAudioTrack(&audio_sink_, track_);
-    connected_ = false;
-  }
-  audio_sink_.SendConfigureReply(PP_ERROR_ABORTED);
-}
-
-void PepperMediaStreamAudioTrackHost::OnNewBufferEnqueued() {
-  int32_t index = buffer_manager()->DequeueBuffer();
-  DCHECK_GE(index, 0);
-  audio_sink_.EnqueueBuffer(index);
-}
-
-void PepperMediaStreamAudioTrackHost::DidConnectPendingHostToResource() {
-  if (!connected_) {
-    media::AudioParameters format =
-        blink::WebMediaStreamAudioSink::GetFormatFromAudioTrack(track_);
-    // Although this should only be called on the audio capture thread, that
-    // can't happen until the sink is added to the audio track below.
-    if (format.IsValid())
-      audio_sink_.OnSetFormat(format);
-
-    blink::WebMediaStreamAudioSink::AddToAudioTrack(&audio_sink_, track_);
-    connected_ = true;
-  }
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_media_stream_audio_track_host.h b/content/renderer/pepper/pepper_media_stream_audio_track_host.h
deleted file mode 100644
index ce45d98..0000000
--- a/content/renderer/pepper/pepper_media_stream_audio_track_host.h
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_STREAM_AUDIO_TRACK_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_STREAM_AUDIO_TRACK_HOST_H_
-
-#include <stdint.h>
-
-#include "base/containers/circular_deque.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/thread_checker.h"
-#include "base/time/time.h"
-#include "content/renderer/pepper/pepper_media_stream_track_host_base.h"
-#include "media/base/audio_parameters.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/shared_impl/media_stream_audio_track_shared.h"
-#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_audio_sink.h"
-#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_track.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}  // namespace base
-
-namespace content {
-
-class PepperMediaStreamAudioTrackHost : public PepperMediaStreamTrackHostBase {
- public:
-  PepperMediaStreamAudioTrackHost(RendererPpapiHost* host,
-                                  PP_Instance instance,
-                                  PP_Resource resource,
-                                  const blink::WebMediaStreamTrack& track);
-
-  PepperMediaStreamAudioTrackHost(const PepperMediaStreamAudioTrackHost&) =
-      delete;
-  PepperMediaStreamAudioTrackHost& operator=(
-      const PepperMediaStreamAudioTrackHost&) = delete;
-
- private:
-  // A helper class for receiving audio samples in the audio thread.
-  // This class is created and destroyed on the renderer main thread.
-  class AudioSink : public blink::WebMediaStreamAudioSink {
-   public:
-    explicit AudioSink(PepperMediaStreamAudioTrackHost* host);
-
-    AudioSink(const AudioSink&) = delete;
-    AudioSink& operator=(const AudioSink&) = delete;
-
-    ~AudioSink() override;
-
-    // Enqueues a free buffer index into |buffers_| which will be used for
-    // sending audio samples to plugin.
-    // This function is called on the main thread.
-    void EnqueueBuffer(int32_t index);
-
-    // This function is called on the main thread.
-    int32_t Configure(int32_t number_of_buffers, int32_t duration,
-                      const ppapi::host::ReplyMessageContext& context);
-
-    // Send a reply to the currently pending |Configure()| request.
-    void SendConfigureReply(int32_t result);
-
-    // blink::WebMediaStreamAudioSink overrides:
-    // These two functions should be called on the audio thread.
-    // NOTE: For this specific instance, |OnSetFormat()| is also called on the
-    // main thread. However, the call to |OnSetFormat()| happens before this
-    // sink is added to an audio track, also on the main thread, which should
-    // avoid any potential races.
-    void OnData(const media::AudioBus& audio_bus,
-                base::TimeTicks estimated_capture_time) override;
-    void OnSetFormat(const media::AudioParameters& params) override;
-
-   private:
-    // Initializes buffers on the main thread.
-    void SetFormatOnMainThread(int bytes_per_second, int bytes_per_frame);
-
-    void InitBuffers();
-
-    // Send enqueue buffer message on the main thread.
-    void SendEnqueueBufferMessageOnMainThread(int32_t index,
-                                              int32_t buffers_generation);
-
-    // Unowned host which is available during the AudioSink's lifespan.
-    // It is mainly used in the main thread. But the audio thread will use
-    // host_->buffer_manager() to read some buffer properties. It is safe
-    // because the buffer_manager()'s properties will not be changed after
-    // initialization.
-    raw_ptr<PepperMediaStreamAudioTrackHost> host_;
-
-    // The estimated capture time of the first sample frame of audio. This is
-    // used as the timebase to compute the buffer timestamps.
-    // Access only on the audio thread.
-    base::TimeTicks first_frame_capture_time_;
-
-    // The current audio parameters.
-    // Access only on the audio thread.
-    media::AudioParameters audio_params_;
-
-    // Index of the currently active buffer.
-    // Access only on the audio thread.
-    int active_buffer_index_;
-
-    // Generation of buffers corresponding to the currently active
-    // buffer. Used to make sure the active buffer is still valid.
-    // Access only on the audio thread.
-    int32_t active_buffers_generation_;
-
-    // Current offset, in sample frames, within the currently active buffer.
-    // Access only on the audio thread.
-    int active_buffer_frame_offset_;
-
-    // A lock to protect the index queue |buffers_|, |buffers_generation_|,
-    // buffers in |host_->buffer_manager()|, and |output_buffer_size_|.
-    base::Lock lock_;
-
-    // A queue for free buffer indices.
-    base::circular_deque<int32_t> buffers_;
-
-    // Generation of buffers. It is increased by every |InitBuffers()| call.
-    int32_t buffers_generation_;
-
-    // Intended size of each output buffer.
-    int32_t output_buffer_size_;
-
-    scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-
-    base::ThreadChecker audio_thread_checker_;
-
-    // Number of buffers.
-    int32_t number_of_buffers_;
-
-    // Number of bytes per second.
-    int bytes_per_second_;
-
-    // Number of bytes per frame = channels * bytes per sample.
-    int bytes_per_frame_;
-
-    // User-configured buffer duration, in milliseconds.
-    int32_t user_buffer_duration_;
-
-    // Pending |Configure()| reply context.
-    ppapi::host::ReplyMessageContext pending_configure_reply_;
-
-    base::WeakPtrFactory<AudioSink> weak_factory_{this};
-  };
-
-  ~PepperMediaStreamAudioTrackHost() override;
-
-  // ResourceMessageHandler overrides:
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-
-  // Message handlers:
-  int32_t OnHostMsgConfigure(
-      ppapi::host::HostMessageContext* context,
-      const ppapi::MediaStreamAudioTrackShared::Attributes& attributes);
-
-  // PepperMediaStreamTrackHostBase overrides:
-  void OnClose() override;
-
-  // MediaStreamBufferManager::Delegate overrides:
-  void OnNewBufferEnqueued() override;
-
-  // ResourceHost overrides:
-  void DidConnectPendingHostToResource() override;
-
-  blink::WebMediaStreamTrack track_;
-
-  // True if |audio_sink_| has been added to |blink::WebMediaStreamTrack|
-  // as a sink.
-  bool connected_;
-
-  AudioSink audio_sink_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_STREAM_AUDIO_TRACK_HOST_H_
diff --git a/content/renderer/pepper/pepper_media_stream_track_host_base.cc b/content/renderer/pepper/pepper_media_stream_track_host_base.cc
deleted file mode 100644
index 096ba52..0000000
--- a/content/renderer/pepper/pepper_media_stream_track_host_base.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_media_stream_track_host_base.h"
-
-#include <utility>
-
-#include "base/check_op.h"
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "base/numerics/safe_math.h"
-#include "content/common/pepper_file_util.h"
-#include "content/public/renderer/render_thread.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/shared_impl/media_stream_buffer.h"
-
-using ppapi::host::HostMessageContext;
-using ppapi::proxy::SerializedHandle;
-
-namespace content {
-
-PepperMediaStreamTrackHostBase::PepperMediaStreamTrackHostBase(
-    RendererPpapiHost* host,
-    PP_Instance instance,
-    PP_Resource resource)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      host_(host),
-      buffer_manager_(this) {}
-
-PepperMediaStreamTrackHostBase::~PepperMediaStreamTrackHostBase() {}
-
-bool PepperMediaStreamTrackHostBase::InitBuffers(int32_t number_of_buffers,
-                                                 int32_t buffer_size,
-                                                 TrackType track_type) {
-  DCHECK_GT(number_of_buffers, 0);
-  DCHECK_GT(buffer_size,
-            static_cast<int32_t>(sizeof(ppapi::MediaStreamBuffer::Header)));
-  // Make each buffer 4 byte aligned.
-  base::CheckedNumeric<int32_t> buffer_size_aligned = buffer_size;
-  // TODO(amistry): "buffer size" might not == "buffer stride", in the same way
-  // that width != stride in an image buffer.
-  buffer_size_aligned += (4 - buffer_size % 4);
-
-  // TODO(penghuang): |HostAllocateSharedMemoryBuffer| uses sync IPC. We should
-  // avoid it.
-  base::CheckedNumeric<uint32_t> size = number_of_buffers * buffer_size_aligned;
-  if (!size.IsValid())
-    return false;
-
-  base::UnsafeSharedMemoryRegion region =
-      base::UnsafeSharedMemoryRegion::Create(size.ValueOrDie());
-  if (!region.IsValid())
-    return false;
-
-  SerializedHandle handle(
-      host_->ShareUnsafeSharedMemoryRegionWithRemote(region));
-  if (!buffer_manager_.SetBuffers(number_of_buffers,
-                                  buffer_size_aligned.ValueOrDie(),
-                                  std::move(region), true)) {
-    return false;
-  }
-
-  bool readonly = (track_type == kRead);
-  std::vector<SerializedHandle> handles;
-  handles.push_back(std::move(handle));
-  host()->SendUnsolicitedReplyWithHandles(
-      pp_resource(),
-      PpapiPluginMsg_MediaStreamTrack_InitBuffers(
-          number_of_buffers, buffer_size_aligned.ValueOrDie(), readonly),
-      &handles);
-  return true;
-}
-
-void PepperMediaStreamTrackHostBase::SendEnqueueBufferMessageToPlugin(
-    int32_t index) {
-  DCHECK_GE(index, 0);
-  DCHECK_LT(index, buffer_manager_.number_of_buffers());
-  host()->SendUnsolicitedReply(
-      pp_resource(), PpapiPluginMsg_MediaStreamTrack_EnqueueBuffer(index));
-}
-
-void PepperMediaStreamTrackHostBase::SendEnqueueBuffersMessageToPlugin(
-    const std::vector<int32_t>& indices) {
-  DCHECK_GE(indices.size(), 0U);
-  host()->SendUnsolicitedReply(pp_resource(),
-      PpapiPluginMsg_MediaStreamTrack_EnqueueBuffers(indices));
-}
-
-int32_t PepperMediaStreamTrackHostBase::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    HostMessageContext* context) {
-  PPAPI_BEGIN_MESSAGE_MAP(PepperMediaStreamTrackHostBase, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(
-        PpapiHostMsg_MediaStreamTrack_EnqueueBuffer, OnHostMsgEnqueueBuffer)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_MediaStreamTrack_Close,
-                                        OnHostMsgClose)
-  PPAPI_END_MESSAGE_MAP()
-  return ppapi::host::ResourceHost::OnResourceMessageReceived(msg, context);
-}
-
-int32_t PepperMediaStreamTrackHostBase::OnHostMsgEnqueueBuffer(
-    HostMessageContext* context,
-    int32_t index) {
-  buffer_manager_.EnqueueBuffer(index);
-  return PP_OK;
-}
-
-int32_t PepperMediaStreamTrackHostBase::OnHostMsgClose(
-    HostMessageContext* context) {
-  OnClose();
-  return PP_OK;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_media_stream_track_host_base.h b/content/renderer/pepper/pepper_media_stream_track_host_base.h
deleted file mode 100644
index 863fc2ea..0000000
--- a/content/renderer/pepper/pepper_media_stream_track_host_base.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_STREAM_TRACK_HOST_BASE_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_STREAM_TRACK_HOST_BASE_H_
-
-#include <stdint.h>
-
-#include "base/memory/raw_ptr.h"
-#include "ppapi/host/resource_host.h"
-#include "ppapi/shared_impl/media_stream_buffer_manager.h"
-
-namespace content {
-
-class RendererPpapiHost;
-
-class PepperMediaStreamTrackHostBase
-    : public ppapi::host::ResourceHost,
-      public ppapi::MediaStreamBufferManager::Delegate {
- public:
-  PepperMediaStreamTrackHostBase(const PepperMediaStreamTrackHostBase&) =
-      delete;
-  PepperMediaStreamTrackHostBase& operator=(
-      const PepperMediaStreamTrackHostBase&) = delete;
-
- protected:
-  PepperMediaStreamTrackHostBase(RendererPpapiHost* host,
-                                 PP_Instance instance,
-                                 PP_Resource resource);
-  ~PepperMediaStreamTrackHostBase() override;
-
-  enum TrackType {
-    kRead,
-    kWrite
-  };
-  bool InitBuffers(int32_t number_of_buffers,
-                   int32_t buffer_size,
-                   TrackType track_type);
-
-  ppapi::MediaStreamBufferManager* buffer_manager() { return &buffer_manager_; }
-
-  // Sends a buffer index to the corresponding MediaStreamTrackResourceBase
-  // via an IPC message. The resource adds the buffer index into its
-  // |buffer_manager_| for reading or writing.
-  // Also see |MediaStreamBufferManager|.
-  void SendEnqueueBufferMessageToPlugin(int32_t index);
-
-  // Sends a set of buffer indices to the corresponding
-  // MediaStreamTrackResourceBase via an IPC message.
-  // The resource adds the buffer indices into its
-  // |frame_buffer_| for reading or writing. Also see |MediaStreamFrameBuffer|.
-  void SendEnqueueBuffersMessageToPlugin(const std::vector<int32_t>& indices);
-
-  // ResourceMessageHandler overrides:
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-
-  // Message handlers:
-  virtual int32_t OnHostMsgEnqueueBuffer(
-      ppapi::host::HostMessageContext* context, int32_t index);
-
- private:
-  // Subclasses must implement this method to clean up when the track is closed.
-  virtual void OnClose() = 0;
-
-  // Message handlers:
-  int32_t OnHostMsgClose(ppapi::host::HostMessageContext* context);
-
-  raw_ptr<RendererPpapiHost> host_;
-
-  ppapi::MediaStreamBufferManager buffer_manager_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_STREAM_TRACK_HOST_BASE_H_
diff --git a/content/renderer/pepper/pepper_media_stream_video_track_host.cc b/content/renderer/pepper/pepper_media_stream_video_track_host.cc
deleted file mode 100644
index 122afc3..0000000
--- a/content/renderer/pepper/pepper_media_stream_video_track_host.cc
+++ /dev/null
@@ -1,559 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/pepper_media_stream_video_track_host.h"
-
-#include <stddef.h>
-
-#include "base/base64.h"
-#include "base/functional/bind.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/rand_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/task/bind_post_task.h"
-#include "base/task/sequenced_task_runner.h"
-#include "base/task/single_thread_task_runner.h"
-#include "media/base/video_util.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/c/ppb_media_stream_video_track.h"
-#include "ppapi/c/ppb_video_frame.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/shared_impl/media_stream_buffer.h"
-#include "third_party/blink/public/platform/web_string.h"
-#include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h"
-#include "third_party/blink/public/web/modules/mediastream/web_media_stream_utils.h"
-#include "third_party/libyuv/include/libyuv.h"
-
-using media::VideoFrame;
-using ppapi::host::HostMessageContext;
-using ppapi::MediaStreamVideoTrackShared;
-
-namespace {
-
-const int32_t kDefaultNumberOfVideoBuffers = 4;
-const int32_t kMaxNumberOfVideoBuffers = 8;
-// Filter mode for scaling frames.
-const libyuv::FilterMode kFilterMode = libyuv::kFilterBox;
-
-const char kPepperVideoSourceName[] = "PepperVideoSourceName";
-
-// Default config for output mode.
-const int kDefaultOutputFrameRate = 30;
-
-media::VideoPixelFormat ToPixelFormat(PP_VideoFrame_Format format) {
-  switch (format) {
-    case PP_VIDEOFRAME_FORMAT_YV12:
-      return media::PIXEL_FORMAT_YV12;
-    case PP_VIDEOFRAME_FORMAT_I420:
-      return media::PIXEL_FORMAT_I420;
-    default:
-      DVLOG(1) << "Unsupported pixel format " << format;
-      return media::PIXEL_FORMAT_UNKNOWN;
-  }
-}
-
-PP_VideoFrame_Format ToPpapiFormat(media::VideoPixelFormat format) {
-  switch (format) {
-    case media::PIXEL_FORMAT_YV12:
-      return PP_VIDEOFRAME_FORMAT_YV12;
-    case media::PIXEL_FORMAT_I420:
-      return PP_VIDEOFRAME_FORMAT_I420;
-    default:
-      DVLOG(1) << "Unsupported pixel format " << format;
-      return PP_VIDEOFRAME_FORMAT_UNKNOWN;
-  }
-}
-
-media::VideoPixelFormat FromPpapiFormat(PP_VideoFrame_Format format) {
-  switch (format) {
-    case PP_VIDEOFRAME_FORMAT_YV12:
-      return media::PIXEL_FORMAT_YV12;
-    case PP_VIDEOFRAME_FORMAT_I420:
-      return media::PIXEL_FORMAT_I420;
-    default:
-      DVLOG(1) << "Unsupported pixel format " << format;
-      return media::PIXEL_FORMAT_UNKNOWN;
-  }
-}
-
-// Compute size base on the size of frame received from MediaStreamVideoSink
-// and size specified by plugin.
-gfx::Size GetTargetSize(const gfx::Size& source, const gfx::Size& plugin) {
-  return gfx::Size(plugin.width() ? plugin.width() : source.width(),
-                   plugin.height() ? plugin.height() : source.height());
-}
-
-// Compute format base on the format of frame received from MediaStreamVideoSink
-// and format specified by plugin.
-PP_VideoFrame_Format GetTargetFormat(PP_VideoFrame_Format source,
-                                     PP_VideoFrame_Format plugin) {
-  return plugin != PP_VIDEOFRAME_FORMAT_UNKNOWN ? plugin : source;
-}
-
-void ConvertFromMediaVideoFrame(const media::VideoFrame& src,
-                                PP_VideoFrame_Format dst_format,
-                                const gfx::Size& dst_size,
-                                uint8_t* dst) {
-  CHECK(src.format() == media::PIXEL_FORMAT_YV12 ||
-        src.format() == media::PIXEL_FORMAT_I420);
-  if (dst_format == PP_VIDEOFRAME_FORMAT_BGRA) {
-    if (src.visible_rect().size() == dst_size) {
-      libyuv::I420ToARGB(src.visible_data(VideoFrame::Plane::kY),
-                         src.stride(VideoFrame::Plane::kY),
-                         src.visible_data(VideoFrame::Plane::kU),
-                         src.stride(VideoFrame::Plane::kU),
-                         src.visible_data(VideoFrame::Plane::kV),
-                         src.stride(VideoFrame::Plane::kV), dst,
-                         dst_size.width() * 4, dst_size.width(),
-                         dst_size.height());
-    } else {
-      libyuv::YUVToARGBScaleClip(
-          src.visible_data(VideoFrame::Plane::kY),
-          src.stride(VideoFrame::Plane::kY),
-          src.visible_data(VideoFrame::Plane::kU),
-          src.stride(VideoFrame::Plane::kU),
-          src.visible_data(VideoFrame::Plane::kV),
-          src.stride(VideoFrame::Plane::kV), libyuv::FOURCC_YV12,
-          src.visible_rect().width(), src.visible_rect().height(), dst,
-          dst_size.width() * 4, libyuv::FOURCC_ARGB, dst_size.width(),
-          dst_size.height(), 0, 0, dst_size.width(), dst_size.height(),
-          kFilterMode);
-    }
-  } else if (dst_format == PP_VIDEOFRAME_FORMAT_YV12 ||
-             dst_format == PP_VIDEOFRAME_FORMAT_I420) {
-    static const size_t kPlanesOrder[][3] = {
-        {VideoFrame::Plane::kY, VideoFrame::Plane::kV,
-         VideoFrame::Plane::kU},  // YV12
-        {VideoFrame::Plane::kY, VideoFrame::Plane::kU,
-         VideoFrame::Plane::kV},  // I420
-    };
-    const int plane_order = (dst_format == PP_VIDEOFRAME_FORMAT_YV12) ? 0 : 1;
-    int dst_width = dst_size.width();
-    int dst_height = dst_size.height();
-    libyuv::ScalePlane(src.visible_data(kPlanesOrder[plane_order][0]),
-                       src.stride(kPlanesOrder[plane_order][0]),
-                       src.visible_rect().width(), src.visible_rect().height(),
-                       dst, dst_width, dst_width, dst_height, kFilterMode);
-    dst += dst_width * dst_height;
-    const int src_halfwidth = (src.visible_rect().width() + 1) >> 1;
-    const int src_halfheight = (src.visible_rect().height() + 1) >> 1;
-    const int dst_halfwidth = (dst_width + 1) >> 1;
-    const int dst_halfheight = (dst_height + 1) >> 1;
-    libyuv::ScalePlane(src.visible_data(kPlanesOrder[plane_order][1]),
-                       src.stride(kPlanesOrder[plane_order][1]), src_halfwidth,
-                       src_halfheight, dst, dst_halfwidth, dst_halfwidth,
-                       dst_halfheight, kFilterMode);
-    dst += dst_halfwidth * dst_halfheight;
-    libyuv::ScalePlane(src.visible_data(kPlanesOrder[plane_order][2]),
-                       src.stride(kPlanesOrder[plane_order][2]), src_halfwidth,
-                       src_halfheight, dst, dst_halfwidth, dst_halfwidth,
-                       dst_halfheight, kFilterMode);
-  } else {
-    NOTREACHED();
-  }
-}
-
-}  // namespace
-
-namespace content {
-
-// Internal class used for delivering video frames on the IO-thread to
-// the blink::MediaStreamVideoSource implementation.
-class PepperMediaStreamVideoTrackHost::FrameDeliverer
-    : public base::RefCountedThreadSafe<FrameDeliverer> {
- public:
-  FrameDeliverer(scoped_refptr<base::SequencedTaskRunner> video_task_runner,
-                 const blink::VideoCaptureDeliverFrameCB& new_frame_callback);
-
-  FrameDeliverer(const FrameDeliverer&) = delete;
-  FrameDeliverer& operator=(const FrameDeliverer&) = delete;
-
-  void DeliverVideoFrame(scoped_refptr<media::VideoFrame> frame);
-
- private:
-  friend class base::RefCountedThreadSafe<FrameDeliverer>;
-  virtual ~FrameDeliverer();
-
-  void DeliverFrameOnIO(scoped_refptr<media::VideoFrame> frame);
-
-  scoped_refptr<base::SequencedTaskRunner> video_task_runner_;
-  blink::VideoCaptureDeliverFrameCB new_frame_callback_;
-};
-
-PepperMediaStreamVideoTrackHost::FrameDeliverer::FrameDeliverer(
-    scoped_refptr<base::SequencedTaskRunner> video_task_runner,
-    const blink::VideoCaptureDeliverFrameCB& new_frame_callback)
-    : video_task_runner_(video_task_runner),
-      new_frame_callback_(new_frame_callback) {}
-
-PepperMediaStreamVideoTrackHost::FrameDeliverer::~FrameDeliverer() {
-}
-
-void PepperMediaStreamVideoTrackHost::FrameDeliverer::DeliverVideoFrame(
-    scoped_refptr<media::VideoFrame> frame) {
-  video_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&FrameDeliverer::DeliverFrameOnIO, this,
-                                std::move(frame)));
-}
-
-void PepperMediaStreamVideoTrackHost::FrameDeliverer::DeliverFrameOnIO(
-    scoped_refptr<media::VideoFrame> frame) {
-  DCHECK(video_task_runner_->RunsTasksInCurrentSequence());
-  // The time when this frame is generated is unknown so give a null value to
-  // |estimated_capture_time|.
-  new_frame_callback_.Run(std::move(frame), base::TimeTicks());
-}
-
-PepperMediaStreamVideoTrackHost::PepperMediaStreamVideoTrackHost(
-    RendererPpapiHost* host,
-    PP_Instance instance,
-    PP_Resource resource,
-    const blink::WebMediaStreamTrack& track)
-    : PepperMediaStreamTrackHostBase(host, instance, resource),
-      track_(track),
-      number_of_buffers_(kDefaultNumberOfVideoBuffers),
-      source_frame_format_(PP_VIDEOFRAME_FORMAT_UNKNOWN),
-      plugin_frame_format_(PP_VIDEOFRAME_FORMAT_UNKNOWN),
-      frame_data_size_(0),
-      type_(kRead) {
-  DCHECK(!track_.IsNull());
-}
-
-PepperMediaStreamVideoTrackHost::PepperMediaStreamVideoTrackHost(
-    RendererPpapiHost* host,
-    PP_Instance instance,
-    PP_Resource resource)
-    : PepperMediaStreamTrackHostBase(host, instance, resource),
-      number_of_buffers_(kDefaultNumberOfVideoBuffers),
-      source_frame_format_(PP_VIDEOFRAME_FORMAT_UNKNOWN),
-      plugin_frame_format_(PP_VIDEOFRAME_FORMAT_UNKNOWN),
-      frame_data_size_(0),
-      type_(kWrite) {
-  InitBlinkTrack();
-  DCHECK(!track_.IsNull());
-}
-
-PepperMediaStreamVideoTrackHost::~PepperMediaStreamVideoTrackHost() {
-  OnClose();
-}
-
-bool PepperMediaStreamVideoTrackHost::IsMediaStreamVideoTrackHost() {
-  return true;
-}
-
-void PepperMediaStreamVideoTrackHost::InitBuffers() {
-  gfx::Size size = GetTargetSize(source_frame_size_, plugin_frame_size_);
-  DCHECK(!size.IsEmpty());
-
-  PP_VideoFrame_Format format =
-      GetTargetFormat(source_frame_format_, plugin_frame_format_);
-  DCHECK_NE(format, PP_VIDEOFRAME_FORMAT_UNKNOWN);
-
-  if (format == PP_VIDEOFRAME_FORMAT_BGRA) {
-    frame_data_size_ = size.width() * size.height() * 4;
-  } else {
-    frame_data_size_ =
-        VideoFrame::AllocationSize(FromPpapiFormat(format), size);
-  }
-
-  DCHECK_GT(frame_data_size_, 0U);
-  int32_t buffer_size =
-      sizeof(ppapi::MediaStreamBuffer::Video) + frame_data_size_;
-  bool result = PepperMediaStreamTrackHostBase::InitBuffers(number_of_buffers_,
-                                                            buffer_size,
-                                                            type_);
-  CHECK(result);
-
-  if (type_ == kWrite) {
-    for (int32_t i = 0; i < buffer_manager()->number_of_buffers(); ++i) {
-      ppapi::MediaStreamBuffer::Video* buffer =
-          &(buffer_manager()->GetBufferPointer(i)->video);
-      buffer->header.size = buffer_manager()->buffer_size();
-      buffer->header.type = ppapi::MediaStreamBuffer::TYPE_VIDEO;
-      buffer->format = format;
-      buffer->size.width = size.width();
-      buffer->size.height = size.height();
-      buffer->data_size = frame_data_size_;
-    }
-
-    // Make all the frames avaiable to the plugin.
-    std::vector<int32_t> indices = buffer_manager()->DequeueBuffers();
-    SendEnqueueBuffersMessageToPlugin(indices);
-  }
-}
-
-void PepperMediaStreamVideoTrackHost::OnClose() {
-  blink::MediaStreamVideoSink::DisconnectFromTrack();
-  weak_factory_.InvalidateWeakPtrs();
-}
-
-int32_t PepperMediaStreamVideoTrackHost::OnHostMsgEnqueueBuffer(
-    ppapi::host::HostMessageContext* context, int32_t index) {
-  if (type_ == kRead) {
-    return PepperMediaStreamTrackHostBase::OnHostMsgEnqueueBuffer(context,
-                                                                  index);
-  } else {
-    return SendFrameToTrack(index);
-  }
-}
-
-int32_t PepperMediaStreamVideoTrackHost::SendFrameToTrack(int32_t index) {
-  DCHECK_EQ(type_, kWrite);
-
-  if (frame_deliverer_) {
-    // Sends the frame to blink video track.
-    ppapi::MediaStreamBuffer::Video* pp_frame =
-        &(buffer_manager()->GetBufferPointer(index)->video);
-
-    int32_t y_stride = plugin_frame_size_.width();
-    int32_t uv_stride = (plugin_frame_size_.width() + 1) / 2;
-    uint8_t* y_data = static_cast<uint8_t*>(pp_frame->data);
-    // Default to I420
-    uint8_t* u_data = y_data + plugin_frame_size_.GetArea();
-    uint8_t* v_data = y_data + (plugin_frame_size_.GetArea() * 5 / 4);
-    if (plugin_frame_format_ == PP_VIDEOFRAME_FORMAT_YV12) {
-      // Swap u and v for YV12.
-      uint8_t* tmp = u_data;
-      u_data = v_data;
-      v_data = tmp;
-    }
-
-    int64_t ts_ms = static_cast<int64_t>(pp_frame->timestamp *
-                                         base::Time::kMillisecondsPerSecond);
-    scoped_refptr<VideoFrame> frame = media::VideoFrame::WrapExternalYuvData(
-        FromPpapiFormat(plugin_frame_format_), plugin_frame_size_,
-        gfx::Rect(plugin_frame_size_), plugin_frame_size_, y_stride, uv_stride,
-        uv_stride, y_data, u_data, v_data, base::Milliseconds(ts_ms));
-    if (!frame)
-      return PP_ERROR_FAILED;
-
-    frame_deliverer_->DeliverVideoFrame(frame);
-  }
-
-  // Makes the frame available again for plugin.
-  SendEnqueueBufferMessageToPlugin(index);
-  return PP_OK;
-}
-
-void PepperMediaStreamVideoTrackHost::OnVideoFrame(
-    scoped_refptr<VideoFrame> video_frame,
-    base::TimeTicks estimated_capture_time) {
-  DCHECK(video_frame);
-  // TODO(penghuang): Check |frame->end_of_stream()| and close the track.
-  // Scaled video frames are currently ignored.
-  scoped_refptr<media::VideoFrame> frame = video_frame;
-  // Drop alpha channel since we do not support it yet.
-  if (frame->format() == media::PIXEL_FORMAT_I420A)
-    frame = media::WrapAsI420VideoFrame(video_frame);
-  PP_VideoFrame_Format ppformat = ToPpapiFormat(frame->format());
-  if (frame->storage_type() == media::VideoFrame::STORAGE_GPU_MEMORY_BUFFER) {
-    // NV12 is the only supported GMB pixel format at the moment, and there is
-    // no corresponding PP_VideoFrame_Format. Convert the video frame to I420.
-    DCHECK_EQ(frame->format(), media::PIXEL_FORMAT_NV12);
-    ppformat = PP_VIDEOFRAME_FORMAT_I420;
-    auto scoped_mapping = video_frame->MapGMBOrSharedImage();
-    if (!scoped_mapping) {
-      DLOG(WARNING) << "Failed to get a scoped_mapping object.";
-      return;
-    }
-    frame = media::VideoFrame::CreateFrame(
-        media::PIXEL_FORMAT_I420, video_frame->coded_size(),
-        video_frame->visible_rect(), video_frame->natural_size(),
-        video_frame->timestamp());
-    int ret = libyuv::NV12ToI420(scoped_mapping->Memory(0),
-        scoped_mapping->Stride(0),
-        scoped_mapping->Memory(1),
-        scoped_mapping->Stride(1),
-        frame->writable_data(media::VideoFrame::Plane::kY),
-        frame->stride(media::VideoFrame::Plane::kY),
-        frame->writable_data(media::VideoFrame::Plane::kU),
-        frame->stride(media::VideoFrame::Plane::kU),
-        frame->writable_data(media::VideoFrame::Plane::kV),
-        frame->stride(media::VideoFrame::Plane::kV),
-        video_frame->coded_size().width(), video_frame->coded_size().height());
-    if (ret != 0) {
-      DLOG(WARNING) << "Failed to convert NV12 to I420";
-      return;
-    }
-  }
-  if (ppformat == PP_VIDEOFRAME_FORMAT_UNKNOWN)
-    return;
-
-  if (source_frame_size_.IsEmpty()) {
-    source_frame_size_ = frame->visible_rect().size();
-    source_frame_format_ = ppformat;
-    InitBuffers();
-  }
-
-  int32_t index = buffer_manager()->DequeueBuffer();
-  // Drop frames if the underlying buffer is full.
-  if (index < 0) {
-    DVLOG(1) << "A frame is dropped.";
-    return;
-  }
-
-  CHECK_EQ(ppformat, source_frame_format_) << "Frame format is changed.";
-
-  gfx::Size size = GetTargetSize(source_frame_size_, plugin_frame_size_);
-  ppformat =
-      GetTargetFormat(source_frame_format_, plugin_frame_format_);
-  ppapi::MediaStreamBuffer::Video* buffer =
-      &(buffer_manager()->GetBufferPointer(index)->video);
-  buffer->header.size = buffer_manager()->buffer_size();
-  buffer->header.type = ppapi::MediaStreamBuffer::TYPE_VIDEO;
-  buffer->timestamp = frame->timestamp().InSecondsF();
-  buffer->format = ppformat;
-  buffer->size.width = size.width();
-  buffer->size.height = size.height();
-  buffer->data_size = frame_data_size_;
-  ConvertFromMediaVideoFrame(*frame, ppformat, size, buffer->data);
-
-  SendEnqueueBufferMessageToPlugin(index);
-}
-
-class PepperMediaStreamVideoTrackHost::VideoSource final
-    : public blink::MediaStreamVideoSource {
- public:
-  explicit VideoSource(base::WeakPtr<PepperMediaStreamVideoTrackHost> host)
-      : blink::MediaStreamVideoSource(
-            base::SingleThreadTaskRunner::GetCurrentDefault()),
-        host_(std::move(host)) {}
-
-  VideoSource(const VideoSource&) = delete;
-  VideoSource& operator=(const VideoSource&) = delete;
-
-  ~VideoSource() final { StopSourceImpl(); }
-
-  void StartSourceImpl(
-      blink::MediaStreamVideoSourceCallbacks media_stream_callbacks) final {
-    if (host_) {
-      host_->frame_deliverer_ = new FrameDeliverer(
-          video_task_runner(),
-          std::move(media_stream_callbacks.deliver_frame_cb));
-    }
-  }
-
-  void StopSourceImpl() final {
-    if (host_)
-      host_->frame_deliverer_ = nullptr;
-  }
-
-  base::WeakPtr<MediaStreamVideoSource> GetWeakPtr() final {
-    return weak_factory_.GetWeakPtr();
-  }
-
- private:
-  std::optional<media::VideoCaptureFormat> GetCurrentFormat() const override {
-    if (host_) {
-      return std::optional<media::VideoCaptureFormat>(media::VideoCaptureFormat(
-          host_->plugin_frame_size_, kDefaultOutputFrameRate,
-          ToPixelFormat(host_->plugin_frame_format_)));
-    }
-    return std::optional<media::VideoCaptureFormat>();
-  }
-
-  const base::WeakPtr<PepperMediaStreamVideoTrackHost> host_;
-  base::WeakPtrFactory<MediaStreamVideoSource> weak_factory_{this};
-};
-
-void PepperMediaStreamVideoTrackHost::DidConnectPendingHostToResource() {
-  if (!blink::MediaStreamVideoSink::connected_track().IsNull())
-    return;
-  blink::MediaStreamVideoSink::ConnectToTrack(
-      track_,
-      base::BindPostTaskToCurrentDefault(
-          base::BindRepeating(&PepperMediaStreamVideoTrackHost::OnVideoFrame,
-                              weak_factory_.GetWeakPtr())),
-      MediaStreamVideoSink::IsSecure::kNo,
-      MediaStreamVideoSink::UsesAlpha::kDefault);
-}
-
-int32_t PepperMediaStreamVideoTrackHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    HostMessageContext* context) {
-  PPAPI_BEGIN_MESSAGE_MAP(PepperMediaStreamVideoTrackHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(
-        PpapiHostMsg_MediaStreamVideoTrack_Configure, OnHostMsgConfigure)
-  PPAPI_END_MESSAGE_MAP()
-  return PepperMediaStreamTrackHostBase::OnResourceMessageReceived(msg,
-                                                                   context);
-}
-
-int32_t PepperMediaStreamVideoTrackHost::OnHostMsgConfigure(
-    HostMessageContext* context,
-    const MediaStreamVideoTrackShared::Attributes& attributes) {
-  CHECK(MediaStreamVideoTrackShared::VerifyAttributes(attributes));
-
-  bool changed = false;
-  gfx::Size new_size(attributes.width, attributes.height);
-  if (GetTargetSize(source_frame_size_, plugin_frame_size_) !=
-      GetTargetSize(source_frame_size_, new_size)) {
-    changed = true;
-  }
-  plugin_frame_size_ = new_size;
-
-  int32_t buffers = attributes.buffers
-                        ? std::min(kMaxNumberOfVideoBuffers, attributes.buffers)
-                        : kDefaultNumberOfVideoBuffers;
-  if (buffers != number_of_buffers_)
-    changed = true;
-  number_of_buffers_ = buffers;
-
-  if (GetTargetFormat(source_frame_format_, plugin_frame_format_) !=
-      GetTargetFormat(source_frame_format_, attributes.format)) {
-    changed = true;
-  }
-  plugin_frame_format_ = attributes.format;
-
-  // If the first frame has been received, we will re-initialize buffers with
-  // new settings. Otherwise, we will initialize buffer when we receive
-  // the first frame, because plugin can only provide part of attributes
-  // which are not enough to initialize buffers.
-  if (changed && (type_ == kWrite || !source_frame_size_.IsEmpty()))
-    InitBuffers();
-
-  // TODO(ronghuawu): Ask the owner of DOMMediaStreamTrackToResource why
-  // source id instead of track id is used there.
-  const std::string id = track_.Source().Id().Utf8();
-  context->reply_msg = PpapiPluginMsg_MediaStreamVideoTrack_ConfigureReply(id);
-  return PP_OK;
-}
-
-void PepperMediaStreamVideoTrackHost::InitBlinkTrack() {
-  std::string source_id = base::Base64Encode(base::RandBytesAsVector(64));
-  blink::WebMediaStreamSource webkit_source;
-  auto source = std::make_unique<VideoSource>(weak_factory_.GetWeakPtr());
-  blink::MediaStreamVideoSource* const source_ptr = source.get();
-  webkit_source.Initialize(blink::WebString::FromASCII(source_id),
-                           blink::WebMediaStreamSource::kTypeVideo,
-                           blink::WebString::FromASCII(kPepperVideoSourceName),
-                           false /* remote */,
-                           std::move(source));  // Takes ownership of |source|.
-
-  const bool enabled = true;
-  track_ = blink::CreateWebMediaStreamVideoTrack(
-      source_ptr,
-      base::BindOnce(&PepperMediaStreamVideoTrackHost::OnTrackStarted,
-                     base::Unretained(this)),
-      enabled);
-  // Note: The call to CreateVideoTrack() returned a track that holds a
-  // ref-counted reference to |webkit_source| (and, implicitly, |source|).
-}
-
-void PepperMediaStreamVideoTrackHost::OnTrackStarted(
-    blink::WebPlatformMediaStreamSource* source,
-    blink::mojom::MediaStreamRequestResult result,
-    const blink::WebString& result_name) {
-  DVLOG(3) << "OnTrackStarted result: " << result;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_media_stream_video_track_host.h b/content/renderer/pepper/pepper_media_stream_video_track_host.h
deleted file mode 100644
index 22781642..0000000
--- a/content/renderer/pepper/pepper_media_stream_video_track_host.h
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_STREAM_VIDEO_TRACK_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_STREAM_VIDEO_TRACK_HOST_H_
-
-#include <stdint.h>
-
-#include "base/memory/weak_ptr.h"
-#include "content/renderer/pepper/pepper_media_stream_track_host_base.h"
-#include "media/base/video_frame.h"
-#include "ppapi/c/ppb_video_frame.h"
-#include "ppapi/shared_impl/media_stream_video_track_shared.h"
-#include "third_party/blink/public/common/mediastream/media_stream_request.h"
-#include "third_party/blink/public/mojom/mediastream/media_stream.mojom-shared.h"
-#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_track.h"
-#include "third_party/blink/public/web/modules/mediastream/media_stream_video_sink.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace blink {
-class WebPlatformMediaStreamSource;
-}  // namespace blink
-
-namespace content {
-
-class PepperMediaStreamVideoTrackHost : public PepperMediaStreamTrackHostBase,
-                                        public blink::MediaStreamVideoSink {
- public:
-  // Input mode constructor.
-  // In input mode, this class passes video frames from |track| to the
-  // associated pepper plugin.
-  PepperMediaStreamVideoTrackHost(RendererPpapiHost* host,
-                                  PP_Instance instance,
-                                  PP_Resource resource,
-                                  const blink::WebMediaStreamTrack& track);
-
-  // Output mode constructor.
-  // In output mode, this class passes video frames from the associated
-  // pepper plugin to a newly created blink::WebMediaStreamTrack.
-  PepperMediaStreamVideoTrackHost(RendererPpapiHost* host,
-                                  PP_Instance instance,
-                                  PP_Resource resource);
-
-  PepperMediaStreamVideoTrackHost(const PepperMediaStreamVideoTrackHost&) =
-      delete;
-  PepperMediaStreamVideoTrackHost& operator=(
-      const PepperMediaStreamVideoTrackHost&) = delete;
-
-  ~PepperMediaStreamVideoTrackHost() override;
-
-  bool IsMediaStreamVideoTrackHost() override;
-
-  blink::WebMediaStreamTrack track() { return track_; }
-
- private:
-  // Implements a MediaStreamVideoSource that drives this host (output mode
-  // only). VideoSource holds a weak reference to the host, and sets/clears
-  // |frame_deliverer_|.
-  class VideoSource;
-
-  void InitBuffers();
-
-  // PepperMediaStreamTrackHostBase overrides:
-  void OnClose() override;
-  int32_t OnHostMsgEnqueueBuffer(ppapi::host::HostMessageContext* context,
-                                 int32_t index) override;
-
-  // Sends frame with |index| to |track_|.
-  int32_t SendFrameToTrack(int32_t index);
-
-  void OnVideoFrame(
-      scoped_refptr<media::VideoFrame> video_frame,
-      base::TimeTicks estimated_capture_time);
-
-  // ResourceHost overrides:
-  void DidConnectPendingHostToResource() override;
-
-  // ResourceMessageHandler overrides:
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-
-  // Message handlers:
-  int32_t OnHostMsgConfigure(
-      ppapi::host::HostMessageContext* context,
-      const ppapi::MediaStreamVideoTrackShared::Attributes& attributes);
-
-  void InitBlinkTrack();
-  void OnTrackStarted(blink::WebPlatformMediaStreamSource* source,
-                      blink::mojom::MediaStreamRequestResult result,
-                      const blink::WebString& result_name);
-
-  blink::WebMediaStreamTrack track_;
-
-  // Number of buffers.
-  int32_t number_of_buffers_;
-
-  // Size of frames which are received from MediaStreamVideoSink.
-  gfx::Size source_frame_size_;
-
-  // Plugin specified frame size.
-  gfx::Size plugin_frame_size_;
-
-  // Format of frames which are received from MediaStreamVideoSink.
-  PP_VideoFrame_Format source_frame_format_;
-
-  // Plugin specified frame format.
-  PP_VideoFrame_Format plugin_frame_format_;
-
-  // The size of frame pixels in bytes.
-  uint32_t frame_data_size_;
-
-  // TODO(ronghuawu): Remove |type_| and split PepperMediaStreamVideoTrackHost
-  // into 2 classes for read and write.
-  TrackType type_;
-
-  // Internal class used for delivering video frames on the IO-thread to
-  // the MediaStreamVideoSource implementation.
-  class FrameDeliverer;
-  scoped_refptr<FrameDeliverer> frame_deliverer_;
-
-  base::WeakPtrFactory<PepperMediaStreamVideoTrackHost> weak_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_MEDIA_STREAM_VIDEO_TRACK_HOST_H_
diff --git a/content/renderer/pepper/pepper_platform_audio_input.cc b/content/renderer/pepper/pepper_platform_audio_input.cc
deleted file mode 100644
index 10d0afc..0000000
--- a/content/renderer/pepper/pepper_platform_audio_input.cc
+++ /dev/null
@@ -1,292 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_platform_audio_input.h"
-
-#include "base/check_op.h"
-#include "base/functional/bind.h"
-#include "base/location.h"
-#include "base/task/single_thread_task_runner.h"
-#include "build/build_config.h"
-#include "content/child/child_process.h"
-#include "content/renderer/pepper/pepper_audio_input_host.h"
-#include "content/renderer/pepper/pepper_media_device_manager.h"
-#include "content/renderer/render_frame_impl.h"
-#include "media/audio/audio_device_description.h"
-#include "media/audio/audio_source_parameters.h"
-#include "ppapi/shared_impl/ppb_audio_config_shared.h"
-#include "third_party/blink/public/platform/task_type.h"
-#include "third_party/blink/public/web/modules/media/audio/audio_input_ipc_factory.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-
-namespace content {
-
-// static
-PepperPlatformAudioInput* PepperPlatformAudioInput::Create(
-    int render_frame_id,
-    const std::string& device_id,
-    int sample_rate,
-    int frames_per_buffer,
-    PepperAudioInputHost* client) {
-  scoped_refptr<PepperPlatformAudioInput> audio_input(
-      new PepperPlatformAudioInput());
-  if (audio_input->Initialize(render_frame_id,
-                              device_id,
-                              sample_rate,
-                              frames_per_buffer,
-                              client)) {
-    // Balanced by Release invoked in
-    // PepperPlatformAudioInput::ShutDownOnIOThread().
-    audio_input->AddRef();
-    return audio_input.get();
-  }
-  return nullptr;
-}
-
-void PepperPlatformAudioInput::StartCapture() {
-  DCHECK(main_task_runner_->BelongsToCurrentThread());
-
-  io_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PepperPlatformAudioInput::StartCaptureOnIOThread, this));
-}
-
-void PepperPlatformAudioInput::StopCapture() {
-  DCHECK(main_task_runner_->BelongsToCurrentThread());
-
-  io_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PepperPlatformAudioInput::StopCaptureOnIOThread, this));
-}
-
-void PepperPlatformAudioInput::ShutDown() {
-  DCHECK(main_task_runner_->BelongsToCurrentThread());
-
-  // Make sure we don't call shutdown more than once.
-  if (!client_)
-    return;
-
-  // Called on the main thread to stop all audio callbacks. We must only change
-  // the client on the main thread, and the delegates from the I/O thread.
-  client_ = nullptr;
-  io_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PepperPlatformAudioInput::ShutDownOnIOThread, this));
-}
-
-void PepperPlatformAudioInput::OnStreamCreated(
-    base::UnsafeSharedMemoryRegion shared_memory_region,
-    base::SyncSocket::ScopedHandle socket_handle,
-    bool initially_muted) {
-  DCHECK(shared_memory_region.IsValid());
-#if BUILDFLAG(IS_WIN)
-  DCHECK(socket_handle.IsValid());
-#else
-  DCHECK(socket_handle.is_valid());
-#endif
-  DCHECK_GT(shared_memory_region.GetSize(), 0u);
-
-  // If we're not on the main thread then bounce over to it. Don't use
-  // base::SingleThreadTaskRunner::GetCurrentDefault() as |main_task_runner_|
-  // will never match that. See crbug.com/1150822.
-  if (!main_task_runner_->BelongsToCurrentThread()) {
-    // If shutdown has occurred, |client_| will be NULL and the handles will be
-    // cleaned up on the main thread.
-    main_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&PepperPlatformAudioInput::OnStreamCreated,
-                                  this, std::move(shared_memory_region),
-                                  std::move(socket_handle), initially_muted));
-  } else {
-    // Must dereference the client only on the main thread. Shutdown may have
-    // occurred while the request was in-flight, so we need to NULL check.
-    if (client_) {
-      client_->StreamCreated(std::move(shared_memory_region),
-                             std::move(socket_handle));
-    }
-  }
-}
-
-void PepperPlatformAudioInput::OnError(
-    media::AudioCapturerSource::ErrorCode code) {}
-
-void PepperPlatformAudioInput::OnMuted(bool is_muted) {}
-
-void PepperPlatformAudioInput::OnIPCClosed() { ipc_.reset(); }
-
-PepperPlatformAudioInput::~PepperPlatformAudioInput() {
-  // Make sure we have been shut down. Warning: this may happen on the I/O
-  // thread!
-  // Although these members should be accessed on a specific thread (either the
-  // main thread or the I/O thread), it should be fine to examine their value
-  // here.
-  DCHECK(!ipc_);
-  DCHECK(!client_);
-  DCHECK(label_.empty());
-  DCHECK(!pending_open_device_);
-}
-
-PepperPlatformAudioInput::PepperPlatformAudioInput()
-    : io_task_runner_(ChildProcess::current()->io_task_runner()) {}
-
-bool PepperPlatformAudioInput::Initialize(
-    int render_frame_id,
-    const std::string& device_id,
-    int sample_rate,
-    int frames_per_buffer,
-    PepperAudioInputHost* client) {
-  RenderFrameImpl* const render_frame =
-      RenderFrameImpl::FromRoutingID(render_frame_id);
-  if (!render_frame || !client)
-    return false;
-
-  main_task_runner_ =
-      render_frame->GetTaskRunner(blink::TaskType::kInternalMediaRealTime);
-
-  render_frame_id_ = render_frame_id;
-  render_frame_token_ = render_frame->GetWebFrame()->GetLocalFrameToken();
-  client_ = client;
-
-  if (!GetMediaDeviceManager())
-    return false;
-
-  params_.Reset(media::AudioParameters::AUDIO_PCM_LINEAR,
-                media::ChannelLayoutConfig::Mono(), sample_rate,
-                frames_per_buffer);
-
-  // We need to open the device and obtain the label and session ID before
-  // initializing.
-  pending_open_device_id_ = GetMediaDeviceManager()->OpenDevice(
-      PP_DEVICETYPE_DEV_AUDIOCAPTURE,
-      device_id.empty() ? media::AudioDeviceDescription::kDefaultDeviceId
-                        : device_id,
-      client->pp_instance(),
-      base::BindOnce(&PepperPlatformAudioInput::OnDeviceOpened, this));
-  pending_open_device_ = true;
-
-  return true;
-}
-
-void PepperPlatformAudioInput::InitializeOnIOThread(
-    const base::UnguessableToken& session_id) {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-
-  if (ipc_startup_state_ != kStopped) {
-    ipc_ = blink::AudioInputIPCFactory::CreateAudioInputIPC(
-        render_frame_token_, main_task_runner_,
-        media::AudioSourceParameters(session_id));
-  }
-  if (!ipc_)
-    return;
-
-  // We will be notified by OnStreamCreated().
-  create_stream_sent_ = true;
-  ipc_->CreateStream(this, params_, false, 1);
-
-  if (ipc_startup_state_ == kStarted)
-    ipc_->RecordStream();
-}
-
-void PepperPlatformAudioInput::StartCaptureOnIOThread() {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-
-  if (!ipc_) {
-    ipc_startup_state_ = kStarted;
-    return;
-  }
-
-  ipc_->RecordStream();
-}
-
-void PepperPlatformAudioInput::StopCaptureOnIOThread() {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-
-  if (!ipc_) {
-    ipc_startup_state_ = kStopped;
-    return;
-  }
-
-  // TODO(yzshen): We cannot re-start capturing if the stream is closed.
-  if (ipc_ && create_stream_sent_) {
-    ipc_->CloseStream();
-  }
-  ipc_.reset();
-}
-
-void PepperPlatformAudioInput::ShutDownOnIOThread() {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-
-  StopCaptureOnIOThread();
-
-  main_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&PepperPlatformAudioInput::CloseDevice, this));
-
-  Release();  // Release for the delegate, balances out the reference taken in
-              // PepperPlatformAudioInput::Create.
-}
-
-void PepperPlatformAudioInput::OnDeviceOpened(int request_id,
-                                              bool succeeded,
-                                              const std::string& label) {
-  DCHECK(main_task_runner_->BelongsToCurrentThread());
-
-  pending_open_device_ = false;
-  pending_open_device_id_ = -1;
-
-  PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager();
-  if (succeeded && device_manager) {
-    DCHECK(!label.empty());
-    label_ = label;
-
-    if (client_) {
-      base::UnguessableToken session_id =
-          device_manager->GetSessionID(PP_DEVICETYPE_DEV_AUDIOCAPTURE, label);
-      io_task_runner_->PostTask(
-          FROM_HERE,
-          base::BindOnce(&PepperPlatformAudioInput::InitializeOnIOThread, this,
-                         session_id));
-    } else {
-      // Shutdown has occurred.
-      CloseDevice();
-    }
-  } else {
-    NotifyStreamCreationFailed();
-  }
-}
-
-void PepperPlatformAudioInput::CloseDevice() {
-  DCHECK(main_task_runner_->BelongsToCurrentThread());
-
-  if (!label_.empty()) {
-    PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager();
-    if (device_manager)
-      device_manager->CloseDevice(label_);
-    label_.clear();
-  }
-  if (pending_open_device_) {
-    PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager();
-    if (device_manager)
-      device_manager->CancelOpenDevice(pending_open_device_id_);
-    pending_open_device_ = false;
-    pending_open_device_id_ = -1;
-  }
-}
-
-void PepperPlatformAudioInput::NotifyStreamCreationFailed() {
-  DCHECK(main_task_runner_->BelongsToCurrentThread());
-
-  if (client_)
-    client_->StreamCreationFailed();
-}
-
-PepperMediaDeviceManager* PepperPlatformAudioInput::GetMediaDeviceManager() {
-  DCHECK(main_task_runner_->BelongsToCurrentThread());
-
-  RenderFrameImpl* const render_frame =
-      RenderFrameImpl::FromRoutingID(render_frame_id_);
-  return render_frame
-             ? PepperMediaDeviceManager::GetForRenderFrame(render_frame).get()
-             : nullptr;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_platform_audio_input.h b/content/renderer/pepper/pepper_platform_audio_input.h
deleted file mode 100644
index e533622..0000000
--- a/content/renderer/pepper/pepper_platform_audio_input.h
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_
-
-#include <memory>
-#include <string>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "ipc/ipc_message.h"
-#include "media/audio/audio_input_ipc.h"
-#include "media/base/audio_capturer_source.h"
-#include "media/base/audio_parameters.h"
-#include "third_party/blink/public/common/tokens/tokens.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace media {
-class AudioParameters;
-}
-
-namespace content {
-
-class PepperAudioInputHost;
-class PepperMediaDeviceManager;
-
-// PepperPlatformAudioInput is operated on two threads: the main thread (the
-// thread on which objects are created) and the I/O thread. All public methods,
-// except the destructor, must be called on the main thread. The notifications
-// to the users of this class (i.e. PepperAudioInputHost) are also sent on the
-// main thread. Internally, this class sends audio input IPC messages and
-// receives media::AudioInputIPCDelegate notifications on the I/O thread.
-
-class PepperPlatformAudioInput
-    : public media::AudioInputIPCDelegate,
-      public base::RefCountedThreadSafe<PepperPlatformAudioInput> {
- public:
-  // Factory function, returns NULL on failure. StreamCreated() will be called
-  // when the stream is created.
-  static PepperPlatformAudioInput* Create(
-      int render_frame_id,
-      const std::string& device_id,
-      int sample_rate,
-      int frames_per_buffer,
-      PepperAudioInputHost* client);
-
-  PepperPlatformAudioInput(const PepperPlatformAudioInput&) = delete;
-  PepperPlatformAudioInput& operator=(const PepperPlatformAudioInput&) = delete;
-
-  // Called on main thread.
-  void StartCapture();
-  void StopCapture();
-  // Closes the stream. Make sure to call this before the object is destructed.
-  void ShutDown();
-
-  // media::AudioInputIPCDelegate.
-  void OnStreamCreated(base::UnsafeSharedMemoryRegion shared_memory_region,
-                       base::SyncSocket::ScopedHandle socket_handle,
-                       bool initially_muted) override;
-  void OnError(media::AudioCapturerSource::ErrorCode code) override;
-  void OnMuted(bool is_muted) override;
-  void OnIPCClosed() override;
-
- protected:
-  ~PepperPlatformAudioInput() override;
-
- private:
-  friend class base::RefCountedThreadSafe<PepperPlatformAudioInput>;
-
-  PepperPlatformAudioInput();
-
-  bool Initialize(int render_frame_id,
-                  const std::string& device_id,
-                  int sample_rate,
-                  int frames_per_buffer,
-                  PepperAudioInputHost* client);
-
-  // I/O thread backends to above functions.
-  void InitializeOnIOThread(const base::UnguessableToken& session_id);
-  void StartCaptureOnIOThread();
-  void StopCaptureOnIOThread();
-  void ShutDownOnIOThread();
-
-  void OnDeviceOpened(int request_id, bool succeeded, const std::string& label);
-  void CloseDevice();
-  void NotifyStreamCreationFailed();
-
-  // Can return NULL if the RenderFrame referenced by |render_frame_id_| has
-  // gone away.
-  PepperMediaDeviceManager* GetMediaDeviceManager();
-
-  // The client to notify when the stream is created. THIS MUST ONLY BE
-  // ACCESSED ON THE MAIN THREAD.
-  raw_ptr<PepperAudioInputHost> client_ = nullptr;
-
-  // Used to send/receive IPC. THIS MUST ONLY BE ACCESSED ON THE
-  // I/O THREAD.
-  std::unique_ptr<media::AudioInputIPC> ipc_;
-
-  scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-  scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
-
-  // The frame containing the Pepper widget.
-  int render_frame_id_ = MSG_ROUTING_NONE;
-  blink::LocalFrameToken render_frame_token_;
-
-  // The unique ID to identify the opened device. THIS MUST ONLY BE ACCESSED ON
-  // THE MAIN THREAD.
-  std::string label_;
-
-  // Initialized on the main thread and accessed on the I/O thread afterwards.
-  media::AudioParameters params_;
-
-  // Whether we have tried to create an audio stream. THIS MUST ONLY BE ACCESSED
-  // ON THE I/O THREAD.
-  bool create_stream_sent_ = false;
-
-  // Whether we have a pending request to open a device. We have to make sure
-  // there isn't any pending request before this object goes away.
-  // THIS MUST ONLY BE ACCESSED ON THE MAIN THREAD.
-  bool pending_open_device_ = false;
-  // THIS MUST ONLY BE ACCESSED ON THE MAIN THREAD.
-  int pending_open_device_id_ = -1;
-
-  // Used to handle cases where (Start|Stop)CaptureOnIOThread runs before the
-  // InitializeOnIOThread. THIS MUST ONLY BE ACCESSED ON THE IO THREAD.
-  enum { kIdle, kStarted, kStopped } ipc_startup_state_ = kIdle;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_INPUT_H_
diff --git a/content/renderer/pepper/pepper_platform_audio_output.cc b/content/renderer/pepper/pepper_platform_audio_output.cc
deleted file mode 100644
index ef9f8be..0000000
--- a/content/renderer/pepper/pepper_platform_audio_output.cc
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_platform_audio_output.h"
-
-#include "base/check_op.h"
-#include "base/functional/bind.h"
-#include "base/location.h"
-#include "base/notreached.h"
-#include "base/task/single_thread_task_runner.h"
-#include "build/build_config.h"
-#include "content/child/child_process.h"
-#include "content/renderer/pepper/audio_helper.h"
-#include "ppapi/shared_impl/ppb_audio_config_shared.h"
-#include "third_party/blink/public/web/modules/media/audio/audio_output_ipc_factory.h"
-
-namespace content {
-
-// static
-PepperPlatformAudioOutput* PepperPlatformAudioOutput::Create(
-    int sample_rate,
-    int frames_per_buffer,
-    const blink::LocalFrameToken& source_frame_token,
-    AudioHelper* client) {
-  scoped_refptr<PepperPlatformAudioOutput> audio_output(
-      new PepperPlatformAudioOutput());
-  if (audio_output->Initialize(sample_rate, frames_per_buffer,
-                               source_frame_token, client)) {
-    // Balanced by Release invoked in
-    // PepperPlatformAudioOutput::ShutDownOnIOThread().
-    audio_output->AddRef();
-    return audio_output.get();
-  }
-  return nullptr;
-}
-
-bool PepperPlatformAudioOutput::StartPlayback() {
-  if (ipc_) {
-    io_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&PepperPlatformAudioOutput::StartPlaybackOnIOThread,
-                       this));
-    return true;
-  }
-  return false;
-}
-
-bool PepperPlatformAudioOutput::StopPlayback() {
-  if (ipc_) {
-    io_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&PepperPlatformAudioOutput::StopPlaybackOnIOThread,
-                       this));
-    return true;
-  }
-  return false;
-}
-
-bool PepperPlatformAudioOutput::SetVolume(double volume) {
-  if (ipc_) {
-    io_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&PepperPlatformAudioOutput::SetVolumeOnIOThread, this,
-                       volume));
-    return true;
-  }
-  return false;
-}
-
-void PepperPlatformAudioOutput::ShutDown() {
-  // Called on the main thread to stop all audio callbacks. We must only change
-  // the client on the main thread, and the delegates from the I/O thread.
-  client_ = nullptr;
-  io_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PepperPlatformAudioOutput::ShutDownOnIOThread, this));
-}
-
-void PepperPlatformAudioOutput::OnError() {}
-
-void PepperPlatformAudioOutput::OnDeviceAuthorized(
-    media::OutputDeviceStatus device_status,
-    const media::AudioParameters& output_params,
-    const std::string& matched_device_id) {
-  NOTREACHED();
-}
-
-void PepperPlatformAudioOutput::OnStreamCreated(
-    base::UnsafeSharedMemoryRegion shared_memory_region,
-    base::SyncSocket::ScopedHandle socket_handle,
-    bool playing_automatically) {
-  DCHECK(shared_memory_region.IsValid());
-#if BUILDFLAG(IS_WIN)
-  DCHECK(socket_handle.IsValid());
-#else
-  DCHECK(socket_handle.is_valid());
-#endif
-  DCHECK_GT(shared_memory_region.GetSize(), 0u);
-
-  if (base::SingleThreadTaskRunner::GetCurrentDefault().get() ==
-      main_task_runner_.get()) {
-    // Must dereference the client only on the main thread. Shutdown may have
-    // occurred while the request was in-flight, so we need to NULL check.
-    if (client_)
-      client_->StreamCreated(std::move(shared_memory_region),
-                             std::move(socket_handle));
-  } else {
-    main_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&PepperPlatformAudioOutput::OnStreamCreated, this,
-                       std::move(shared_memory_region),
-                       std::move(socket_handle), playing_automatically));
-  }
-}
-
-void PepperPlatformAudioOutput::OnIPCClosed() { ipc_.reset(); }
-
-PepperPlatformAudioOutput::~PepperPlatformAudioOutput() {
-  // Make sure we have been shut down. Warning: this will usually happen on
-  // the I/O thread!
-  DCHECK(!ipc_);
-  DCHECK(!client_);
-}
-
-PepperPlatformAudioOutput::PepperPlatformAudioOutput()
-    : client_(nullptr),
-      main_task_runner_(base::SingleThreadTaskRunner::GetCurrentDefault()),
-      io_task_runner_(ChildProcess::current()->io_task_runner()) {}
-
-bool PepperPlatformAudioOutput::Initialize(
-    int sample_rate,
-    int frames_per_buffer,
-    const blink::LocalFrameToken& source_frame_token,
-    AudioHelper* client) {
-  DCHECK(client);
-  client_ = client;
-
-  ipc_ = blink::AudioOutputIPCFactory::GetInstance().CreateAudioOutputIPC(
-      source_frame_token);
-  CHECK(ipc_);
-
-  media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                                media::ChannelLayoutConfig::Stereo(),
-                                sample_rate, frames_per_buffer);
-
-  io_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PepperPlatformAudioOutput::InitializeOnIOThread, this,
-                     params));
-  return true;
-}
-
-void PepperPlatformAudioOutput::InitializeOnIOThread(
-    const media::AudioParameters& params) {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-  if (ipc_)
-    ipc_->CreateStream(this, params);
-}
-
-void PepperPlatformAudioOutput::StartPlaybackOnIOThread() {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-  if (ipc_)
-    ipc_->PlayStream();
-}
-
-void PepperPlatformAudioOutput::SetVolumeOnIOThread(double volume) {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-  if (ipc_)
-    ipc_->SetVolume(volume);
-}
-
-void PepperPlatformAudioOutput::StopPlaybackOnIOThread() {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-  if (ipc_)
-    ipc_->PauseStream();
-}
-
-void PepperPlatformAudioOutput::ShutDownOnIOThread() {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-
-  // Make sure we don't call shutdown more than once.
-  if (!ipc_)
-    return;
-
-  ipc_->CloseStream();
-  ipc_.reset();
-
-  Release();  // Release for the delegate, balances out the reference taken in
-              // PepperPlatformAudioOutput::Create.
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_platform_audio_output.h b/content/renderer/pepper/pepper_platform_audio_output.h
deleted file mode 100644
index 30e6452..0000000
--- a/content/renderer/pepper/pepper_platform_audio_output.h
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_OUTPUT_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_OUTPUT_H_
-
-#include <memory>
-#include <string>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "media/audio/audio_output_ipc.h"
-#include "third_party/blink/public/common/tokens/tokens.h"
-
-namespace media {
-class AudioParameters;
-}
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace content {
-class AudioHelper;
-
-class PepperPlatformAudioOutput
-    : public media::AudioOutputIPCDelegate,
-      public base::RefCountedThreadSafe<PepperPlatformAudioOutput> {
- public:
-  // Factory function, returns NULL on failure. StreamCreated() will be called
-  // when the stream is created.
-  static PepperPlatformAudioOutput* Create(
-      int sample_rate,
-      int frames_per_buffer,
-      const blink::LocalFrameToken& source_frame_token,
-      AudioHelper* client);
-
-  PepperPlatformAudioOutput(const PepperPlatformAudioOutput&) = delete;
-  PepperPlatformAudioOutput& operator=(const PepperPlatformAudioOutput&) =
-      delete;
-
-  // The following three methods are all called on main thread.
-
-  // Starts the playback. Returns false on error or if called before the
-  // stream is created or after the stream is closed.
-  bool StartPlayback();
-
-  // Stops the playback. Returns false on error or if called before the stream
-  // is created or after the stream is closed.
-  bool StopPlayback();
-
-  // Sets the volume. Returns false on error or if called before the stream
-  // is created or after the stream is closed.
-  bool SetVolume(double volume);
-
-  // Closes the stream. Make sure to call this before the object is
-  // destructed.
-  void ShutDown();
-
-  // media::AudioOutputIPCDelegate implementation.
-  void OnError() override;
-  void OnDeviceAuthorized(media::OutputDeviceStatus device_status,
-                          const media::AudioParameters& output_params,
-                          const std::string& matched_device_id) override;
-  void OnStreamCreated(base::UnsafeSharedMemoryRegion shared_memory_region,
-                       base::SyncSocket::ScopedHandle socket_handle,
-                       bool playing_automatically) override;
-  void OnIPCClosed() override;
-
- protected:
-  ~PepperPlatformAudioOutput() override;
-
- private:
-  friend class base::RefCountedThreadSafe<PepperPlatformAudioOutput>;
-
-  PepperPlatformAudioOutput();
-
-  bool Initialize(int sample_rate,
-                  int frames_per_buffer,
-                  const blink::LocalFrameToken& source_frame_token,
-                  AudioHelper* client);
-
-  // I/O thread backends to above functions.
-  void InitializeOnIOThread(const media::AudioParameters& params);
-  void StartPlaybackOnIOThread();
-  void StopPlaybackOnIOThread();
-  void SetVolumeOnIOThread(double volume);
-  void ShutDownOnIOThread();
-
-  // The client to notify when the stream is created. THIS MUST ONLY BE
-  // ACCESSED ON THE MAIN THREAD.
-  raw_ptr<AudioHelper> client_;
-
-  // Used to send/receive IPC. THIS MUST ONLY BE ACCESSED ON THE
-  // I/O thread except to send messages and get the message loop.
-  std::unique_ptr<media::AudioOutputIPC> ipc_;
-
-  scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-  scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_OUTPUT_H_
diff --git a/content/renderer/pepper/pepper_platform_audio_output_dev.cc b/content/renderer/pepper/pepper_platform_audio_output_dev.cc
deleted file mode 100644
index 4d86de0..0000000
--- a/content/renderer/pepper/pepper_platform_audio_output_dev.cc
+++ /dev/null
@@ -1,411 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_platform_audio_output_dev.h"
-
-#include <memory>
-
-#include "base/functional/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/time/time.h"
-#include "base/timer/timer.h"
-#include "build/build_config.h"
-#include "components/input/input_constants.h"
-#include "content/child/child_process.h"
-#include "content/renderer/pepper/audio_helper.h"
-#include "content/renderer/pepper/pepper_audio_output_host.h"
-#include "content/renderer/pepper/pepper_media_device_manager.h"
-#include "content/renderer/render_frame_impl.h"
-#include "media/audio/audio_device_description.h"
-#include "ppapi/shared_impl/ppb_audio_config_shared.h"
-#include "third_party/blink/public/web/modules/media/audio/audio_output_ipc_factory.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-
-namespace {
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
-constexpr base::TimeDelta kMaxAuthorizationTimeout = base::Seconds(4);
-#else
-constexpr base::TimeDelta kMaxAuthorizationTimeout;  // No timeout.
-#endif
-}
-
-namespace content {
-
-// static
-PepperPlatformAudioOutputDev* PepperPlatformAudioOutputDev::Create(
-    int render_frame_id,
-    const std::string& device_id,
-    int sample_rate,
-    int frames_per_buffer,
-    PepperAudioOutputHost* client) {
-  scoped_refptr<PepperPlatformAudioOutputDev> audio_output(
-      new PepperPlatformAudioOutputDev(
-          render_frame_id, device_id,
-          // Set authorization request timeout at 80% of renderer hung timeout,
-          // but no more than kMaxAuthorizationTimeout.
-          std::min(input::kHungRendererDelay * 8 / 10,
-                   kMaxAuthorizationTimeout)));
-
-  if (audio_output->Initialize(sample_rate, frames_per_buffer, client)) {
-    // Balanced by Release invoked in
-    // PepperPlatformAudioOutputDev::ShutDownOnIOThread().
-    audio_output->AddRef();
-    return audio_output.get();
-  }
-  return nullptr;
-}
-
-void PepperPlatformAudioOutputDev::RequestDeviceAuthorization() {
-  if (ipc_) {
-    io_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(
-            &PepperPlatformAudioOutputDev::RequestDeviceAuthorizationOnIOThread,
-            this));
-  }
-}
-
-bool PepperPlatformAudioOutputDev::StartPlayback() {
-  if (ipc_) {
-    io_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&PepperPlatformAudioOutputDev::StartPlaybackOnIOThread,
-                       this));
-    return true;
-  }
-  return false;
-}
-
-bool PepperPlatformAudioOutputDev::StopPlayback() {
-  if (ipc_) {
-    io_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&PepperPlatformAudioOutputDev::StopPlaybackOnIOThread,
-                       this));
-    return true;
-  }
-  return false;
-}
-
-bool PepperPlatformAudioOutputDev::SetVolume(double volume) {
-  if (ipc_) {
-    io_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&PepperPlatformAudioOutputDev::SetVolumeOnIOThread, this,
-                       volume));
-    return true;
-  }
-  return false;
-}
-
-void PepperPlatformAudioOutputDev::ShutDown() {
-  // Called on the main thread to stop all audio callbacks. We must only change
-  // the client on the main thread, and the delegates from the I/O thread.
-  client_ = nullptr;
-  io_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PepperPlatformAudioOutputDev::ShutDownOnIOThread, this));
-}
-
-void PepperPlatformAudioOutputDev::OnError() {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-
-  // Do nothing if the stream has been closed.
-  if (state_ < CREATING_STREAM)
-    return;
-
-  DLOG(WARNING) << "PepperPlatformAudioOutputDev::OnError()";
-}
-
-void PepperPlatformAudioOutputDev::OnDeviceAuthorized(
-    media::OutputDeviceStatus device_status,
-    const media::AudioParameters& output_params,
-    const std::string& matched_device_id) {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-
-  auth_timeout_action_.reset();
-
-  // Do nothing if late authorization is received after timeout.
-  if (state_ == IPC_CLOSED)
-    return;
-
-  LOG_IF(WARNING, device_status == media::OUTPUT_DEVICE_STATUS_ERROR_TIMED_OUT)
-      << "Output device authorization timed out";
-
-  DCHECK_EQ(state_, AUTHORIZING);
-
-  // It may happen that a second authorization is received as a result to a
-  // call to StartPlayback() after Shutdown(). If the status for the second
-  // authorization differs from the first, it will not be reflected in
-  // |device_status_| to avoid a race.
-  // This scenario is unlikely. If it occurs, the new value will be
-  // different from OUTPUT_DEVICE_STATUS_OK, so the PepperPlatformAudioOutputDev
-  // will enter the IPC_CLOSED state anyway, which is the safe thing to do.
-  // This is preferable to holding a lock.
-  if (!did_receive_auth_.IsSignaled())
-    device_status_ = device_status;
-
-  if (device_status == media::OUTPUT_DEVICE_STATUS_OK) {
-    state_ = AUTHORIZED;
-    if (!did_receive_auth_.IsSignaled()) {
-      output_params_ = output_params;
-
-      // It's possible to not have a matched device obtained via session id. It
-      // means matching output device through |session_id_| failed and the
-      // default device is used.
-      DCHECK(media::AudioDeviceDescription::UseSessionIdToSelectDevice(
-                 session_id_, device_id_) ||
-             matched_device_id_.empty());
-      matched_device_id_ = matched_device_id;
-
-      DVLOG(1) << "PepperPlatformAudioOutputDev authorized, session_id: "
-               << session_id_ << ", device_id: " << device_id_
-               << ", matched_device_id: " << matched_device_id_;
-
-      did_receive_auth_.Signal();
-    }
-    if (start_on_authorized_)
-      CreateStreamOnIOThread(params_);
-  } else {
-    // Closing IPC forces a Signal(), so no clients are locked waiting
-    // indefinitely after this method returns.
-    ipc_->CloseStream();
-    OnIPCClosed();
-    main_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(
-            &PepperPlatformAudioOutputDev::NotifyStreamCreationFailed, this));
-  }
-}
-
-void PepperPlatformAudioOutputDev::OnStreamCreated(
-    base::UnsafeSharedMemoryRegion shared_memory_region,
-    base::SyncSocket::ScopedHandle socket_handle,
-    bool playing_automatically) {
-  DCHECK(shared_memory_region.IsValid());
-#if BUILDFLAG(IS_WIN)
-  DCHECK(socket_handle.IsValid());
-#else
-  DCHECK(socket_handle.is_valid());
-#endif
-  DCHECK_GT(shared_memory_region.GetSize(), 0u);
-
-  if (base::SingleThreadTaskRunner::GetCurrentDefault().get() ==
-      main_task_runner_.get()) {
-    // Must dereference the client only on the main thread. Shutdown may have
-    // occurred while the request was in-flight, so we need to NULL check.
-    if (client_)
-      client_->StreamCreated(std::move(shared_memory_region),
-                             std::move(socket_handle));
-  } else {
-    DCHECK(io_task_runner_->BelongsToCurrentThread());
-    if (state_ != CREATING_STREAM)
-      return;
-
-    state_ = PAUSED;
-    if (play_on_start_)
-      StartPlaybackOnIOThread();
-
-    main_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&PepperPlatformAudioOutputDev::OnStreamCreated, this,
-                       std::move(shared_memory_region),
-                       std::move(socket_handle), playing_automatically));
-  }
-}
-
-void PepperPlatformAudioOutputDev::OnIPCClosed() {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-  state_ = IPC_CLOSED;
-  ipc_.reset();
-
-  // Signal to unblock any blocked threads waiting for parameters
-  did_receive_auth_.Signal();
-}
-
-PepperPlatformAudioOutputDev::~PepperPlatformAudioOutputDev() {
-  // Make sure we have been shut down. Warning: this will usually happen on
-  // the I/O thread!
-  DCHECK(!ipc_);
-  DCHECK(!client_);
-}
-
-PepperPlatformAudioOutputDev::PepperPlatformAudioOutputDev(
-    int render_frame_id,
-    const std::string& device_id,
-    base::TimeDelta authorization_timeout)
-    : client_(nullptr),
-      main_task_runner_(base::SingleThreadTaskRunner::GetCurrentDefault()),
-      io_task_runner_(ChildProcess::current()->io_task_runner()),
-      render_frame_id_(render_frame_id),
-      state_(IDLE),
-      start_on_authorized_(true),
-      play_on_start_(false),
-      device_id_(device_id),
-      did_receive_auth_(base::WaitableEvent::ResetPolicy::MANUAL,
-                        base::WaitableEvent::InitialState::NOT_SIGNALED),
-      device_status_(media::OUTPUT_DEVICE_STATUS_ERROR_INTERNAL),
-      auth_timeout_(authorization_timeout) {}
-
-bool PepperPlatformAudioOutputDev::Initialize(int sample_rate,
-                                              int frames_per_buffer,
-                                              PepperAudioOutputHost* client) {
-  DCHECK(main_task_runner_->BelongsToCurrentThread());
-
-  RenderFrameImpl* const render_frame =
-      RenderFrameImpl::FromRoutingID(render_frame_id_);
-  if (!render_frame || !client)
-    return false;
-
-  client_ = client;
-
-  ipc_ = blink::AudioOutputIPCFactory::GetInstance().CreateAudioOutputIPC(
-      render_frame->GetWebFrame()->GetLocalFrameToken());
-  CHECK(ipc_);
-
-  params_.Reset(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                media::ChannelLayoutConfig::Stereo(), sample_rate,
-                frames_per_buffer);
-
-  io_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PepperPlatformAudioOutputDev::CreateStreamOnIOThread,
-                     this, params_));
-
-  return true;
-}
-
-void PepperPlatformAudioOutputDev::RequestDeviceAuthorizationOnIOThread() {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-  DCHECK_EQ(state_, IDLE);
-
-  if (!ipc_)
-    return;
-
-  state_ = AUTHORIZING;
-  ipc_->RequestDeviceAuthorization(this, session_id_, device_id_);
-
-  if (auth_timeout_.is_positive()) {
-    // Create the timer on the thread it's used on. It's guaranteed to be
-    // deleted on the same thread since users must call ShutDown() before
-    // deleting PepperPlatformAudioOutputDev; see ShutDownOnIOThread().
-    auth_timeout_action_ = std::make_unique<base::OneShotTimer>();
-    auth_timeout_action_->Start(
-        FROM_HERE, auth_timeout_,
-        base::BindOnce(&PepperPlatformAudioOutputDev::OnDeviceAuthorized, this,
-                       media::OUTPUT_DEVICE_STATUS_ERROR_TIMED_OUT,
-                       media::AudioParameters(), std::string()));
-  }
-}
-
-void PepperPlatformAudioOutputDev::CreateStreamOnIOThread(
-    const media::AudioParameters& params) {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-  switch (state_) {
-    case IPC_CLOSED:
-      main_task_runner_->PostTask(
-          FROM_HERE,
-          base::BindOnce(
-              &PepperPlatformAudioOutputDev::NotifyStreamCreationFailed, this));
-      break;
-
-    case IDLE:
-      if (did_receive_auth_.IsSignaled() && device_id_.empty()) {
-        state_ = CREATING_STREAM;
-        ipc_->CreateStream(this, params);
-      } else {
-        RequestDeviceAuthorizationOnIOThread();
-        start_on_authorized_ = true;
-      }
-      break;
-
-    case AUTHORIZING:
-      start_on_authorized_ = true;
-      break;
-
-    case AUTHORIZED:
-      state_ = CREATING_STREAM;
-      ipc_->CreateStream(this, params);
-      start_on_authorized_ = false;
-      break;
-
-    case CREATING_STREAM:
-    case PAUSED:
-    case PLAYING:
-      NOTREACHED();
-  }
-}
-
-void PepperPlatformAudioOutputDev::StartPlaybackOnIOThread() {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-  if (!ipc_)
-    return;
-
-  if (state_ == PAUSED) {
-    ipc_->PlayStream();
-    state_ = PLAYING;
-    play_on_start_ = false;
-  } else {
-    if (state_ < CREATING_STREAM)
-      CreateStreamOnIOThread(params_);
-
-    play_on_start_ = true;
-  }
-}
-
-void PepperPlatformAudioOutputDev::StopPlaybackOnIOThread() {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-  if (!ipc_)
-    return;
-
-  if (state_ == PLAYING) {
-    ipc_->PauseStream();
-    state_ = PAUSED;
-  }
-  play_on_start_ = false;
-}
-
-void PepperPlatformAudioOutputDev::SetVolumeOnIOThread(double volume) {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-  if (!ipc_)
-    return;
-
-  if (state_ >= CREATING_STREAM)
-    ipc_->SetVolume(volume);
-}
-
-void PepperPlatformAudioOutputDev::ShutDownOnIOThread() {
-  DCHECK(io_task_runner_->BelongsToCurrentThread());
-
-  // Make sure we don't call shutdown more than once.
-  if (!ipc_)
-    return;
-
-  // Close the stream, if we haven't already.
-  if (state_ >= AUTHORIZING) {
-    ipc_->CloseStream();
-    ipc_.reset();
-    state_ = IDLE;
-  }
-  start_on_authorized_ = false;
-
-  // Destoy the timer on the thread it's used on.
-  auth_timeout_action_.reset();
-
-  // Release for the delegate, balances out the reference taken in
-  // PepperPlatformAudioOutputDev::Create.
-  Release();
-}
-
-void PepperPlatformAudioOutputDev::NotifyStreamCreationFailed() {
-  DCHECK(main_task_runner_->BelongsToCurrentThread());
-
-  if (client_)
-    client_->StreamCreationFailed();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_platform_audio_output_dev.h b/content/renderer/pepper/pepper_platform_audio_output_dev.h
deleted file mode 100644
index a7b2c3e..0000000
--- a/content/renderer/pepper/pepper_platform_audio_output_dev.h
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright 2017 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_OUTPUT_DEV_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_OUTPUT_DEV_H_
-
-#include <memory>
-#include <string>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/time/time.h"
-#include "base/unguessable_token.h"
-#include "media/audio/audio_output_ipc.h"
-#include "media/base/audio_parameters.h"
-#include "media/base/output_device_info.h"
-
-namespace base {
-class OneShotTimer;
-class SingleThreadTaskRunner;
-}
-
-namespace content {
-class PepperAudioOutputHost;
-
-// This class is used to support new PPAPI |PPB_AudioOutput_Dev|, while
-// |PepperPlatformAudioOutput| is to support old PPAPI |PPB_Audio|.
-class PepperPlatformAudioOutputDev
-    : public media::AudioOutputIPCDelegate,
-      public base::RefCountedThreadSafe<PepperPlatformAudioOutputDev> {
- public:
-  // Factory function, returns NULL on failure. StreamCreated() will be called
-  // when the stream is created.
-  static PepperPlatformAudioOutputDev* Create(int render_frame_id,
-                                              const std::string& device_id,
-                                              int sample_rate,
-                                              int frames_per_buffer,
-                                              PepperAudioOutputHost* client);
-
-  PepperPlatformAudioOutputDev(const PepperPlatformAudioOutputDev&) = delete;
-  PepperPlatformAudioOutputDev& operator=(const PepperPlatformAudioOutputDev&) =
-      delete;
-
-  // The following three methods are all called on main thread.
-
-  // Request authorization to use the device.
-  void RequestDeviceAuthorization();
-
-  // Starts the playback. Returns false on error or if called before the
-  // stream is created or after the stream is closed.
-  bool StartPlayback();
-
-  // Stops the playback. Returns false on error or if called before the stream
-  // is created or after the stream is closed.
-  bool StopPlayback();
-
-  // Sets the volume. Returns false on error or if called before the stream
-  // is created or after the stream is closed.
-  bool SetVolume(double volume);
-
-  // Closes the stream. Make sure to call this before the object is
-  // destructed.
-  void ShutDown();
-
-  // media::AudioOutputIPCDelegate implementation.
-  void OnError() override;
-  void OnDeviceAuthorized(media::OutputDeviceStatus device_status,
-                          const media::AudioParameters& output_params,
-                          const std::string& matched_device_id) override;
-  void OnStreamCreated(base::UnsafeSharedMemoryRegion shared_memory_region,
-                       base::SyncSocket::ScopedHandle socket_handle,
-                       bool playing_automatically) override;
-  void OnIPCClosed() override;
-
- protected:
-  ~PepperPlatformAudioOutputDev() override;
-
- private:
-  enum State {
-    IPC_CLOSED,       // No more IPCs can take place.
-    IDLE,             // Not started.
-    AUTHORIZING,      // Sent device authorization request, waiting for reply.
-    AUTHORIZED,       // Successful device authorization received.
-    CREATING_STREAM,  // Waiting for OnStreamCreated() to be called back.
-    PAUSED,   // Paused.  OnStreamCreated() has been called.  Can Play()/Stop().
-    PLAYING,  // Playing back.  Can Pause()/Stop().
-  };
-
-  friend class base::RefCountedThreadSafe<PepperPlatformAudioOutputDev>;
-
-  PepperPlatformAudioOutputDev();
-  PepperPlatformAudioOutputDev(int render_frame_id,
-                               const std::string& device_id,
-                               base::TimeDelta authorization_timeout);
-
-  // Creates audio stream. Used for new Pepper audio output interface
-  // |PPB_AudioOutput_Dev|.
-  bool Initialize(int sample_rate,
-                  int frames_per_buffer,
-                  PepperAudioOutputHost* client);
-
-  void RequestDeviceAuthorizationOnIOThread();
-  void CreateStreamOnIOThread(const media::AudioParameters& params);
-  void StartPlaybackOnIOThread();
-  void StopPlaybackOnIOThread();
-  void SetVolumeOnIOThread(double volume);
-  void ShutDownOnIOThread();
-
-  void NotifyStreamCreationFailed();
-
-  raw_ptr<PepperAudioOutputHost> client_;
-
-  // Used to send/receive IPC. THIS MUST ONLY BE ACCESSED ON THE
-  // I/O thread except to send messages and get the message loop.
-  std::unique_ptr<media::AudioOutputIPC> ipc_;
-
-  scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-  scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
-
-  // The frame containing the Pepper widget.
-  int render_frame_id_;
-
-  // Initialized on the main thread and accessed on the I/O thread afterwards.
-  media::AudioParameters params_;
-
-  // Current state (must only be accessed from the IO thread).
-  State state_;
-
-  // State of Start() calls before OnDeviceAuthorized() is called.
-  bool start_on_authorized_;
-
-  // State of StartPlayback() calls before OnStreamCreated() is called.
-  bool play_on_start_;
-
-  // The media session ID used to identify which output device to be started.
-  base::UnguessableToken session_id_;
-
-  // ID of hardware output device to be used (provided session_id_ is zero)
-  const std::string device_id_;
-
-  // If |device_id_| is empty and |session_id_| is not, |matched_device_id_| is
-  // received in OnDeviceAuthorized().
-  std::string matched_device_id_;
-
-  base::WaitableEvent did_receive_auth_;
-  media::AudioParameters output_params_;
-  media::OutputDeviceStatus device_status_;
-
-  const base::TimeDelta auth_timeout_;
-  std::unique_ptr<base::OneShotTimer> auth_timeout_action_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_AUDIO_OUTPUT_DEV_H_
diff --git a/content/renderer/pepper/pepper_platform_camera_device.cc b/content/renderer/pepper/pepper_platform_camera_device.cc
deleted file mode 100644
index 70324e8..0000000
--- a/content/renderer/pepper/pepper_platform_camera_device.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2015 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_platform_camera_device.h"
-
-#include <utility>
-
-#include "base/check.h"
-#include "base/functional/bind.h"
-#include "base/task/bind_post_task.h"
-#include "content/public/renderer/ppapi_gfx_conversion.h"
-#include "content/renderer/pepper/pepper_camera_device_host.h"
-#include "content/renderer/pepper/pepper_media_device_manager.h"
-#include "content/renderer/render_frame_impl.h"
-#include "content/renderer/render_thread_impl.h"
-#include "third_party/blink/public/platform/modules/video_capture/web_video_capture_impl_manager.h"
-
-namespace content {
-
-PepperPlatformCameraDevice::PepperPlatformCameraDevice(
-    int render_frame_id,
-    const std::string& device_id,
-    PepperCameraDeviceHost* handler)
-    : render_frame_id_(render_frame_id),
-      device_id_(device_id),
-      handler_(handler),
-      pending_open_device_(false),
-      pending_open_device_id_(-1) {
-  // We need to open the device and obtain the label and session ID before
-  // initializing.
-  PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager();
-  if (device_manager) {
-    pending_open_device_id_ = device_manager->OpenDevice(
-        PP_DEVICETYPE_DEV_VIDEOCAPTURE, device_id, handler->pp_instance(),
-        base::BindOnce(&PepperPlatformCameraDevice::OnDeviceOpened,
-                       weak_factory_.GetWeakPtr()));
-    pending_open_device_ = true;
-  }
-}
-
-void PepperPlatformCameraDevice::GetSupportedVideoCaptureFormats() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  blink::WebVideoCaptureImplManager* manager =
-      RenderThreadImpl::current()->video_capture_impl_manager();
-  manager->GetDeviceSupportedFormats(
-      session_id_,
-      base::BindPostTaskToCurrentDefault(base::BindOnce(
-          &PepperPlatformCameraDevice::OnDeviceSupportedFormatsEnumerated,
-          weak_factory_.GetWeakPtr())));
-}
-
-void PepperPlatformCameraDevice::DetachEventHandler() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  handler_ = nullptr;
-  if (release_device_cb_) {
-    std::move(release_device_cb_).Run();
-  }
-  if (!label_.empty()) {
-    PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager();
-    if (device_manager)
-      device_manager->CloseDevice(label_);
-    label_.clear();
-  }
-  if (pending_open_device_) {
-    PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager();
-    if (device_manager)
-      device_manager->CancelOpenDevice(pending_open_device_id_);
-    pending_open_device_ = false;
-    pending_open_device_id_ = -1;
-  }
-}
-
-PepperPlatformCameraDevice::~PepperPlatformCameraDevice() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(!release_device_cb_);
-  DCHECK(label_.empty());
-  DCHECK(!pending_open_device_);
-}
-
-void PepperPlatformCameraDevice::OnDeviceOpened(int request_id,
-                                                bool succeeded,
-                                                const std::string& label) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(handler_);
-
-  pending_open_device_ = false;
-  pending_open_device_id_ = -1;
-
-  PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager();
-  succeeded = succeeded && device_manager;
-  if (succeeded) {
-    label_ = label;
-    session_id_ =
-        device_manager->GetSessionID(PP_DEVICETYPE_DEV_VIDEOCAPTURE, label);
-    blink::WebVideoCaptureImplManager* manager =
-        RenderThreadImpl::current()->video_capture_impl_manager();
-    RenderFrameImpl* render_frame =
-        RenderFrameImpl::FromRoutingID(render_frame_id_);
-    release_device_cb_ = manager->UseDevice(
-        session_id_, render_frame->GetBrowserInterfaceBroker());
-  }
-
-  handler_->OnInitialized(succeeded);
-}
-
-void PepperPlatformCameraDevice::OnDeviceSupportedFormatsEnumerated(
-    const media::VideoCaptureFormats& formats) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  DCHECK(handler_);
-
-  std::vector<PP_VideoCaptureFormat> output_formats;
-  for (const auto& format : formats) {
-    PP_VideoCaptureFormat output_format;
-    output_format.frame_size = PP_FromGfxSize(format.frame_size);
-    output_format.frame_rate = format.frame_rate;
-    output_formats.push_back(output_format);
-  }
-  handler_->OnVideoCaptureFormatsEnumerated(output_formats);
-}
-
-PepperMediaDeviceManager* PepperPlatformCameraDevice::GetMediaDeviceManager() {
-  RenderFrameImpl* const render_frame =
-      RenderFrameImpl::FromRoutingID(render_frame_id_);
-  return render_frame
-             ? PepperMediaDeviceManager::GetForRenderFrame(render_frame).get()
-             : nullptr;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_platform_camera_device.h b/content/renderer/pepper/pepper_platform_camera_device.h
deleted file mode 100644
index 27f29b6..0000000
--- a/content/renderer/pepper/pepper_platform_camera_device.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2015 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_CAMERA_DEVICE_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_CAMERA_DEVICE_H_
-
-#include <memory>
-#include <string>
-
-#include "base/functional/callback.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/threading/thread_checker.h"
-#include "base/unguessable_token.h"
-#include "media/capture/video_capture_types.h"
-#include "third_party/blink/public/platform/media/video_capture.h"
-
-namespace content {
-class PepperMediaDeviceManager;
-class PepperCameraDeviceHost;
-
-// This object must only be used on the thread it's constructed on.
-class PepperPlatformCameraDevice {
- public:
-  PepperPlatformCameraDevice(int render_frame_id,
-                             const std::string& device_id,
-                             PepperCameraDeviceHost* handler);
-
-  PepperPlatformCameraDevice(const PepperPlatformCameraDevice&) = delete;
-  PepperPlatformCameraDevice& operator=(const PepperPlatformCameraDevice&) =
-      delete;
-
-  ~PepperPlatformCameraDevice();
-
-  // Detaches the event handler and stops sending notifications to it.
-  void DetachEventHandler();
-
-  void GetSupportedVideoCaptureFormats();
-
- private:
-  void OnDeviceOpened(int request_id, bool succeeded, const std::string& label);
-
-  // Called by blink::WebVideoCaptureImplManager.
-  void OnDeviceSupportedFormatsEnumerated(
-      const media::VideoCaptureFormats& formats);
-
-  // Can return NULL if the RenderFrame referenced by |render_frame_id_| has
-  // gone away.
-  PepperMediaDeviceManager* GetMediaDeviceManager();
-
-  const int render_frame_id_;
-  const std::string device_id_;
-
-  std::string label_;
-  base::UnguessableToken session_id_;
-  base::OnceClosure release_device_cb_;
-
-  raw_ptr<PepperCameraDeviceHost> handler_;
-
-  // Whether we have a pending request to open a device. We have to make sure
-  // there isn't any pending request before this object goes away.
-  bool pending_open_device_;
-  int pending_open_device_id_;
-
-  base::ThreadChecker thread_checker_;
-
-  base::WeakPtrFactory<PepperPlatformCameraDevice> weak_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_CAMERA_DEVICE_H_
diff --git a/content/renderer/pepper/pepper_platform_video_capture.cc b/content/renderer/pepper/pepper_platform_video_capture.cc
deleted file mode 100644
index 0df9ae1..0000000
--- a/content/renderer/pepper/pepper_platform_video_capture.cc
+++ /dev/null
@@ -1,169 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_platform_video_capture.h"
-
-#include "base/check.h"
-#include "base/functional/bind.h"
-#include "base/memory/ref_counted.h"
-#include "base/notreached.h"
-#include "base/task/bind_post_task.h"
-#include "content/renderer/pepper/pepper_media_device_manager.h"
-#include "content/renderer/pepper/pepper_video_capture_host.h"
-#include "content/renderer/render_frame_impl.h"
-#include "content/renderer/render_thread_impl.h"
-#include "media/base/video_frame.h"
-#include "third_party/blink/public/platform/modules/video_capture/web_video_capture_impl_manager.h"
-#include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h"
-
-namespace content {
-
-PepperPlatformVideoCapture::PepperPlatformVideoCapture(
-    int render_frame_id,
-    const std::string& device_id,
-    PepperVideoCaptureHost* handler)
-    : render_frame_id_(render_frame_id),
-      device_id_(device_id),
-      handler_(handler),
-      pending_open_device_(false),
-      pending_open_device_id_(-1) {
-  // We need to open the device and obtain the label and session ID before
-  // initializing.
-  PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager();
-  if (device_manager) {
-    pending_open_device_id_ = device_manager->OpenDevice(
-        PP_DEVICETYPE_DEV_VIDEOCAPTURE, device_id, handler->pp_instance(),
-        base::BindOnce(&PepperPlatformVideoCapture::OnDeviceOpened,
-                       weak_factory_.GetWeakPtr()));
-    pending_open_device_ = true;
-  }
-}
-
-void PepperPlatformVideoCapture::StartCapture(
-    const media::VideoCaptureParams& params) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  if (stop_capture_cb_)
-    return;
-  blink::WebVideoCaptureImplManager* manager =
-      RenderThreadImpl::current()->video_capture_impl_manager();
-
-  blink::VideoCaptureCallbacks video_capture_callbacks;
-  video_capture_callbacks.state_update_cb = base::BindPostTaskToCurrentDefault(
-      base::BindRepeating(&PepperPlatformVideoCapture::OnStateUpdate,
-                          weak_factory_.GetWeakPtr()));
-  video_capture_callbacks.deliver_frame_cb = base::BindPostTaskToCurrentDefault(
-      base::BindRepeating(&PepperPlatformVideoCapture::OnFrameReady,
-                          weak_factory_.GetWeakPtr()));
-  // TODO(crbug.com/409110236): Ensures what's is the expected callback
-  // functions from WebVideoCaptureImplManager::StartCapture().
-  video_capture_callbacks.frame_dropped_cb = base::DoNothing();
-  video_capture_callbacks.sub_capture_target_version_cb = base::DoNothing();
-  stop_capture_cb_ = manager->StartCapture(session_id_, params,
-                                           std::move(video_capture_callbacks));
-}
-
-void PepperPlatformVideoCapture::StopCapture() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  if (!stop_capture_cb_)
-    return;
-  std::move(stop_capture_cb_).Run();
-}
-
-void PepperPlatformVideoCapture::DetachEventHandler() {
-  handler_ = nullptr;
-  StopCapture();
-  if (release_device_cb_) {
-    std::move(release_device_cb_).Run();
-  }
-  if (!label_.empty()) {
-    PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager();
-    if (device_manager)
-      device_manager->CloseDevice(label_);
-    label_.clear();
-  }
-  if (pending_open_device_) {
-    PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager();
-    if (device_manager)
-      device_manager->CancelOpenDevice(pending_open_device_id_);
-    pending_open_device_ = false;
-    pending_open_device_id_ = -1;
-  }
-}
-
-PepperPlatformVideoCapture::~PepperPlatformVideoCapture() {
-  DCHECK(!stop_capture_cb_);
-  DCHECK(!release_device_cb_);
-  DCHECK(label_.empty());
-  DCHECK(!pending_open_device_);
-}
-
-void PepperPlatformVideoCapture::OnDeviceOpened(int request_id,
-                                                bool succeeded,
-                                                const std::string& label) {
-  RenderFrameImpl* render_frame =
-      RenderFrameImpl::FromRoutingID(render_frame_id_);
-  if (!render_frame) {
-    if (handler_)
-      handler_->OnInitialized(false);
-    return;
-  }
-
-  pending_open_device_ = false;
-  pending_open_device_id_ = -1;
-
-  PepperMediaDeviceManager* const device_manager = GetMediaDeviceManager();
-  succeeded = succeeded && device_manager;
-  if (succeeded) {
-    label_ = label;
-    session_id_ = device_manager->GetSessionID(
-        PP_DEVICETYPE_DEV_VIDEOCAPTURE, label);
-    blink::WebVideoCaptureImplManager* manager =
-        RenderThreadImpl::current()->video_capture_impl_manager();
-    release_device_cb_ = manager->UseDevice(
-        session_id_, render_frame->GetBrowserInterfaceBroker());
-  }
-
-  if (handler_)
-    handler_->OnInitialized(succeeded);
-}
-
-void PepperPlatformVideoCapture::OnStateUpdate(blink::VideoCaptureState state) {
-  if (!handler_)
-    return;
-  switch (state) {
-    case blink::VIDEO_CAPTURE_STATE_STARTED:
-      handler_->OnStarted();
-      break;
-    case blink::VIDEO_CAPTURE_STATE_STOPPED:
-      handler_->OnStopped();
-      break;
-    case blink::VIDEO_CAPTURE_STATE_PAUSED:
-      handler_->OnPaused();
-      break;
-    case blink::VIDEO_CAPTURE_STATE_ERROR:
-      handler_->OnError();
-      break;
-    default:
-      NOTREACHED() << "Unexpected state: " << state << ".";
-  }
-}
-
-void PepperPlatformVideoCapture::OnFrameReady(
-    scoped_refptr<media::VideoFrame> video_frame,
-    base::TimeTicks estimated_capture_time) {
-  if (handler_ && stop_capture_cb_) {
-    // The scaled video frames are ignored by Pepper.
-    handler_->OnFrameReady(std::move(video_frame));
-  }
-}
-
-PepperMediaDeviceManager* PepperPlatformVideoCapture::GetMediaDeviceManager() {
-  RenderFrameImpl* const render_frame =
-      RenderFrameImpl::FromRoutingID(render_frame_id_);
-  return render_frame
-             ? PepperMediaDeviceManager::GetForRenderFrame(render_frame).get()
-             : nullptr;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_platform_video_capture.h b/content/renderer/pepper/pepper_platform_video_capture.h
deleted file mode 100644
index 5814736..0000000
--- a/content/renderer/pepper/pepper_platform_video_capture.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_VIDEO_CAPTURE_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_VIDEO_CAPTURE_H_
-
-#include <memory>
-#include <string>
-
-#include "base/functional/callback.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/threading/thread_checker.h"
-#include "base/time/time.h"
-#include "media/capture/video_capture_types.h"
-#include "third_party/blink/public/platform/media/video_capture.h"
-
-namespace media {
-class VideoFrame;
-}  // namespace media
-
-namespace content {
-class PepperMediaDeviceManager;
-class PepperVideoCaptureHost;
-
-// This object must only be used on the thread it's constructed on.
-class PepperPlatformVideoCapture {
- public:
-  PepperPlatformVideoCapture(int render_frame_id,
-                             const std::string& device_id,
-                             PepperVideoCaptureHost* handler);
-
-  PepperPlatformVideoCapture(const PepperPlatformVideoCapture&) = delete;
-  PepperPlatformVideoCapture& operator=(const PepperPlatformVideoCapture&) =
-      delete;
-
-  virtual ~PepperPlatformVideoCapture();
-
-  // Detaches the event handler and stops sending notifications to it.
-  void DetachEventHandler();
-
-  void StartCapture(const media::VideoCaptureParams& params);
-  void StopCapture();
-
- private:
-  void OnDeviceOpened(int request_id, bool succeeded, const std::string& label);
-  void OnStateUpdate(blink::VideoCaptureState state);
-  void OnFrameReady(scoped_refptr<media::VideoFrame> video_frame,
-                    base::TimeTicks estimated_capture_time);
-
-  // Can return NULL if the RenderFrame referenced by |render_frame_id_| has
-  // gone away.
-  PepperMediaDeviceManager* GetMediaDeviceManager();
-
-  const int render_frame_id_;
-  const std::string device_id_;
-
-  std::string label_;
-  base::UnguessableToken session_id_;
-  base::OnceClosure release_device_cb_;
-  base::OnceClosure stop_capture_cb_;
-
-  raw_ptr<PepperVideoCaptureHost> handler_;
-
-  // Whether we have a pending request to open a device. We have to make sure
-  // there isn't any pending request before this object goes away.
-  bool pending_open_device_;
-  int pending_open_device_id_;
-
-  base::ThreadChecker thread_checker_;
-
-  base::WeakPtrFactory<PepperPlatformVideoCapture> weak_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_PLATFORM_VIDEO_CAPTURE_H_
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
deleted file mode 100644
index 59fb9fbd..0000000
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ /dev/null
@@ -1,2804 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "base/containers/contains.h"
-#include "base/functional/bind.h"
-#include "base/functional/callback_helpers.h"
-#include "base/i18n/char_iterator.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/notimplemented.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_offset_string_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/time/time.h"
-#include "base/trace_event/trace_event.h"
-#include "build/build_config.h"
-#include "cc/layers/texture_layer.h"
-#include "content/common/content_constants_internal.h"
-#include "content/public/common/content_constants.h"
-#include "content/public/renderer/content_renderer_client.h"
-#include "content/public/renderer/ppapi_gfx_conversion.h"
-#include "content/renderer/pepper/event_conversion.h"
-#include "content/renderer/pepper/host_dispatcher_wrapper.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/message_channel.h"
-#include "content/renderer/pepper/pepper_audio_controller.h"
-#include "content/renderer/pepper/pepper_browser_connection.h"
-#include "content/renderer/pepper/pepper_file_ref_renderer_host.h"
-#include "content/renderer/pepper/pepper_graphics_2d_host.h"
-#include "content/renderer/pepper/pepper_in_process_router.h"
-#include "content/renderer/pepper/pepper_try_catch.h"
-#include "content/renderer/pepper/pepper_url_loader_host.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "content/renderer/pepper/plugin_object.h"
-#include "content/renderer/pepper/ppapi_preferences_builder.h"
-#include "content/renderer/pepper/ppb_buffer_impl.h"
-#include "content/renderer/pepper/ppb_graphics_3d_impl.h"
-#include "content/renderer/pepper/ppb_image_data_impl.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "content/renderer/pepper/url_request_info_util.h"
-#include "content/renderer/pepper/url_response_info_util.h"
-#include "content/renderer/render_frame_impl.h"
-#include "content/renderer/sad_plugin.h"
-#include "device/gamepad/public/cpp/gamepads.h"
-#include "ppapi/c/dev/ppp_text_input_dev.h"
-#include "ppapi/c/pp_rect.h"
-#include "ppapi/c/ppb_audio_config.h"
-#include "ppapi/c/ppb_core.h"
-#include "ppapi/c/ppb_gamepad.h"
-#include "ppapi/c/ppp_input_event.h"
-#include "ppapi/c/ppp_instance.h"
-#include "ppapi/c/ppp_messaging.h"
-#include "ppapi/c/ppp_mouse_lock.h"
-#include "ppapi/c/private/ppp_instance_private.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/proxy/serialized_var.h"
-#include "ppapi/proxy/uma_private_resource.h"
-#include "ppapi/proxy/url_loader_resource.h"
-#include "ppapi/shared_impl/ppapi_permissions.h"
-#include "ppapi/shared_impl/ppb_gamepad_shared.h"
-#include "ppapi/shared_impl/ppb_input_event_shared.h"
-#include "ppapi/shared_impl/ppb_url_util_shared.h"
-#include "ppapi/shared_impl/ppb_view_shared.h"
-#include "ppapi/shared_impl/ppp_instance_combined.h"
-#include "ppapi/shared_impl/resource.h"
-#include "ppapi/shared_impl/scoped_pp_resource.h"
-#include "ppapi/shared_impl/scoped_pp_var.h"
-#include "ppapi/shared_impl/time_conversion.h"
-#include "ppapi/shared_impl/url_request_info_data.h"
-#include "ppapi/shared_impl/var.h"
-#include "ppapi/thunk/enter.h"
-#include "ppapi/thunk/ppb_buffer_api.h"
-#include "printing/buildflags/buildflags.h"
-#include "printing/mojom/print.mojom.h"
-#include "skia/ext/platform_canvas.h"
-#include "third_party/blink/public/common/input/web_coalesced_input_event.h"
-#include "third_party/blink/public/common/input/web_input_event.h"
-#include "third_party/blink/public/common/input/web_keyboard_event.h"
-#include "third_party/blink/public/common/input/web_mouse_event.h"
-#include "third_party/blink/public/common/input/web_pointer_event.h"
-#include "third_party/blink/public/common/input/web_touch_event.h"
-#include "third_party/blink/public/platform/url_conversion.h"
-#include "third_party/blink/public/platform/web_security_origin.h"
-#include "third_party/blink/public/platform/web_string.h"
-#include "third_party/blink/public/platform/web_url.h"
-#include "third_party/blink/public/platform/web_url_error.h"
-#include "third_party/blink/public/platform/web_url_request.h"
-#include "third_party/blink/public/web/modules/media/audio/audio_device_factory.h"
-#include "third_party/blink/public/web/web_document.h"
-#include "third_party/blink/public/web/web_document_loader.h"
-#include "third_party/blink/public/web/web_frame_widget.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-#include "third_party/blink/public/web/web_plugin_container.h"
-#include "third_party/blink/public/web/web_plugin_script_forbidden_scope.h"
-#include "third_party/blink/public/web/web_print_params.h"
-#include "third_party/blink/public/web/web_script_source.h"
-#include "third_party/blink/public/web/web_view.h"
-#include "third_party/khronos/GLES2/gl2.h"
-#include "ui/events/base_event_utils.h"
-#include "ui/events/blink/blink_event_util.h"
-#include "ui/events/keycodes/dom/dom_code.h"
-#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/geometry/point_conversions.h"
-#include "ui/gfx/geometry/point_f.h"
-#include "ui/gfx/geometry/rect_conversions.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/geometry/size_conversions.h"
-#include "ui/gfx/image/image_skia.h"
-#include "ui/gfx/image/image_skia_rep.h"
-#include "ui/gfx/range/range.h"
-#include "url/origin.h"
-#include "v8/include/v8-context.h"
-#include "v8/include/v8-object.h"
-
-#if BUILDFLAG(ENABLE_PRINTING)
-// nogncheck because dependency on //printing is conditional upon
-// enable_printing flags.
-#include "printing/metafile_skia.h"          // nogncheck
-#endif
-
-#if BUILDFLAG(IS_CHROMEOS)
-#include "ui/events/keycodes/keyboard_codes_posix.h"
-#endif
-
-// Windows defines 'PostMessage', so we have to undef it.
-#ifdef PostMessage
-#undef PostMessage
-#endif
-
-using base::StringPrintf;
-using ppapi::InputEventData;
-using ppapi::PpapiGlobals;
-using ppapi::PPB_InputEvent_Shared;
-using ppapi::PPB_View_Shared;
-using ppapi::PPP_Instance_Combined;
-using ppapi::Resource;
-using ppapi::ScopedPPResource;
-using ppapi::ScopedPPVar;
-using ppapi::StringVar;
-using ppapi::TrackedCallback;
-using ppapi::thunk::EnterResourceNoLock;
-using ppapi::thunk::PPB_Buffer_API;
-using ppapi::thunk::PPB_Gamepad_API;
-using ppapi::thunk::PPB_Graphics2D_API;
-using ppapi::thunk::PPB_Graphics3D_API;
-using ppapi::thunk::PPB_ImageData_API;
-using ppapi::Var;
-using ppapi::ArrayBufferVar;
-using ppapi::ViewData;
-using blink::WebDocument;
-using blink::WebElement;
-using blink::WebFrame;
-using blink::WebInputEvent;
-using blink::WebLocalFrame;
-using blink::WebPlugin;
-using blink::WebPluginContainer;
-using blink::WebPrintParams;
-using blink::WebString;
-using blink::WebURLError;
-using blink::WebAssociatedURLLoaderClient;
-using blink::WebURLRequest;
-using blink::WebURLResponse;
-using blink::WebView;
-using blink::WebWidget;
-
-namespace content {
-
-namespace {
-
-#ifndef STATIC_ASSERT_ENUM
-#define STATIC_ASSERT_ENUM(a, b)                            \
-  static_assert(static_cast<int>(a) == static_cast<int>(b), \
-                "mismatching enums: " #a)
-#endif
-
-// Check PP_TextInput_Type and ui::TextInputType are kept in sync.
-STATIC_ASSERT_ENUM(ui::TEXT_INPUT_TYPE_NONE, PP_TEXTINPUT_TYPE_NONE);
-STATIC_ASSERT_ENUM(ui::TEXT_INPUT_TYPE_TEXT, PP_TEXTINPUT_TYPE_TEXT);
-STATIC_ASSERT_ENUM(ui::TEXT_INPUT_TYPE_PASSWORD, PP_TEXTINPUT_TYPE_PASSWORD);
-STATIC_ASSERT_ENUM(ui::TEXT_INPUT_TYPE_SEARCH, PP_TEXTINPUT_TYPE_SEARCH);
-STATIC_ASSERT_ENUM(ui::TEXT_INPUT_TYPE_EMAIL, PP_TEXTINPUT_TYPE_EMAIL);
-STATIC_ASSERT_ENUM(ui::TEXT_INPUT_TYPE_NUMBER, PP_TEXTINPUT_TYPE_NUMBER);
-STATIC_ASSERT_ENUM(ui::TEXT_INPUT_TYPE_TELEPHONE, PP_TEXTINPUT_TYPE_TELEPHONE);
-STATIC_ASSERT_ENUM(ui::TEXT_INPUT_TYPE_URL, PP_TEXTINPUT_TYPE_URL);
-
-// The default text input type is to regard the plugin always accept text input.
-// This is for allowing users to use input methods even on completely-IME-
-// unaware plugins (e.g., PDF plugin for M16).
-// Plugins need to explicitly opt out the text input mode if they know
-// that they don't accept texts.
-const ui::TextInputType kPluginDefaultTextInputType = ui::TEXT_INPUT_TYPE_TEXT;
-
-// <embed>/<object> attributes.
-const char kWidth[] = "width";
-const char kHeight[] = "height";
-const char kBorder[] = "border";  // According to w3c, deprecated.
-const char kStyle[] = "style";
-
-#define STATIC_ASSERT_MATCHING_ENUM(webkit_name, np_name)               \
-  static_assert(static_cast<int>(ui::mojom::CursorType::webkit_name) == \
-                    static_cast<int>(np_name),                          \
-                "mismatching enums: " #webkit_name)
-
-STATIC_ASSERT_MATCHING_ENUM(kPointer, PP_MOUSECURSOR_TYPE_POINTER);
-STATIC_ASSERT_MATCHING_ENUM(kCross, PP_MOUSECURSOR_TYPE_CROSS);
-STATIC_ASSERT_MATCHING_ENUM(kHand, PP_MOUSECURSOR_TYPE_HAND);
-STATIC_ASSERT_MATCHING_ENUM(kIBeam, PP_MOUSECURSOR_TYPE_IBEAM);
-STATIC_ASSERT_MATCHING_ENUM(kWait, PP_MOUSECURSOR_TYPE_WAIT);
-STATIC_ASSERT_MATCHING_ENUM(kHelp, PP_MOUSECURSOR_TYPE_HELP);
-STATIC_ASSERT_MATCHING_ENUM(kEastResize, PP_MOUSECURSOR_TYPE_EASTRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kNorthResize, PP_MOUSECURSOR_TYPE_NORTHRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kNorthEastResize,
-                            PP_MOUSECURSOR_TYPE_NORTHEASTRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kNorthWestResize,
-                            PP_MOUSECURSOR_TYPE_NORTHWESTRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kSouthResize, PP_MOUSECURSOR_TYPE_SOUTHRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kSouthEastResize,
-                            PP_MOUSECURSOR_TYPE_SOUTHEASTRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kSouthWestResize,
-                            PP_MOUSECURSOR_TYPE_SOUTHWESTRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kWestResize, PP_MOUSECURSOR_TYPE_WESTRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kNorthSouthResize,
-                            PP_MOUSECURSOR_TYPE_NORTHSOUTHRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kEastWestResize,
-                            PP_MOUSECURSOR_TYPE_EASTWESTRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kNorthEastSouthWestResize,
-                            PP_MOUSECURSOR_TYPE_NORTHEASTSOUTHWESTRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kNorthWestSouthEastResize,
-                            PP_MOUSECURSOR_TYPE_NORTHWESTSOUTHEASTRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kColumnResize, PP_MOUSECURSOR_TYPE_COLUMNRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kRowResize, PP_MOUSECURSOR_TYPE_ROWRESIZE);
-STATIC_ASSERT_MATCHING_ENUM(kMiddlePanning, PP_MOUSECURSOR_TYPE_MIDDLEPANNING);
-STATIC_ASSERT_MATCHING_ENUM(kEastPanning, PP_MOUSECURSOR_TYPE_EASTPANNING);
-STATIC_ASSERT_MATCHING_ENUM(kNorthPanning, PP_MOUSECURSOR_TYPE_NORTHPANNING);
-STATIC_ASSERT_MATCHING_ENUM(kNorthEastPanning,
-                            PP_MOUSECURSOR_TYPE_NORTHEASTPANNING);
-STATIC_ASSERT_MATCHING_ENUM(kNorthWestPanning,
-                            PP_MOUSECURSOR_TYPE_NORTHWESTPANNING);
-STATIC_ASSERT_MATCHING_ENUM(kSouthPanning, PP_MOUSECURSOR_TYPE_SOUTHPANNING);
-STATIC_ASSERT_MATCHING_ENUM(kSouthEastPanning,
-                            PP_MOUSECURSOR_TYPE_SOUTHEASTPANNING);
-STATIC_ASSERT_MATCHING_ENUM(kSouthWestPanning,
-                            PP_MOUSECURSOR_TYPE_SOUTHWESTPANNING);
-STATIC_ASSERT_MATCHING_ENUM(kWestPanning, PP_MOUSECURSOR_TYPE_WESTPANNING);
-STATIC_ASSERT_MATCHING_ENUM(kMove, PP_MOUSECURSOR_TYPE_MOVE);
-STATIC_ASSERT_MATCHING_ENUM(kVerticalText, PP_MOUSECURSOR_TYPE_VERTICALTEXT);
-STATIC_ASSERT_MATCHING_ENUM(kCell, PP_MOUSECURSOR_TYPE_CELL);
-STATIC_ASSERT_MATCHING_ENUM(kContextMenu, PP_MOUSECURSOR_TYPE_CONTEXTMENU);
-STATIC_ASSERT_MATCHING_ENUM(kAlias, PP_MOUSECURSOR_TYPE_ALIAS);
-STATIC_ASSERT_MATCHING_ENUM(kProgress, PP_MOUSECURSOR_TYPE_PROGRESS);
-STATIC_ASSERT_MATCHING_ENUM(kNoDrop, PP_MOUSECURSOR_TYPE_NODROP);
-STATIC_ASSERT_MATCHING_ENUM(kCopy, PP_MOUSECURSOR_TYPE_COPY);
-STATIC_ASSERT_MATCHING_ENUM(kNone, PP_MOUSECURSOR_TYPE_NONE);
-STATIC_ASSERT_MATCHING_ENUM(kNotAllowed, PP_MOUSECURSOR_TYPE_NOTALLOWED);
-STATIC_ASSERT_MATCHING_ENUM(kZoomIn, PP_MOUSECURSOR_TYPE_ZOOMIN);
-STATIC_ASSERT_MATCHING_ENUM(kZoomOut, PP_MOUSECURSOR_TYPE_ZOOMOUT);
-STATIC_ASSERT_MATCHING_ENUM(kGrab, PP_MOUSECURSOR_TYPE_GRAB);
-STATIC_ASSERT_MATCHING_ENUM(kGrabbing, PP_MOUSECURSOR_TYPE_GRABBING);
-STATIC_ASSERT_MATCHING_ENUM(kMiddlePanningVertical,
-                            PP_MOUSECURSOR_TYPE_MIDDLEPANNINGVERTICAL);
-STATIC_ASSERT_MATCHING_ENUM(kMiddlePanningHorizontal,
-                            PP_MOUSECURSOR_TYPE_MIDDLEPANNINGHORIZONTAL);
-// Do not assert kCustom == PP_CURSORTYPE_CUSTOM;
-// PP_CURSORTYPE_CUSTOM is pinned to allow new cursor types.
-
-#undef STATIC_ASSERT_MATCHING_ENUM
-
-STATIC_ASSERT_ENUM(printing::mojom::PrintScalingOption::kNone,
-                   PP_PRINTSCALINGOPTION_NONE);
-STATIC_ASSERT_ENUM(printing::mojom::PrintScalingOption::kFitToPrintableArea,
-                   PP_PRINTSCALINGOPTION_FIT_TO_PRINTABLE_AREA);
-STATIC_ASSERT_ENUM(printing::mojom::PrintScalingOption::kSourceSize,
-                   PP_PRINTSCALINGOPTION_SOURCE_SIZE);
-STATIC_ASSERT_ENUM(printing::mojom::PrintScalingOption::kFitToPaper,
-                   PP_PRINTSCALINGOPTION_FIT_TO_PAPER);
-
-#undef STATIC_ASSERT_ENUM
-
-// Sets |*security_origin| to be the WebKit security origin associated with the
-// document containing the given plugin instance. On success, returns true. If
-// the instance is invalid, returns false and |*security_origin| will be
-// unchanged.
-bool SecurityOriginForInstance(PP_Instance instance_id,
-                               blink::WebSecurityOrigin* security_origin) {
-  PepperPluginInstanceImpl* instance =
-      HostGlobals::Get()->GetInstance(instance_id);
-  if (!instance)
-    return false;
-
-  *security_origin = instance->container()->GetDocument().GetSecurityOrigin();
-  return true;
-}
-
-// Convert the given vector to an array of C-strings. The strings in the
-// returned vector are only guaranteed valid so long as the vector of strings
-// is not modified.
-std::unique_ptr<const char* []> StringVectorToArgArray(
-    const std::vector<std::string>& vector) {
-  auto array = std::make_unique<const char* []>(vector.size());
-  for (size_t i = 0; i < vector.size(); ++i)
-    array[i] = vector[i].c_str();
-  return array;
-}
-
-// Returns true if this is a "system reserved" key which should not be sent to
-// a plugin. Some poorly behaving plugins incorrectly report that they handle
-// all keys sent to them. This can prevent keystrokes from working for things
-// like screen brightness and volume control.
-bool IsReservedSystemInputEvent(const blink::WebInputEvent& event) {
-#if BUILDFLAG(IS_CHROMEOS)
-  if (event.GetType() != WebInputEvent::Type::kKeyDown &&
-      event.GetType() != WebInputEvent::Type::kKeyUp)
-    return false;
-  const blink::WebKeyboardEvent& key_event =
-      static_cast<const blink::WebKeyboardEvent&>(event);
-  switch (key_event.windows_key_code) {
-    case ui::VKEY_BRIGHTNESS_DOWN:
-    case ui::VKEY_BRIGHTNESS_UP:
-    case ui::VKEY_KBD_BRIGHTNESS_DOWN:
-    case ui::VKEY_KBD_BRIGHTNESS_UP:
-    case ui::VKEY_VOLUME_MUTE:
-    case ui::VKEY_VOLUME_DOWN:
-    case ui::VKEY_VOLUME_UP:
-      return true;
-    default:
-      return false;
-  }
-#else
-  return false;
-#endif  // BUILDFLAG(IS_CHROMEOS)
-}
-
-void PrintPDFOutput(PP_Resource print_output,
-                    printing::MetafileSkia* metafile) {
-#if BUILDFLAG(ENABLE_PRINTING)
-  DCHECK(metafile);
-
-  ppapi::thunk::EnterResourceNoLock<PPB_Buffer_API> enter(print_output, true);
-  if (enter.failed())
-    return;
-
-  BufferAutoMapper mapper(enter.object());
-  if (!mapper.data() || !mapper.size()) {
-    NOTREACHED();
-  }
-
-  metafile->InitFromData(mapper);
-#endif  // BUILDFLAG(ENABLE_PRINTING)
-}
-
-// Stolen from //printing/units.{cc,h}
-
-// Length of an inch in CSS's 1pt unit.
-// http://dev.w3.org/csswg/css3-values/#absolute-length-units-cm-mm.-in-pt-pc
-constexpr int kPointsPerInch = 72;
-
-// Length of an inch in CSS's 1px unit.
-// http://dev.w3.org/csswg/css3-values/#the-px-unit
-constexpr int kPixelsPerInch = 96;
-
-float ConvertUnitFloat(float value, float old_unit, float new_unit) {
-  CHECK_GT(new_unit, 0);
-  CHECK_GT(old_unit, 0);
-  return value * new_unit / old_unit;
-}
-
-PP_Rect CSSPixelsToPoints(const gfx::RectF& rect) {
-  const gfx::Rect points_rect = gfx::ToEnclosedRect(gfx::RectF(
-      ConvertUnitFloat(rect.x(), kPixelsPerInch, kPointsPerInch),
-      ConvertUnitFloat(rect.y(), kPixelsPerInch, kPointsPerInch),
-      ConvertUnitFloat(rect.width(), kPixelsPerInch, kPointsPerInch),
-      ConvertUnitFloat(rect.height(), kPixelsPerInch, kPointsPerInch)));
-  return PP_MakeRectFromXYWH(points_rect.x(), points_rect.y(),
-                             points_rect.width(), points_rect.height());
-}
-
-PP_Size CSSPixelsToPoints(const gfx::SizeF& size) {
-  const gfx::Size points_size = gfx::ToFlooredSize(gfx::SizeF(
-      ConvertUnitFloat(size.width(), kPixelsPerInch, kPointsPerInch),
-      ConvertUnitFloat(size.height(), kPixelsPerInch, kPointsPerInch)));
-  return PP_MakeSize(points_size.width(), points_size.height());
-}
-
-}  // namespace
-
-// static
-PepperPluginInstanceImpl* PepperPluginInstanceImpl::Create(
-    RenderFrameImpl* render_frame,
-    PluginModule* module,
-    WebPluginContainer* container,
-    const GURL& plugin_url,
-    v8::Isolate* isolate) {
-  base::RepeatingCallback<const void*(const char*)> get_plugin_interface_func =
-      base::BindRepeating(&PluginModule::GetPluginInterface, module);
-  PPP_Instance_Combined* ppp_instance_combined =
-      PPP_Instance_Combined::Create(std::move(get_plugin_interface_func));
-  if (!ppp_instance_combined)
-    return nullptr;
-
-  return new PepperPluginInstanceImpl(render_frame, module,
-                                      ppp_instance_combined, container,
-                                      plugin_url, isolate);
-}
-
-// static
-PepperPluginInstance* PepperPluginInstance::Get(PP_Instance instance_id) {
-  PepperPluginInstanceImpl* instance =
-      PepperPluginInstanceImpl::GetForTesting(instance_id);
-  if (instance && !instance->is_deleted())
-    return instance;
-  return nullptr;
-}
-
-// static
-PepperPluginInstanceImpl* PepperPluginInstanceImpl::GetForTesting(
-    PP_Instance instance_id) {
-  PepperPluginInstanceImpl* instance =
-      HostGlobals::Get()->GetInstance(instance_id);
-  return instance;
-}
-
-PepperPluginInstanceImpl::ExternalDocumentLoader::ExternalDocumentLoader()
-    : finished_loading_(false) {}
-
-PepperPluginInstanceImpl::ExternalDocumentLoader::~ExternalDocumentLoader() {}
-
-void PepperPluginInstanceImpl::ExternalDocumentLoader::ReplayReceivedData(
-    WebAssociatedURLLoaderClient* document_loader) {
-  for (auto it = data_.begin(); it != data_.end(); ++it) {
-    document_loader->DidReceiveData(*it);
-  }
-  if (finished_loading_) {
-    document_loader->DidFinishLoading();
-  } else if (error_.get()) {
-    DCHECK(!finished_loading_);
-    document_loader->DidFail(*error_);
-  }
-}
-
-void PepperPluginInstanceImpl::ExternalDocumentLoader::DidReceiveData(
-    base::span<const char> data) {
-  data_.push_back(std::string(data.data(), data.size()));
-}
-
-void PepperPluginInstanceImpl::ExternalDocumentLoader::DidFinishLoading() {
-  DCHECK(!finished_loading_);
-
-  if (error_.get())
-    return;
-
-  finished_loading_ = true;
-}
-
-void PepperPluginInstanceImpl::ExternalDocumentLoader::DidFail(
-    const WebURLError& error) {
-  DCHECK(!error_.get());
-
-  if (finished_loading_)
-    return;
-
-  error_ = std::make_unique<WebURLError>(error);
-}
-
-PepperPluginInstanceImpl::GamepadImpl::GamepadImpl()
-    : Resource(ppapi::Resource::Untracked()) {}
-
-PepperPluginInstanceImpl::GamepadImpl::~GamepadImpl() {}
-
-PPB_Gamepad_API* PepperPluginInstanceImpl::GamepadImpl::AsPPB_Gamepad_API() {
-  return this;
-}
-
-void PepperPluginInstanceImpl::GamepadImpl::Sample(
-    PP_Instance instance,
-    PP_GamepadsSampleData* data) {
-  // This gamepad singleton resource method should not be called
-  NOTREACHED();
-}
-
-PepperPluginInstanceImpl::PepperPluginInstanceImpl(
-    RenderFrameImpl* render_frame,
-    PluginModule* module,
-    ppapi::PPP_Instance_Combined* instance_interface,
-    WebPluginContainer* container,
-    const GURL& plugin_url,
-    v8::Isolate* isolate)
-    : RenderFrameObserver(render_frame),
-      render_frame_(render_frame),
-      module_(module),
-      instance_interface_(instance_interface),
-      pp_instance_(0),
-      graphics2d_translation_(0, 0),
-      graphics2d_scale_(1.f),
-      container_(container),
-      layer_is_hardware_(false),
-      plugin_url_(plugin_url),
-      document_url_(container ? GURL(container->GetDocument().Url()) : GURL()),
-      has_been_clicked_(false),
-      full_frame_(false),
-      viewport_to_dip_scale_(1.0f),
-      sent_initial_did_change_view_(false),
-      bound_graphics_2d_platform_(nullptr),
-      has_webkit_focus_(false),
-      find_identifier_(-1),
-      plugin_input_event_interface_(nullptr),
-      plugin_mouse_lock_interface_(nullptr),
-      plugin_private_interface_(nullptr),
-      plugin_textinput_interface_(nullptr),
-      checked_for_plugin_input_event_interface_(false),
-      metafile_(nullptr),
-      gamepad_impl_(new GamepadImpl()),
-      uma_private_impl_(nullptr),
-      plugin_print_interface_(nullptr),
-      always_on_top_(false),
-      desired_fullscreen_state_(false),
-      message_channel_(nullptr),
-      input_event_mask_(0),
-      filtered_input_event_mask_(0),
-      text_input_type_(kPluginDefaultTextInputType),
-      selection_caret_(0),
-      selection_anchor_(0),
-      document_loader_(nullptr),
-      external_document_load_(false),
-      isolate_(isolate),
-      is_deleted_(false),
-      initialized_(false),
-      created_in_process_instance_(false),
-      audio_controller_(std::make_unique<PepperAudioController>(this)) {
-  pp_instance_ = HostGlobals::Get()->AddInstance(this);
-
-  memset(&current_print_settings_, 0, sizeof(current_print_settings_));
-  module_->InstanceCreated(this);
-
-  if (render_frame_) {  // NULL in tests or if the frame has been destroyed.
-    render_frame_->PepperInstanceCreated(
-        this, pepper_receiver_.BindNewEndpointAndPassRemote(),
-        pepper_host_remote_.BindNewEndpointAndPassReceiver());
-    view_data_.is_page_visible =
-        !render_frame_->GetLocalRootWebFrameWidget()->IsHidden();
-
-    if (!module_->IsProxied()) {
-      created_in_process_instance_ = true;
-      PepperBrowserConnection* browser_connection =
-          PepperBrowserConnection::Get(render_frame_);
-      browser_connection->DidCreateInProcessInstance(
-          pp_instance(),
-          render_frame_->GetRoutingID(),
-          document_url_,
-          GetPluginURL());
-    }
-  }
-
-  RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host();
-  resource_creation_ = host_impl->CreateInProcessResourceCreationAPI(this);
-
-  if (GetContentClient()->renderer() &&  // NULL in unit tests.
-      GetContentClient()->renderer()->IsExternalPepperPlugin(module->name()))
-    external_document_load_ = true;
-}
-
-PepperPluginInstanceImpl::~PepperPluginInstanceImpl() {
-  // Notify all the plugin objects of deletion. This will prevent blink from
-  // calling into the plugin any more.
-  //
-  // Swap out the set so we can delete from it (the objects will try to
-  // unregister themselves inside the delete call).
-  PluginObjectSet plugin_object_copy;
-  live_plugin_objects_.swap(plugin_object_copy);
-  for (auto i = plugin_object_copy.begin(); i != plugin_object_copy.end();
-       ++i) {
-    (*i)->InstanceDeleted();
-  }
-
-  if (message_channel_)
-    message_channel_->InstanceDeleted();
-  message_channel_object_.Reset();
-
-  if (TrackedCallback::IsPending(lock_mouse_callback_))
-    lock_mouse_callback_->Abort();
-
-  audio_controller_->OnPepperInstanceDeleted();
-
-  if (render_frame_)
-    render_frame_->PepperInstanceDeleted(this);
-
-  if (created_in_process_instance_) {
-    PepperBrowserConnection* browser_connection =
-        PepperBrowserConnection::Get(render_frame_);
-    browser_connection->DidDeleteInProcessInstance(pp_instance());
-  }
-
-  module_->InstanceDeleted(this);
-  // If we switched from the NaCl plugin module, notify it too.
-  if (original_module_.get())
-    original_module_->InstanceDeleted(this);
-
-  // This should be last since some of the above "instance deleted" calls will
-  // want to look up in the global map to get info off of our object.
-  HostGlobals::Get()->InstanceDeleted(pp_instance_);
-
-}
-
-// NOTE: Any of these methods that calls into the plugin needs to take into
-// account that the plugin may use Var to remove the <embed> from the DOM, which
-// will make the PepperWebPluginImpl drop its reference, usually the last one.
-// If a method needs to access a member of the instance after the call has
-// returned, then it needs to keep its own reference on the stack.
-
-v8::Local<v8::Object> PepperPluginInstanceImpl::GetMessageChannelObject() {
-  return v8::Local<v8::Object>::New(isolate_, message_channel_object_);
-}
-
-void PepperPluginInstanceImpl::MessageChannelDestroyed() {
-  message_channel_ = nullptr;
-  message_channel_object_.Reset();
-}
-
-v8::Local<v8::Context> PepperPluginInstanceImpl::GetMainWorldContext() {
-  if (!container_)
-    return v8::Local<v8::Context>();
-
-  WebLocalFrame* frame = container_->GetDocument().GetFrame();
-
-  if (!frame)
-    return v8::Local<v8::Context>();
-
-  v8::Local<v8::Context> context = frame->MainWorldScriptContext();
-  DCHECK(context->GetIsolate() == isolate_);
-  return context;
-}
-
-void PepperPluginInstanceImpl::Delete() {
-  is_deleted_ = true;
-
-  // Keep a reference on the stack. See NOTE above.
-  scoped_refptr<PepperPluginInstanceImpl> ref(this);
-
-  // Force the MessageChannel to release its "passthrough object" which should
-  // release our last reference to the "InstanceObject" and will probably
-  // destroy it. We want to do this prior to calling DidDestroy in case the
-  // destructor of the instance object tries to use the instance.
-  if (message_channel_)
-    message_channel_->SetPassthroughObject(v8::Local<v8::Object>());
-  // If this is a NaCl plugin instance, shut down the NaCl plugin by calling
-  // its DidDestroy. Don't call DidDestroy on the untrusted plugin instance,
-  // since there is little that it can do at this point.
-  if (original_instance_interface_) {
-    base::TimeTicks start = base::TimeTicks::Now();
-    original_instance_interface_->DidDestroy(pp_instance());
-    UMA_HISTOGRAM_CUSTOM_TIMES("NaCl.Perf.ShutdownTime.Total",
-                               base::TimeTicks::Now() - start,
-                               base::Milliseconds(1), base::Seconds(20), 100);
-  } else {
-    instance_interface_->DidDestroy(pp_instance());
-  }
-  // Ensure we don't attempt to call functions on the destroyed instance.
-  original_instance_interface_.reset();
-  instance_interface_.reset();
-
-  // Force-unbind any Graphics. In the case of Graphics2D, if the plugin
-  // leaks the graphics 2D, it may actually get cleaned up after our
-  // destruction, so we need its pointers to be up to date.
-  BindGraphics(pp_instance(), 0);
-  container_ = nullptr;
-}
-
-bool PepperPluginInstanceImpl::is_deleted() const { return is_deleted_; }
-
-void PepperPluginInstanceImpl::Paint(cc::PaintCanvas* canvas,
-                                     const gfx::Rect& plugin_rect,
-                                     const gfx::Rect& paint_rect) {
-  TRACE_EVENT0("ppapi", "PluginInstance::Paint");
-  if (module()->is_crashed()) {
-    // Crashed plugin painting.
-    if (!sad_plugin_image_) {  // Lazily initialize bitmap.
-      if (SkBitmap* bitmap =
-              GetContentClient()->renderer()->GetSadPluginBitmap()) {
-        DCHECK(bitmap->isImmutable());
-        sad_plugin_image_ = cc::PaintImage::CreateFromBitmap(*bitmap);
-      }
-    }
-    if (sad_plugin_image_)
-      PaintSadPlugin(canvas, plugin_rect, sad_plugin_image_);
-    return;
-  }
-
-  if (bound_graphics_2d_platform_)
-    bound_graphics_2d_platform_->Paint(canvas, plugin_rect, paint_rect);
-}
-
-void PepperPluginInstanceImpl::InvalidateRect(const gfx::Rect& rect) {
-  if (!container_ || view_data_.rect.size.width == 0 ||
-      view_data_.rect.size.height == 0)
-    return;  // Nothing to do.
-
-  if (texture_layer_) {
-    if (rect.IsEmpty()) {
-      texture_layer_->SetNeedsDisplay();
-    } else {
-      texture_layer_->SetNeedsDisplayRect(rect);
-    }
-  } else {
-    container_->Invalidate();
-  }
-}
-
-void PepperPluginInstanceImpl::CommitTransferableResource(
-    const viz::TransferableResource& resource) {
-  if (!committed_texture_.is_empty() && !IsTextureInUse(committed_texture_)) {
-    committed_texture_graphics_3d_->ReturnFrontBuffer(
-        committed_texture_.mailbox(), committed_texture_consumed_sync_token_,
-        false);
-  }
-
-  committed_texture_ = resource;
-  committed_texture_graphics_3d_ = bound_graphics_3d_;
-  committed_texture_consumed_sync_token_ = gpu::SyncToken();
-
-  if (!texture_layer_) {
-    UpdateLayer(true);
-    return;
-  }
-
-  PassCommittedTextureToTextureLayer();
-  texture_layer_->SetNeedsDisplay();
-}
-
-void PepperPluginInstanceImpl::PassCommittedTextureToTextureLayer() {
-  DCHECK(bound_graphics_3d_);
-
-  if (committed_texture_.is_empty()) {
-    return;
-  }
-
-  viz::ReleaseCallback callback(base::BindOnce(
-      &PepperPluginInstanceImpl::FinishedConsumingCommittedTexture,
-      weak_factory_.GetWeakPtr(), committed_texture_,
-      committed_texture_graphics_3d_));
-
-  committed_texture_.origin = kBottomLeft_GrSurfaceOrigin;
-  IncrementTextureReferenceCount(committed_texture_);
-  texture_layer_->SetTransferableResource(committed_texture_,
-                                          std::move(callback));
-}
-
-void PepperPluginInstanceImpl::FinishedConsumingCommittedTexture(
-    const viz::TransferableResource& resource,
-    scoped_refptr<PPB_Graphics3D_Impl> graphics_3d,
-    const gpu::SyncToken& sync_token,
-    bool is_lost) {
-  bool removed = DecrementTextureReferenceCount(resource);
-  bool is_committed_texture =
-      committed_texture_.mailbox() == resource.mailbox();
-
-  if (is_committed_texture && !is_lost) {
-    committed_texture_consumed_sync_token_ = sync_token;
-    return;
-  }
-
-  if (removed && !is_committed_texture) {
-    graphics_3d->ReturnFrontBuffer(resource.mailbox(), sync_token, is_lost);
-  }
-}
-
-void PepperPluginInstanceImpl::InstanceCrashed() {
-  // Force free all resources and vars.
-  HostGlobals::Get()->InstanceCrashed(pp_instance());
-
-  // Free any associated graphics.
-  SetFullscreen(false);
-  // Unbind current 2D or 3D graphics context.
-  BindGraphics(pp_instance(), 0);
-  InvalidateRect(gfx::Rect());
-
-  if (auto* host = GetPepperPluginInstanceHost())
-    host->InstanceCrashed(module_->path(), module_->GetPeerProcessId());
-}
-
-bool PepperPluginInstanceImpl::Initialize(
-    const std::vector<std::string>& arg_names,
-    const std::vector<std::string>& arg_values,
-    bool full_frame) {
-  if (!render_frame_)
-    return false;
-
-  message_channel_ = MessageChannel::Create(this, &message_channel_object_);
-  DCHECK(message_channel_);
-
-  full_frame_ = full_frame;
-
-  UpdateTouchEventRequest();
-  UpdateWheelEventRequest();
-
-  argn_ = arg_names;
-  argv_ = arg_values;
-  std::unique_ptr<const char* []> argn_array(StringVectorToArgArray(argn_));
-  std::unique_ptr<const char* []> argv_array(StringVectorToArgArray(argv_));
-  auto weak_this = weak_factory_.GetWeakPtr();
-  bool success = PP_ToBool(instance_interface_->DidCreate(
-      pp_instance(), argn_.size(), argn_array.get(), argv_array.get()));
-  if (!weak_this) {
-    // The plugin may do synchronous scripting during "DidCreate", so |this|
-    // may be deleted. In that case, return failure and don't touch any
-    // member variables.
-    return false;
-  }
-  // If this is a plugin that hosts external plugins, we should delay messages
-  // so that the child plugin that's created later will receive all the
-  // messages. (E.g., NaCl trusted plugin starting a child NaCl app.)
-  //
-  // A host for external plugins will call ResetAsProxied later, at which point
-  // we can Start() the MessageChannel.
-  if (success && !module_->renderer_ppapi_host()->IsExternalPluginHost())
-    message_channel_->Start();
-
-  initialized_ = success;
-  return success;
-}
-
-bool PepperPluginInstanceImpl::HandleDocumentLoad(
-    const blink::WebURLResponse& response) {
-  DCHECK(!document_loader_);
-  if (external_document_load_) {
-    // The external proxy isn't available, so save the response and record
-    // document load notifications for later replay.
-    external_document_response_ = response;
-    external_document_loader_ = std::make_unique<ExternalDocumentLoader>();
-    document_loader_ = external_document_loader_.get();
-    return true;
-  }
-
-  if (module()->is_crashed() || !render_frame_) {
-    // Don't create a resource for a crashed plugin.
-    container()->GetDocument().GetFrame()->DeprecatedStopLoading();
-    return false;
-  }
-
-  DCHECK(!document_loader_);
-
-  // Create a loader resource host for this load. Note that we have to set
-  // the document_loader before issuing the in-process
-  // PPP_Instance.HandleDocumentLoad call below, since this may reentrantly
-  // call into the instance and expect it to be valid.
-  RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host();
-  auto loader_host =
-      std::make_unique<PepperURLLoaderHost>(host_impl, true, pp_instance(), 0);
-  // TODO(teravest): Remove set_document_loader() from instance and clean up
-  // this relationship.
-  set_document_loader(loader_host.get());
-  loader_host->DidReceiveResponse(response);
-
-  // This host will be pending until the resource object attaches to it.
-  int pending_host_id = host_impl->GetPpapiHost()->AddPendingResourceHost(
-      std::unique_ptr<ppapi::host::ResourceHost>(std::move(loader_host)));
-  DCHECK(pending_host_id);
-
-  render_frame()
-      ->GetTaskRunner(blink::TaskType::kInternalLoading)
-      ->PostTask(
-          FROM_HERE,
-          base::BindOnce(&PepperPluginInstanceImpl::DidDataFromWebURLResponse,
-                         weak_factory_.GetWeakPtr(), response, pending_host_id,
-                         DataFromWebURLResponse(response)));
-
-  // If the load was not abandoned, document_loader_ will now be set. It's
-  // possible that the load was canceled by now and document_loader_ was
-  // already nulled out.
-  return true;
-}
-
-bool PepperPluginInstanceImpl::SendCompositionEventToPlugin(
-    PP_InputEvent_Type type,
-    const std::u16string& text) {
-  std::vector<ui::ImeTextSpan> empty;
-  return SendCompositionEventWithImeTextSpanInformationToPlugin(
-      type, text, empty, static_cast<int>(text.size()),
-      static_cast<int>(text.size()));
-}
-
-bool PepperPluginInstanceImpl::
-    SendCompositionEventWithImeTextSpanInformationToPlugin(
-        PP_InputEvent_Type type,
-        const std::u16string& text,
-        const std::vector<ui::ImeTextSpan>& ime_text_spans,
-        int selection_start,
-        int selection_end) {
-  // Keep a reference on the stack. See NOTE above.
-  scoped_refptr<PepperPluginInstanceImpl> ref(this);
-
-  if (!LoadInputEventInterface())
-    return false;
-
-  PP_InputEvent_Class event_class = PP_INPUTEVENT_CLASS_IME;
-  if (!(filtered_input_event_mask_ & event_class) &&
-      !(input_event_mask_ & event_class))
-    return false;
-
-  ppapi::InputEventData event;
-  event.event_type = type;
-  event.event_time_stamp =
-      ppapi::TimeTicksToPPTimeTicks(base::TimeTicks::Now());
-
-  // Convert UTF16 text to UTF8 with offset conversion.
-  std::vector<size_t> utf16_offsets;
-  utf16_offsets.push_back(selection_start);
-  utf16_offsets.push_back(selection_end);
-  for (size_t i = 0; i < ime_text_spans.size(); ++i) {
-    utf16_offsets.push_back(ime_text_spans[i].start_offset);
-    utf16_offsets.push_back(ime_text_spans[i].end_offset);
-  }
-  std::vector<size_t> utf8_offsets(utf16_offsets);
-  event.character_text = base::UTF16ToUTF8AndAdjustOffsets(text, &utf8_offsets);
-
-  // Set the converted selection range.
-  event.composition_selection_start =
-      (utf8_offsets[0] == std::string::npos ? event.character_text.size()
-                                            : utf8_offsets[0]);
-  event.composition_selection_end =
-      (utf8_offsets[1] == std::string::npos ? event.character_text.size()
-                                            : utf8_offsets[1]);
-
-  // Set the converted segmentation points.
-  // Be sure to add 0 and size(), and remove duplication or errors.
-  std::set<size_t> offset_set(utf8_offsets.begin() + 2, utf8_offsets.end());
-  offset_set.insert(0);
-  offset_set.insert(event.character_text.size());
-  offset_set.erase(std::string::npos);
-  event.composition_segment_offsets.assign(offset_set.begin(),
-                                           offset_set.end());
-
-  // Set the composition target.
-  for (size_t i = 0; i < ime_text_spans.size(); ++i) {
-    if (ime_text_spans[i].thickness == ui::ImeTextSpan::Thickness::kThick) {
-      auto it = std::ranges::find(event.composition_segment_offsets,
-                                  utf8_offsets[2 * i + 2]);
-      if (it != event.composition_segment_offsets.end()) {
-        event.composition_target_segment =
-            it - event.composition_segment_offsets.begin();
-        break;
-      }
-    }
-  }
-
-  // Send the event.
-  bool handled = false;
-  if (filtered_input_event_mask_ & event_class)
-    event.is_filtered = true;
-  else
-    handled = true;  // Unfiltered events are assumed to be handled.
-  scoped_refptr<PPB_InputEvent_Shared> event_resource(
-      new PPB_InputEvent_Shared(ppapi::OBJECT_IS_IMPL, pp_instance(), event));
-  handled |= PP_ToBool(plugin_input_event_interface_->HandleInputEvent(
-      pp_instance(), event_resource->pp_resource()));
-  return handled;
-}
-
-void PepperPluginInstanceImpl::RequestInputEventsHelper(
-    uint32_t event_classes) {
-  if (event_classes & PP_INPUTEVENT_CLASS_TOUCH)
-    UpdateTouchEventRequest();
-  if (event_classes & PP_INPUTEVENT_CLASS_WHEEL)
-    UpdateWheelEventRequest();
-}
-
-bool PepperPluginInstanceImpl::HandleCompositionStart(
-    const std::u16string& text) {
-  return SendCompositionEventToPlugin(PP_INPUTEVENT_TYPE_IME_COMPOSITION_START,
-                                      text);
-}
-
-bool PepperPluginInstanceImpl::HandleCompositionUpdate(
-    const std::u16string& text,
-    const std::vector<ui::ImeTextSpan>& ime_text_spans,
-    int selection_start,
-    int selection_end) {
-  return SendCompositionEventWithImeTextSpanInformationToPlugin(
-      PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE, text, ime_text_spans,
-      selection_start, selection_end);
-}
-
-bool PepperPluginInstanceImpl::HandleCompositionEnd(
-    const std::u16string& text) {
-  return SendCompositionEventToPlugin(PP_INPUTEVENT_TYPE_IME_COMPOSITION_END,
-                                      text);
-}
-
-bool PepperPluginInstanceImpl::HandleTextInput(const std::u16string& text) {
-  return SendCompositionEventToPlugin(PP_INPUTEVENT_TYPE_IME_TEXT, text);
-}
-
-void PepperPluginInstanceImpl::GetSurroundingText(std::u16string* text,
-                                                  gfx::Range* range) const {
-  std::vector<size_t> offsets;
-  offsets.push_back(selection_anchor_);
-  offsets.push_back(selection_caret_);
-  *text = base::UTF8ToUTF16AndAdjustOffsets(surrounding_text_, &offsets);
-  range->set_start(offsets[0] == std::u16string::npos ? text->size()
-                                                      : offsets[0]);
-  range->set_end(offsets[1] == std::u16string::npos ? text->size()
-                                                    : offsets[1]);
-}
-
-bool PepperPluginInstanceImpl::IsPluginAcceptingCompositionEvents() const {
-  return (filtered_input_event_mask_ & PP_INPUTEVENT_CLASS_IME) ||
-         (input_event_mask_ & PP_INPUTEVENT_CLASS_IME);
-}
-
-gfx::Rect PepperPluginInstanceImpl::GetCaretBounds() const {
-  if (!text_input_caret_info_) {
-    // If it is never set by the plugin, use the bottom left corner.
-    gfx::Rect rect(view_data_.rect.point.x,
-                   view_data_.rect.point.y + view_data_.rect.size.height,
-                   0, 0);
-    ConvertDIPToViewport(&rect);
-    return rect;
-  }
-
-  // TODO(kinaba) Take CSS transformation into account.
-  gfx::Rect caret = text_input_caret_info_->caret;
-  caret.Offset(view_data_.rect.point.x, view_data_.rect.point.y);
-  ConvertDIPToViewport(&caret);
-  return caret;
-}
-
-bool PepperPluginInstanceImpl::HandleCoalescedInputEvent(
-    const blink::WebCoalescedInputEvent& event,
-    ui::Cursor* cursor) {
-  if (blink::WebInputEvent::IsTouchEventType(event.Event().GetType()) &&
-      ((filtered_input_event_mask_ & PP_INPUTEVENT_CLASS_COALESCED_TOUCH) ||
-       (input_event_mask_ & PP_INPUTEVENT_CLASS_COALESCED_TOUCH))) {
-    bool result = false;
-    for (size_t i = 0; i < event.CoalescedEventSize(); ++i) {
-      result |= HandleInputEvent(event.CoalescedEvent(i), cursor);
-    }
-    return result;
-  }
-  return HandleInputEvent(event.Event(), cursor);
-}
-
-bool PepperPluginInstanceImpl::HandleInputEvent(
-    const blink::WebInputEvent& event,
-    ui::Cursor* cursor) {
-  TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::HandleInputEvent");
-
-  if (!render_frame_)
-    return false;
-
-  // Don't dispatch input events to crashed plugins.
-  if (module()->is_crashed())
-    return false;
-
-  // Don't send reserved system key events to plugins.
-  if (IsReservedSystemInputEvent(event))
-    return false;
-
-  // Keep a reference on the stack. See NOTE above.
-  scoped_refptr<PepperPluginInstanceImpl> ref(this);
-
-  bool rv = false;
-  if (LoadInputEventInterface()) {
-    PP_InputEvent_Class event_class = ClassifyInputEvent(event);
-    if (!event_class)
-      return false;
-
-    if ((filtered_input_event_mask_ & event_class) ||
-        (input_event_mask_ & event_class)) {
-      // Actually send the event.
-      std::vector<ppapi::InputEventData> events;
-      std::unique_ptr<const WebInputEvent> event_in_dip(
-          ui::ScaleWebInputEvent(event, viewport_to_dip_scale_));
-      if (event_in_dip)
-        CreateInputEventData(*event_in_dip.get(), &events);
-      else
-        CreateInputEventData(event, &events);
-
-      // Each input event may generate more than one PP_InputEvent.
-      for (size_t i = 0; i < events.size(); i++) {
-        if (filtered_input_event_mask_ & event_class)
-          events[i].is_filtered = true;
-        else
-          rv = true;  // Unfiltered events are assumed to be handled.
-        scoped_refptr<PPB_InputEvent_Shared> event_resource(
-            new PPB_InputEvent_Shared(
-                ppapi::OBJECT_IS_IMPL, pp_instance(), events[i]));
-
-        rv |= PP_ToBool(plugin_input_event_interface_->HandleInputEvent(
-            pp_instance(), event_resource->pp_resource()));
-      }
-    }
-  }
-
-  if (cursor_)
-    *cursor = *cursor_;
-  return rv;
-}
-
-void PepperPluginInstanceImpl::HandleMessage(ScopedPPVar message) {
-  TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::HandleMessage");
-  if (is_deleted_)
-    return;
-  ppapi::proxy::HostDispatcher* dispatcher =
-      ppapi::proxy::HostDispatcher::GetForInstance(pp_instance());
-  if (!dispatcher || (message.get().type == PP_VARTYPE_OBJECT)) {
-    // The dispatcher should always be valid, and MessageChannel should never
-    // send an 'object' var over PPP_Messaging.
-    NOTREACHED();
-  }
-  dispatcher->Send(new PpapiMsg_PPPMessaging_HandleMessage(
-      ppapi::API_ID_PPP_MESSAGING,
-      pp_instance(),
-      ppapi::proxy::SerializedVarSendInputShmem(dispatcher, message.get(),
-                                                pp_instance())));
-}
-
-bool PepperPluginInstanceImpl::HandleBlockingMessage(ScopedPPVar message,
-                                                     ScopedPPVar* result) {
-  TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::HandleBlockingMessage");
-  if (is_deleted_)
-    return false;
-  ppapi::proxy::HostDispatcher* dispatcher =
-      ppapi::proxy::HostDispatcher::GetForInstance(pp_instance());
-  if (!dispatcher || (message.get().type == PP_VARTYPE_OBJECT)) {
-    // The dispatcher should always be valid, and MessageChannel should never
-    // send an 'object' var over PPP_Messaging.
-    NOTREACHED();
-  }
-  ppapi::proxy::ReceiveSerializedVarReturnValue msg_reply;
-  bool was_handled = false;
-  dispatcher->Send(new PpapiMsg_PPPMessageHandler_HandleBlockingMessage(
-      ppapi::API_ID_PPP_MESSAGING,
-      pp_instance(),
-      ppapi::proxy::SerializedVarSendInputShmem(dispatcher, message.get(),
-                                                pp_instance()),
-      &msg_reply,
-      &was_handled));
-  *result = ScopedPPVar(ScopedPPVar::PassRef(), msg_reply.Return(dispatcher));
-  TRACE_EVENT0("ppapi",
-               "PepperPluginInstanceImpl::HandleBlockingMessage return.");
-  return was_handled;
-}
-
-PP_Var PepperPluginInstanceImpl::GetInstanceObject(v8::Isolate* isolate) {
-  // Keep a reference on the stack. See NOTE above.
-  scoped_refptr<PepperPluginInstanceImpl> ref(this);
-
-  DCHECK_EQ(isolate, isolate_);
-
-  // If the plugin supports the private instance interface, try to retrieve its
-  // instance object.
-  if (LoadPrivateInterface())
-    return plugin_private_interface_->GetInstanceObject(pp_instance());
-  return PP_MakeUndefined();
-}
-
-void PepperPluginInstanceImpl::ViewChanged(
-    const gfx::Rect& window,
-    const gfx::Rect& clip,
-    const gfx::Rect& unobscured) {
-  if (!render_frame_)
-    return;
-
-  // WebKit can give weird (x,y) positions for empty clip rects (since the
-  // position technically doesn't matter). But we want to make these
-  // consistent since this is given to the plugin, so force everything to 0
-  // in the "everything is clipped" case.
-  gfx::Rect new_clip;
-  if (!clip.IsEmpty())
-    new_clip = clip;
-
-  unobscured_rect_ = unobscured;
-
-  view_data_.rect = PP_FromGfxRect(window);
-  view_data_.clip_rect = PP_FromGfxRect(new_clip);
-  // TODO(chrishtr): remove device_scale
-  view_data_.device_scale = 1;
-  view_data_.css_scale =
-      container_->LayoutZoomFactor() * container_->PageScaleFactor();
-  WebWidget* widget = render_frame()->GetLocalRootWebFrameWidget();
-
-  viewport_to_dip_scale_ =
-      1.0f / widget->GetOriginalScreenInfo().device_scale_factor;
-  ConvertRectToDIP(&view_data_.rect);
-  ConvertRectToDIP(&view_data_.clip_rect);
-  view_data_.css_scale *= viewport_to_dip_scale_;
-  view_data_.device_scale /= viewport_to_dip_scale_;
-
-  gfx::PointF scroll_offset =
-      container_->GetDocument().GetFrame()->GetScrollOffset();
-  scroll_offset.Scale(viewport_to_dip_scale_);
-
-  gfx::Point floored_scroll_offset = gfx::ToFlooredPoint(scroll_offset);
-  view_data_.scroll_offset =
-      PP_MakePoint(floored_scroll_offset.x(), floored_scroll_offset.y());
-
-  // The view size may have changed and we might need to update
-  // our registration of event listeners.
-  UpdateTouchEventRequest();
-  UpdateWheelEventRequest();
-
-  if (desired_fullscreen_state_ || view_data_.is_fullscreen) {
-    bool is_fullscreen_element = container_->IsFullscreenElement();
-    if (!view_data_.is_fullscreen && desired_fullscreen_state_ &&
-        is_fullscreen_element) {
-      // Entered fullscreen. Only possible via SetFullscreen().
-      view_data_.is_fullscreen = true;
-    } else if (view_data_.is_fullscreen && !is_fullscreen_element) {
-      // Exited fullscreen. Possible via SetFullscreen() or F11/link,
-      // so desired_fullscreen_state might be out-of-date.
-      desired_fullscreen_state_ = false;
-      view_data_.is_fullscreen = false;
-
-      // This operation will cause the plugin to re-layout which will send more
-      // DidChangeView updates. Schedule an asynchronous update and suppress
-      // notifications until that completes to avoid sending intermediate sizes
-      // to the plugins.
-      ScheduleAsyncDidChangeView();
-
-      // Reset the size attributes that we hacked to fill in the screen and
-      // retrigger ViewChanged. Make sure we don't forward duplicates of
-      // this view to the plugin.
-      ResetSizeAttributesAfterFullscreen();
-      return;
-    }
-  }
-
-  // During plugin initialization, there are often re-layouts. Avoid sending
-  // intermediate sizes the plugin.
-  if (sent_initial_did_change_view_)
-    SendDidChangeView();
-  else
-    ScheduleAsyncDidChangeView();
-}
-
-void PepperPluginInstanceImpl::SetWebKitFocus(bool has_focus) {
-  if (has_webkit_focus_ == has_focus)
-    return;
-
-  bool old_plugin_focus = PluginHasFocus();
-  has_webkit_focus_ = has_focus;
-  if (PluginHasFocus() != old_plugin_focus)
-    SendFocusChangeNotification();
-}
-
-void PepperPluginInstanceImpl::PageVisibilityChanged(bool is_visible) {
-  if (is_visible == view_data_.is_page_visible)
-    return;  // Nothing to do.
-  view_data_.is_page_visible = is_visible;
-
-  // If the initial DidChangeView notification hasn't been sent to the plugin,
-  // let it pass the visibility state for us, instead of sending a notification
-  // immediately. It is possible that PepperPluginInstanceImpl::ViewChanged()
-  // hasn't been called for the first time. In that case, most of the fields in
-  // |view_data_| haven't been properly initialized.
-  if (sent_initial_did_change_view_)
-    SendDidChangeView();
-}
-
-void PepperPluginInstanceImpl::ViewInitiatedPaint() {
-  if (bound_graphics_2d_platform_)
-    bound_graphics_2d_platform_->ViewInitiatedPaint();
-  else if (bound_graphics_3d_.get())
-    bound_graphics_3d_->ViewInitiatedPaint();
-}
-
-void PepperPluginInstanceImpl::SetSelectedText(
-    const std::u16string& selected_text) {
-  if (!render_frame_)
-    return;
-
-  selected_text_ = selected_text;
-  gfx::Range range(0, selected_text.length());
-  render_frame_->SetSelectedText(selected_text, 0, range);
-}
-
-void PepperPluginInstanceImpl::SetLinkUnderCursor(const std::string& url) {
-  link_under_cursor_ = base::UTF8ToUTF16(url);
-}
-
-void PepperPluginInstanceImpl::SetTextInputType(ui::TextInputType type) {
-  if (!render_frame_)
-    return;
-
-  text_input_type_ = type;
-  render_frame_->PepperTextInputTypeChanged(this);
-}
-
-void PepperPluginInstanceImpl::PostMessageToJavaScript(PP_Var message) {
-  if (message_channel_)
-    message_channel_->PostMessageToJavaScript(message);
-}
-
-int32_t PepperPluginInstanceImpl::RegisterMessageHandler(
-    PP_Instance instance,
-    void* user_data,
-    const PPP_MessageHandler_0_2* handler,
-    PP_Resource message_loop) {
-  // Not supported in-process.
-  NOTIMPLEMENTED();
-  return PP_ERROR_FAILED;
-}
-
-void PepperPluginInstanceImpl::UnregisterMessageHandler(PP_Instance instance) {
-  // Not supported in-process.
-  NOTIMPLEMENTED();
-}
-
-std::u16string PepperPluginInstanceImpl::GetSelectedText(bool html) {
-  return selected_text_;
-}
-
-void PepperPluginInstanceImpl::RequestSurroundingText(
-    size_t desired_number_of_characters) {
-  // Keep a reference on the stack. See NOTE above.
-  scoped_refptr<PepperPluginInstanceImpl> ref(this);
-  if (!LoadTextInputInterface())
-    return;
-  plugin_textinput_interface_->RequestSurroundingText(
-      pp_instance(), desired_number_of_characters);
-}
-
-bool PepperPluginInstanceImpl::LoadInputEventInterface() {
-  if (!checked_for_plugin_input_event_interface_) {
-    checked_for_plugin_input_event_interface_ = true;
-    plugin_input_event_interface_ = static_cast<const PPP_InputEvent*>(
-        module_->GetPluginInterface(PPP_INPUT_EVENT_INTERFACE));
-  }
-  return !!plugin_input_event_interface_;
-}
-
-bool PepperPluginInstanceImpl::LoadMouseLockInterface() {
-  if (!plugin_mouse_lock_interface_) {
-    plugin_mouse_lock_interface_ = static_cast<const PPP_MouseLock*>(
-        module_->GetPluginInterface(PPP_MOUSELOCK_INTERFACE));
-  }
-
-  return !!plugin_mouse_lock_interface_;
-}
-
-bool PepperPluginInstanceImpl::LoadPrintInterface() {
-  // Only check for the interface if the plugin has dev permission.
-  if (!module_->permissions().HasPermission(ppapi::PERMISSION_DEV))
-    return false;
-  if (!plugin_print_interface_) {
-    plugin_print_interface_ = static_cast<const PPP_Printing_Dev*>(
-        module_->GetPluginInterface(PPP_PRINTING_DEV_INTERFACE));
-  }
-  return !!plugin_print_interface_;
-}
-
-bool PepperPluginInstanceImpl::LoadPrivateInterface() {
-  // If this is a NaCl app, we want to talk to the trusted NaCl plugin to
-  // call GetInstanceObject. This is necessary to ensure that the properties
-  // the trusted plugin exposes (readyState and lastError) work properly. Note
-  // that untrusted NaCl apps are not allowed to provide PPP_InstancePrivate,
-  // so it's correct to never look up PPP_InstancePrivate for them.
-  //
-  // If this is *not* a NaCl plugin, original_module_ will never be set; we talk
-  // to the "real" module.
-  scoped_refptr<PluginModule> module =
-      original_module_.get() ? original_module_ : module_;
-  // Only check for the interface if the plugin has private permission.
-  if (!module->permissions().HasPermission(ppapi::PERMISSION_PRIVATE))
-    return false;
-  if (!plugin_private_interface_) {
-    plugin_private_interface_ = static_cast<const PPP_Instance_Private*>(
-        module->GetPluginInterface(PPP_INSTANCE_PRIVATE_INTERFACE));
-  }
-
-  return !!plugin_private_interface_;
-}
-
-bool PepperPluginInstanceImpl::LoadTextInputInterface() {
-  if (!plugin_textinput_interface_) {
-    plugin_textinput_interface_ = static_cast<const PPP_TextInput_Dev*>(
-        module_->GetPluginInterface(PPP_TEXTINPUT_DEV_INTERFACE));
-  }
-
-  return !!plugin_textinput_interface_;
-}
-
-void PepperPluginInstanceImpl::SetGraphics2DTransform(
-    const float& scale,
-    const gfx::PointF& translation) {
-  graphics2d_scale_ = scale;
-  graphics2d_translation_ = translation;
-
-  UpdateLayerTransform();
-}
-
-void PepperPluginInstanceImpl::UpdateLayerTransform() {
-  if (!bound_graphics_2d_platform_ || !texture_layer_) {
-    // Currently the transform is only applied for Graphics2D.
-    return;
-  }
-  // Set the UV coordinates of the texture based on the size of the Graphics2D
-  // context. By default a texture gets scaled to the size of the layer. But
-  // if the size of the Graphics2D context doesn't match the size of the plugin
-  // then it will be incorrectly stretched. This also affects how the plugin
-  // is painted when it is being resized. If the Graphics2D contents are
-  // stretched when a plugin is resized while waiting for a new frame from the
-  // plugin to be rendered, then flickering behavior occurs as in
-  // crbug.com/353453.
-  gfx::SizeF graphics_2d_size_in_dip =
-      gfx::ScaleSize(gfx::SizeF(bound_graphics_2d_platform_->Size()),
-                     bound_graphics_2d_platform_->GetScale());
-  gfx::Size plugin_size_in_dip(view_data_.rect.size.width,
-                               view_data_.rect.size.height);
-
-  // Adding the SetLayerTransform from Graphics2D to the UV.
-  // If graphics2d_scale_ is 1.f and graphics2d_translation_ is 0 then UV will
-  // be top_left (0,0) and lower_right (plugin_size_in_dip.width() /
-  // graphics_2d_size_in_dip.width(), plugin_size_in_dip.height() /
-  // graphics_2d_size_in_dip.height())
-  gfx::PointF top_left =
-      gfx::PointF(-graphics2d_translation_.x() / graphics2d_scale_,
-                  -graphics2d_translation_.y() / graphics2d_scale_);
-  gfx::PointF lower_right =
-      gfx::PointF((1 / graphics2d_scale_) * plugin_size_in_dip.width() -
-                      graphics2d_translation_.x() / graphics2d_scale_,
-                  (1 / graphics2d_scale_) * plugin_size_in_dip.height() -
-                      graphics2d_translation_.y() / graphics2d_scale_);
-  texture_layer_->SetUV(
-      gfx::PointF(top_left.x() / graphics_2d_size_in_dip.width(),
-                  top_left.y() / graphics_2d_size_in_dip.height()),
-      gfx::PointF(lower_right.x() / graphics_2d_size_in_dip.width(),
-                  lower_right.y() / graphics_2d_size_in_dip.height()));
-}
-
-bool PepperPluginInstanceImpl::PluginHasFocus() const {
-  return has_webkit_focus_;
-}
-
-void PepperPluginInstanceImpl::SendFocusChangeNotification() {
-  // Keep a reference on the stack. RenderFrameImpl::PepperFocusChanged may
-  // remove the <embed> from the DOM, which will make the PepperWebPluginImpl
-  // drop its reference, usually the last one. This is similar to possible
-  // plugin behavior described at the NOTE above Delete().
-  scoped_refptr<PepperPluginInstanceImpl> ref(this);
-
-  if (!render_frame_)
-    return;
-
-  bool has_focus = PluginHasFocus();
-  render_frame_->PepperFocusChanged(this, has_focus);
-
-  // instance_interface_ may have been cleared in Delete() if the
-  // PepperWebPluginImpl is destroyed.
-  if (instance_interface_)
-    instance_interface_->DidChangeFocus(pp_instance(), PP_FromBool(has_focus));
-}
-
-void PepperPluginInstanceImpl::UpdateTouchEventRequest() {
-  // If the view has 0 area don't request touch events.
-  if (view_data_.rect.size.width == 0 || view_data_.rect.size.height == 0) {
-    container_->RequestTouchEventType(
-        blink::WebPluginContainer::kTouchEventRequestTypeNone);
-    return;
-  }
-  blink::WebPluginContainer::TouchEventRequestType request_type =
-      blink::WebPluginContainer::kTouchEventRequestTypeSynthesizedMouse;
-  if ((filtered_input_event_mask_ & PP_INPUTEVENT_CLASS_COALESCED_TOUCH) ||
-      (input_event_mask_ & PP_INPUTEVENT_CLASS_COALESCED_TOUCH)) {
-    request_type =
-        blink::WebPluginContainer::kTouchEventRequestTypeRawLowLatency;
-  } else if ((filtered_input_event_mask_ & PP_INPUTEVENT_CLASS_TOUCH) ||
-             (input_event_mask_ & PP_INPUTEVENT_CLASS_TOUCH)) {
-    request_type = blink::WebPluginContainer::kTouchEventRequestTypeRaw;
-  }
-
-  container_->RequestTouchEventType(request_type);
-}
-
-void PepperPluginInstanceImpl::UpdateWheelEventRequest() {
-  // If the view has 0 area don't request wheel events.
-  if (view_data_.rect.size.width == 0 || view_data_.rect.size.height == 0) {
-    container_->SetWantsWheelEvents(false);
-    return;
-  }
-
-  bool hasWheelMask =
-      (filtered_input_event_mask_ & PP_INPUTEVENT_CLASS_WHEEL) ||
-      (input_event_mask_ & PP_INPUTEVENT_CLASS_WHEEL);
-  container_->SetWantsWheelEvents(hasWheelMask);
-}
-
-void PepperPluginInstanceImpl::ScheduleAsyncDidChangeView() {
-  if (view_change_weak_ptr_factory_.HasWeakPtrs())
-    return;  // Already scheduled.
-  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PepperPluginInstanceImpl::SendAsyncDidChangeView,
-                     view_change_weak_ptr_factory_.GetWeakPtr()));
-}
-
-void PepperPluginInstanceImpl::SendAsyncDidChangeView() {
-  // The bound callback that owns the weak pointer is still valid until after
-  // this function returns. SendDidChangeView checks HasWeakPtrs, so we need to
-  // invalidate them here.
-  // NOTE: If we ever want to have more than one pending callback, it should
-  // use a different factory, or we should have a different strategy here.
-  view_change_weak_ptr_factory_.InvalidateWeakPtrs();
-  SendDidChangeView();
-}
-
-void PepperPluginInstanceImpl::SendDidChangeView() {
-  if (!render_frame_)
-    return;
-
-  // An asynchronous view update is scheduled. Skip sending this update.
-  if (view_change_weak_ptr_factory_.HasWeakPtrs())
-    return;
-
-  // Don't send DidChangeView to crashed plugins.
-  if (module()->is_crashed())
-    return;
-
-  if (bound_graphics_2d_platform_)
-    bound_graphics_2d_platform_->set_viewport_to_dip_scale(
-        viewport_to_dip_scale_);
-
-  module_->renderer_ppapi_host()->set_viewport_to_dip_scale(
-      viewport_to_dip_scale_);
-
-  ppapi::ViewData view_data = view_data_;
-
-  if (sent_initial_did_change_view_ && last_sent_view_data_.Equals(view_data))
-    return;  // Nothing to update.
-
-  sent_initial_did_change_view_ = true;
-  last_sent_view_data_ = view_data;
-  ScopedPPResource resource(
-      ScopedPPResource::PassRef(),
-      (new PPB_View_Shared(ppapi::OBJECT_IS_IMPL, pp_instance(), view_data))
-          ->GetReference());
-
-  UpdateLayerTransform();
-
-  if (bound_graphics_2d_platform_ &&
-      (!view_data.is_page_visible ||
-       PP_ToGfxRect(view_data.clip_rect).IsEmpty())) {
-    bound_graphics_2d_platform_->ClearCache();
-  }
-
-  // It's possible that Delete() has been called but the renderer hasn't
-  // released its reference to this object yet.
-  if (instance_interface_) {
-    instance_interface_->DidChangeView(
-        pp_instance(), resource, &view_data.rect, &view_data.clip_rect);
-  }
-}
-
-void PepperPluginInstanceImpl::ReportGeometry() {
-  // If this call was delayed, we may have transitioned back to fullscreen in
-  // the mean time, so only report the geometry if we are actually in normal
-  // mode.
-  if (container_)
-    container_->ReportGeometry();
-}
-
-bool PepperPluginInstanceImpl::GetPreferredPrintOutputFormat(
-    PP_PrintOutputFormat_Dev* format,
-    const WebPrintParams& print_params) {
-  // Keep a reference on the stack. See NOTE above.
-  scoped_refptr<PepperPluginInstanceImpl> ref(this);
-  if (!LoadPrintInterface())
-    return false;
-  uint32_t supported_formats =
-      plugin_print_interface_->QuerySupportedFormats(pp_instance());
-  if ((supported_formats & PP_PRINTOUTPUTFORMAT_PDF) &&
-      !print_params.rasterize_pdf) {
-    *format = PP_PRINTOUTPUTFORMAT_PDF;
-    return true;
-  }
-  if (supported_formats & PP_PRINTOUTPUTFORMAT_RASTER) {
-    *format = PP_PRINTOUTPUTFORMAT_RASTER;
-    return true;
-  }
-  return false;
-}
-
-bool PepperPluginInstanceImpl::SupportsPrintInterface() {
-  PP_PrintOutputFormat_Dev format;
-  WebPrintParams params;
-  params.rasterize_pdf = false;
-  return GetPreferredPrintOutputFormat(&format, params);
-}
-
-int PepperPluginInstanceImpl::PrintBegin(const WebPrintParams& print_params) {
-  // Keep a reference on the stack. See NOTE above.
-  scoped_refptr<PepperPluginInstanceImpl> ref(this);
-  PP_PrintOutputFormat_Dev format;
-  if (!GetPreferredPrintOutputFormat(&format, print_params)) {
-    // PrintBegin should not have been called since SupportsPrintInterface
-    // would have returned false;
-    NOTREACHED();
-  }
-
-  const blink::WebPrintPageDescription& description =
-      print_params.default_page_description;
-  gfx::SizeF page_area_size = description.size;
-  page_area_size.set_width(std::max(0.0f, page_area_size.width() -
-                                              description.margin_left -
-                                              description.margin_right));
-  page_area_size.set_height(std::max(0.0f, page_area_size.height() -
-                                               description.margin_top -
-                                               description.margin_bottom));
-
-  PP_PrintSettings_Dev print_settings;
-  print_settings.printable_area =
-      CSSPixelsToPoints(print_params.printable_area_in_css_pixels);
-  print_settings.content_area.point = PP_Point();
-  print_settings.content_area.size = CSSPixelsToPoints(page_area_size);
-  print_settings.paper_size = CSSPixelsToPoints(description.size);
-  print_settings.dpi = print_params.printer_dpi;
-  print_settings.orientation = PP_PRINTORIENTATION_NORMAL;
-  print_settings.grayscale = PP_FALSE;
-  print_settings.print_scaling_option =
-      static_cast<PP_PrintScalingOption_Dev>(print_params.print_scaling_option);
-  print_settings.format = format;
-
-  // "fit to paper" should have never been a scaling option for the user to
-  // begin with, since it was only supported by the PDF plugin, which has been
-  // deleted.
-  DCHECK_NE(print_settings.print_scaling_option,
-            PP_PRINTSCALINGOPTION_FIT_TO_PAPER);
-
-  int num_pages =
-      plugin_print_interface_->Begin(pp_instance(), &print_settings);
-  if (!num_pages)
-    return 0;
-
-  current_print_settings_ = print_settings;
-  metafile_ = nullptr;
-  ranges_.clear();
-  ranges_.reserve(num_pages);
-  return num_pages;
-}
-
-void PepperPluginInstanceImpl::PrintPage(int page_number,
-                                         cc::PaintCanvas* canvas) {
-#if BUILDFLAG(ENABLE_PRINTING)
-  DCHECK(plugin_print_interface_);
-
-  // |canvas| should always have an associated metafile.
-  auto* metafile = canvas->GetPrintingMetafile();
-  DCHECK(metafile);
-
-  // |ranges_| should be empty IFF |metafile_| is not set.
-  DCHECK_EQ(ranges_.empty(), !metafile_);
-  if (metafile_) {
-    // The metafile should be the same across all calls for a given print job.
-    DCHECK_EQ(metafile_, metafile);
-  } else {
-    // Store |metafile| on the first call.
-    metafile_ = metafile;
-  }
-
-  PP_PrintPageNumberRange_Dev page_range = {static_cast<uint32_t>(page_number),
-                                            static_cast<uint32_t>(page_number)};
-  ranges_.push_back(page_range);
-#endif
-}
-
-void PepperPluginInstanceImpl::PrintEnd() {
-  // Keep a reference on the stack. See NOTE above.
-  scoped_refptr<PepperPluginInstanceImpl> ref(this);
-  DCHECK(plugin_print_interface_);
-
-  if (!ranges_.empty()) {
-    PP_Resource print_output = plugin_print_interface_->PrintPages(
-        pp_instance(), ranges_.data(), ranges_.size());
-    if (print_output) {
-      if (current_print_settings_.format == PP_PRINTOUTPUTFORMAT_PDF ||
-          current_print_settings_.format == PP_PRINTOUTPUTFORMAT_RASTER) {
-        PrintPDFOutput(print_output, metafile_);
-      }
-
-      // Now release the print output resource.
-      PluginModule::GetCore()->ReleaseResource(print_output);
-    }
-
-    ranges_.clear();
-    metafile_ = nullptr;
-  }
-
-  plugin_print_interface_->End(pp_instance());
-  memset(&current_print_settings_, 0, sizeof(current_print_settings_));
-}
-
-bool PepperPluginInstanceImpl::IsFullscreenOrPending() {
-  return desired_fullscreen_state_;
-}
-
-bool PepperPluginInstanceImpl::SetFullscreen(bool fullscreen) {
-  // Keep a reference on the stack. See NOTE above.
-  scoped_refptr<PepperPluginInstanceImpl> ref(this);
-
-  // Check whether we are trying to switch to the state we're already going
-  // to (i.e. if we're already switching to fullscreen but the fullscreen
-  // container isn't ready yet, don't do anything more).
-  if (fullscreen == IsFullscreenOrPending())
-    return false;
-
-  if (!render_frame_)
-    return false;
-
-  if (fullscreen) {
-    if (!render_frame_->GetWebView()
-             ->GetRendererPreferences()
-             .plugin_fullscreen_allowed) {
-      return false;
-    }
-
-    if (!HasTransientUserActivation())
-      return false;
-  }
-
-  // Check whether we are trying to switch while the state is in transition.
-  // The 2nd request gets dropped while messing up the internal state, so
-  // disallow this.
-  if (view_data_.is_fullscreen != desired_fullscreen_state_)
-    return false;
-
-  DVLOG(1) << "Setting fullscreen to " << (fullscreen ? "on" : "off");
-  desired_fullscreen_state_ = fullscreen;
-
-  if (fullscreen) {
-    // WebKit does not resize the plugin to fill the screen in fullscreen mode,
-    // so we will tweak plugin's attributes to support the expected behavior.
-    KeepSizeAttributesBeforeFullscreen();
-    SetSizeAttributesForFullscreen();
-    container_->RequestFullscreen();
-  } else {
-    container_->CancelFullscreen();
-  }
-  return true;
-}
-
-void PepperPluginInstanceImpl::UpdateLayer(bool force_creation) {
-  if (!container_)
-    return;
-
-  bool want_3d_layer = !!bound_graphics_3d_.get();
-  bool want_2d_layer = !!bound_graphics_2d_platform_;
-  bool want_texture_layer = want_3d_layer || want_2d_layer;
-
-  if (!force_creation && (want_texture_layer == !!texture_layer_) &&
-      (want_3d_layer == layer_is_hardware_)) {
-    UpdateLayerTransform();
-    return;
-  }
-
-  if (texture_layer_) {
-    container_->SetCcLayer(nullptr);
-    texture_layer_->ClearClient();
-    texture_layer_ = nullptr;
-  }
-
-  if (want_texture_layer) {
-    bool opaque = false;
-    if (want_3d_layer) {
-      DCHECK(bound_graphics_3d_.get());
-      texture_layer_ = cc::TextureLayer::Create(nullptr);
-      opaque = bound_graphics_3d_->IsOpaque();
-
-      PassCommittedTextureToTextureLayer();
-    } else {
-      DCHECK(bound_graphics_2d_platform_);
-      texture_layer_ = cc::TextureLayer::Create(this);
-      bound_graphics_2d_platform_->AttachedToNewLayer();
-      opaque = bound_graphics_2d_platform_->IsAlwaysOpaque();
-    }
-
-    // Ignore transparency in fullscreen.
-    texture_layer_->SetContentsOpaque(opaque);
-  }
-
-  if (texture_layer_) {
-    container_->SetCcLayer(texture_layer_.get());
-  }
-
-  layer_is_hardware_ = want_3d_layer;
-  UpdateLayerTransform();
-}
-
-bool PepperPluginInstanceImpl::PrepareTransferableResource(
-    viz::TransferableResource* transferable_resource,
-    viz::ReleaseCallback* release_callback) {
-  if (!bound_graphics_2d_platform_)
-    return false;
-  return bound_graphics_2d_platform_->PrepareTransferableResource(
-      transferable_resource, release_callback);
-}
-
-void PepperPluginInstanceImpl::OnDestruct() {
-  render_frame_ = nullptr;
-}
-
-void PepperPluginInstanceImpl::AddPluginObject(PluginObject* plugin_object) {
-  DCHECK(!base::Contains(live_plugin_objects_, plugin_object));
-  live_plugin_objects_.insert(plugin_object);
-}
-
-void PepperPluginInstanceImpl::RemovePluginObject(PluginObject* plugin_object) {
-  // Don't actually verify that the object is in the set since during module
-  // deletion we'll be in the process of freeing them.
-  live_plugin_objects_.erase(plugin_object);
-}
-
-bool PepperPluginInstanceImpl::HasTransientUserActivation() const {
-  return render_frame_->GetWebFrame()->HasTransientUserActivation();
-}
-
-void PepperPluginInstanceImpl::OnLockMouseACK(bool succeeded) {
-  if (TrackedCallback::IsPending(lock_mouse_callback_))
-    lock_mouse_callback_->Run(succeeded ? PP_OK : PP_ERROR_FAILED);
-}
-
-void PepperPluginInstanceImpl::OnMouseLockLost() {
-  if (LoadMouseLockInterface())
-    plugin_mouse_lock_interface_->MouseLockLost(pp_instance());
-}
-
-void PepperPluginInstanceImpl::HandleMouseLockedInputEvent(
-    const blink::WebMouseEvent& event) {
-  // |cursor| is ignored since it is hidden when the mouse is locked.
-  ui::Cursor cursor;
-  HandleInputEvent(event, &cursor);
-}
-
-void PepperPluginInstanceImpl::SimulateInputEvent(
-    const InputEventData& input_event) {
-  WebWidget* widget =
-      container()->GetDocument().GetFrame()->LocalRoot()->FrameWidget();
-  if (!widget) {
-    NOTREACHED();
-  }
-
-  bool handled = SimulateIMEEvent(input_event);
-  if (handled)
-    return;
-
-  std::vector<std::unique_ptr<WebInputEvent>> events =
-      CreateSimulatedWebInputEvents(
-          input_event, view_data_.rect.point.x + view_data_.rect.size.width / 2,
-          view_data_.rect.point.y + view_data_.rect.size.height / 2);
-  for (auto& event : events) {
-    widget->HandleInputEvent(
-        blink::WebCoalescedInputEvent(std::move(event), ui::LatencyInfo()));
-  }
-  if (input_event.event_type == PP_INPUTEVENT_TYPE_TOUCHSTART ||
-      input_event.event_type == PP_INPUTEVENT_TYPE_TOUCHMOVE ||
-      input_event.event_type == PP_INPUTEVENT_TYPE_TOUCHEND ||
-      input_event.event_type == PP_INPUTEVENT_TYPE_TOUCHCANCEL)
-    widget->DispatchBufferedTouchEvents();
-}
-
-bool PepperPluginInstanceImpl::SimulateIMEEvent(
-    const InputEventData& input_event) {
-  switch (input_event.event_type) {
-    case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START:
-    case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE:
-      SimulateImeSetCompositionEvent(input_event);
-      break;
-    case PP_INPUTEVENT_TYPE_IME_COMPOSITION_END:
-      DCHECK(input_event.character_text.empty());
-      SimulateImeSetCompositionEvent(input_event);
-      break;
-    case PP_INPUTEVENT_TYPE_IME_TEXT:
-      OnImeCommitText(base::UTF8ToUTF16(input_event.character_text),
-                      gfx::Range(), 0);
-      break;
-    default:
-      return false;
-  }
-  return true;
-}
-
-void PepperPluginInstanceImpl::SimulateImeSetCompositionEvent(
-    const InputEventData& input_event) {
-  std::vector<size_t> offsets;
-  offsets.push_back(input_event.composition_selection_start);
-  offsets.push_back(input_event.composition_selection_end);
-  offsets.insert(offsets.end(),
-                 input_event.composition_segment_offsets.begin(),
-                 input_event.composition_segment_offsets.end());
-
-  std::u16string utf16_text =
-      base::UTF8ToUTF16AndAdjustOffsets(input_event.character_text, &offsets);
-
-  std::vector<ui::ImeTextSpan> ime_text_spans;
-  for (size_t i = 2; i + 1 < offsets.size(); ++i) {
-    ui::ImeTextSpan ime_text_span;
-    ime_text_span.start_offset = offsets[i];
-    ime_text_span.end_offset = offsets[i + 1];
-    if (input_event.composition_target_segment == static_cast<int32_t>(i - 2))
-      ime_text_span.thickness = ui::ImeTextSpan::Thickness::kThick;
-    ime_text_spans.push_back(ime_text_span);
-  }
-
-  OnImeSetComposition(utf16_text, ime_text_spans, offsets[0], offsets[1]);
-}
-
-PP_Bool PepperPluginInstanceImpl::BindGraphics(PP_Instance instance,
-                                               PP_Resource device) {
-  TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::BindGraphics");
-  // The Graphics3D instance can't be destroyed until we call
-  // UpdateLayer().
-  scoped_refptr<ppapi::Resource> old_graphics = bound_graphics_3d_.get();
-  if (bound_graphics_3d_.get()) {
-    bound_graphics_3d_->BindToInstance(false);
-    bound_graphics_3d_ = nullptr;
-  }
-  if (bound_graphics_2d_platform_) {
-    bound_graphics_2d_platform_->BindToInstance(nullptr);
-    bound_graphics_2d_platform_ = nullptr;
-  }
-
-  // Special-case clearing the current device.
-  if (!device) {
-    UpdateLayer(true);
-    InvalidateRect(gfx::Rect());
-    return PP_TRUE;
-  }
-
-  // Refuse to bind if in transition to/from fullscreen with PPB_Fullscreen.
-  if (desired_fullscreen_state_ != view_data_.is_fullscreen)
-    return PP_FALSE;
-
-  const ppapi::host::PpapiHost* ppapi_host =
-      RendererPpapiHost::GetForPPInstance(instance)->GetPpapiHost();
-  ppapi::host::ResourceHost* host = ppapi_host->GetResourceHost(device);
-  PepperGraphics2DHost* graphics_2d = nullptr;
-  if (host) {
-    if (host->IsGraphics2DHost()) {
-      graphics_2d = static_cast<PepperGraphics2DHost*>(host);
-    } else {
-      DLOG(ERROR) <<
-          "Resource is not PepperCompositorHost or PepperGraphics2DHost.";
-    }
-  }
-
-  EnterResourceNoLock<PPB_Graphics3D_API> enter_3d(device, false);
-  PPB_Graphics3D_Impl* graphics_3d =
-      enter_3d.succeeded()
-          ? static_cast<PPB_Graphics3D_Impl*>(enter_3d.object())
-          : nullptr;
-
-  if (graphics_2d) {
-    if (graphics_2d->BindToInstance(this)) {
-      bound_graphics_2d_platform_ = graphics_2d;
-      bound_graphics_2d_platform_->set_viewport_to_dip_scale(
-          viewport_to_dip_scale_);
-      UpdateLayer(true);
-      return PP_TRUE;
-    }
-  } else if (graphics_3d) {
-    // Make sure graphics can only be bound to the instance it is
-    // associated with.
-    if (graphics_3d->pp_instance() == pp_instance() &&
-        graphics_3d->BindToInstance(true)) {
-      bound_graphics_3d_ = graphics_3d;
-      UpdateLayer(true);
-      return PP_TRUE;
-    }
-  }
-
-  // The instance cannot be bound or the device is not a valid resource type.
-  return PP_FALSE;
-}
-
-PP_Bool PepperPluginInstanceImpl::IsFullFrame(PP_Instance instance) {
-  return PP_FromBool(full_frame());
-}
-
-const ViewData* PepperPluginInstanceImpl::GetViewData(PP_Instance instance) {
-  return &view_data_;
-}
-
-PP_Var PepperPluginInstanceImpl::GetWindowObject(PP_Instance instance) {
-  if (!container_)
-    return PP_MakeUndefined();
-  V8VarConverter converter(pp_instance_, V8VarConverter::kAllowObjectVars);
-  PepperTryCatchVar try_catch(this, &converter, nullptr);
-  WebLocalFrame* frame = container_->GetDocument().GetFrame();
-  if (!frame) {
-    try_catch.SetException("No frame exists for window object.");
-    return PP_MakeUndefined();
-  }
-
-  ScopedPPVar result =
-      try_catch.FromV8(frame->MainWorldScriptContext()->Global());
-  DCHECK(!try_catch.HasException());
-  return result.Release();
-}
-
-PP_Var PepperPluginInstanceImpl::GetOwnerElementObject(PP_Instance instance) {
-  if (!container_)
-    return PP_MakeUndefined();
-  V8VarConverter converter(pp_instance_, V8VarConverter::kAllowObjectVars);
-  PepperTryCatchVar try_catch(this, &converter, nullptr);
-  ScopedPPVar result = try_catch.FromV8(container_->V8ObjectForElement());
-  DCHECK(!try_catch.HasException());
-  return result.Release();
-}
-
-PP_Var PepperPluginInstanceImpl::ExecuteScript(PP_Instance instance,
-                                               PP_Var script_var,
-                                               PP_Var* exception) {
-  if (!container_)
-    return PP_MakeUndefined();
-  if (is_deleted_ && blink::WebPluginScriptForbiddenScope::IsForbidden())
-    return PP_MakeUndefined();
-
-  // Executing the script may remove the plugin from the DOM, so we need to keep
-  // a reference to ourselves so that we can still process the result after
-  // running the script below.
-  scoped_refptr<PepperPluginInstanceImpl> ref(this);
-  V8VarConverter converter(pp_instance_, V8VarConverter::kAllowObjectVars);
-  PepperTryCatchVar try_catch(this, &converter, exception);
-
-  // Check for an exception due to the context being destroyed.
-  if (try_catch.HasException())
-    return PP_MakeUndefined();
-
-  WebLocalFrame* frame = container_->GetDocument().GetFrame();
-  if (!frame) {
-    try_catch.SetException("No frame to execute script in.");
-    return PP_MakeUndefined();
-  }
-
-  StringVar* script_string_var = StringVar::FromPPVar(script_var);
-  if (!script_string_var) {
-    try_catch.SetException("Script param to ExecuteScript must be a string.");
-    return PP_MakeUndefined();
-  }
-
-  std::string script_string = script_string_var->value();
-  blink::WebScriptSource script(
-      blink::WebString::FromUTF8(script_string.c_str()));
-  v8::Local<v8::Value> result;
-
-  result = frame->ExecuteScriptAndReturnValue(script);
-
-  ScopedPPVar var_result = try_catch.FromV8(result);
-  if (try_catch.HasException())
-    return PP_MakeUndefined();
-
-  return var_result.Release();
-}
-
-uint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputSampleRate(
-    PP_Instance instance) {
-  return render_frame()
-             ? blink::AudioDeviceFactory::GetInstance()
-                   ->GetOutputDeviceInfo(
-                       render_frame()->GetWebFrame()->GetLocalFrameToken(),
-                       std::string())
-                   .output_params()
-                   .sample_rate()
-             : 0;
-}
-
-uint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputBufferSize(
-    PP_Instance instance) {
-  return render_frame()
-             ? blink::AudioDeviceFactory::GetInstance()
-                   ->GetOutputDeviceInfo(
-                       render_frame()->GetWebFrame()->GetLocalFrameToken(),
-                       std::string())
-                   .output_params()
-                   .frames_per_buffer()
-             : 0;
-}
-
-PP_Var PepperPluginInstanceImpl::GetDefaultCharSet(PP_Instance instance) {
-  if (!render_frame_)
-    return PP_MakeUndefined();
-  return StringVar::StringToPPVar(render_frame_->GetWebFrame()
-                                      ->View()
-                                      ->GetWebPreferences()
-                                      .default_encoding);
-}
-
-PP_Bool PepperPluginInstanceImpl::IsFullscreen(PP_Instance instance) {
-  return PP_FromBool(view_data_.is_fullscreen);
-}
-
-PP_Bool PepperPluginInstanceImpl::SetFullscreen(PP_Instance instance,
-                                                PP_Bool fullscreen) {
-  return PP_FromBool(SetFullscreen(PP_ToBool(fullscreen)));
-}
-
-PP_Bool PepperPluginInstanceImpl::GetScreenSize(PP_Instance instance,
-                                                PP_Size* size) {
-  // All other cases: Report the screen size.
-  if (!render_frame_)
-    return PP_FALSE;
-  display::ScreenInfo info =
-      render_frame_->GetLocalRootWebFrameWidget()->GetScreenInfo();
-  *size = PP_MakeSize(info.rect.width(), info.rect.height());
-  return PP_TRUE;
-}
-
-ppapi::Resource* PepperPluginInstanceImpl::GetSingletonResource(
-    PP_Instance instance,
-    ppapi::SingletonResourceID id) {
-  // Some APIs aren't implemented in-process.
-  switch (id) {
-    case ppapi::BROWSER_FONT_SINGLETON_ID:
-    case ppapi::ISOLATED_FILESYSTEM_SINGLETON_ID:
-    case ppapi::NETWORK_PROXY_SINGLETON_ID:
-      NOTIMPLEMENTED();
-      return nullptr;
-    case ppapi::GAMEPAD_SINGLETON_ID:
-      return gamepad_impl_.get();
-    case ppapi::UMA_SINGLETON_ID: {
-      if (!uma_private_impl_.get()) {
-        RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host();
-        if (host_impl->in_process_router()) {
-          uma_private_impl_ = new ppapi::proxy::UMAPrivateResource(
-              host_impl->in_process_router()->GetPluginConnection(instance),
-              instance);
-        }
-      }
-      return uma_private_impl_.get();
-    }
-  }
-
-  NOTREACHED();
-}
-
-int32_t PepperPluginInstanceImpl::RequestInputEvents(PP_Instance instance,
-                                                     uint32_t event_classes) {
-  input_event_mask_ |= event_classes;
-  filtered_input_event_mask_ &= ~(event_classes);
-  RequestInputEventsHelper(event_classes);
-  return ValidateRequestInputEvents(false, event_classes);
-}
-
-int32_t PepperPluginInstanceImpl::RequestFilteringInputEvents(
-    PP_Instance instance,
-    uint32_t event_classes) {
-  filtered_input_event_mask_ |= event_classes;
-  input_event_mask_ &= ~(event_classes);
-  RequestInputEventsHelper(event_classes);
-  return ValidateRequestInputEvents(true, event_classes);
-}
-
-void PepperPluginInstanceImpl::ClearInputEventRequest(PP_Instance instance,
-                                                      uint32_t event_classes) {
-  input_event_mask_ &= ~(event_classes);
-  filtered_input_event_mask_ &= ~(event_classes);
-  RequestInputEventsHelper(event_classes);
-}
-
-void PepperPluginInstanceImpl::PostMessage(PP_Instance instance,
-                                           PP_Var message) {
-  PostMessageToJavaScript(message);
-}
-
-PP_Bool PepperPluginInstanceImpl::SetCursor(PP_Instance instance,
-                                            PP_MouseCursor_Type type,
-                                            PP_Resource image,
-                                            const PP_Point* hot_spot) {
-  if (!ValidateSetCursorParams(type, image, hot_spot))
-    return PP_FALSE;
-
-  if (type != PP_MOUSECURSOR_TYPE_CUSTOM) {
-    DoSetCursor(
-        std::make_unique<ui::Cursor>(static_cast<ui::mojom::CursorType>(type)));
-    return PP_TRUE;
-  }
-
-  EnterResourceNoLock<PPB_ImageData_API> enter(image, true);
-  if (enter.failed())
-    return PP_FALSE;
-  PPB_ImageData_Impl* image_data =
-      static_cast<PPB_ImageData_Impl*>(enter.object());
-
-  ImageDataAutoMapper auto_mapper(image_data);
-  if (!auto_mapper.is_valid())
-    return PP_FALSE;
-
-  SkBitmap bitmap(image_data->GetMappedBitmap());
-  // Make a deep copy, so that the cursor remains valid even after the original
-  // image data gets freed.
-  SkBitmap dst;
-  if (!dst.tryAllocPixels(bitmap.info()) ||
-      !bitmap.readPixels(dst.info(), dst.getPixels(), dst.rowBytes(), 0, 0)) {
-    return PP_FALSE;
-  }
-
-  DoSetCursor(std::make_unique<ui::Cursor>(ui::Cursor::NewCustom(
-      std::move(dst), gfx::Point(hot_spot->x, hot_spot->y))));
-  return PP_TRUE;
-}
-
-int32_t PepperPluginInstanceImpl::LockMouse(
-    PP_Instance instance,
-    scoped_refptr<TrackedCallback> callback) {
-  if (TrackedCallback::IsPending(lock_mouse_callback_))
-    return PP_ERROR_INPROGRESS;
-
-  if (IsMouseLocked())
-    return PP_OK;
-
-  if (!CanAccessMainFrame())
-    return PP_ERROR_NOACCESS;
-
-  if (!HasTransientUserActivation())
-    return PP_ERROR_NO_USER_GESTURE;
-
-  if (!LockMouse(false))
-    return PP_ERROR_FAILED;
-
-  lock_mouse_callback_ = callback;
-  return PP_OK_COMPLETIONPENDING;
-}
-
-void PepperPluginInstanceImpl::UnlockMouse(PP_Instance instance) {
-  container_->UnlockMouse();
-}
-
-void PepperPluginInstanceImpl::SetTextInputType(PP_Instance instance,
-                                                PP_TextInput_Type type) {
-  if (!render_frame_)
-    return;
-  int itype = type;
-  if (itype < 0 || itype > ui::TEXT_INPUT_TYPE_URL)
-    itype = ui::TEXT_INPUT_TYPE_NONE;
-  SetTextInputType(static_cast<ui::TextInputType>(itype));
-}
-
-void PepperPluginInstanceImpl::UpdateCaretPosition(
-    PP_Instance instance,
-    const PP_Rect& caret,
-    const PP_Rect& bounding_box) {
-  if (!render_frame_)
-    return;
-  PP_Rect caret_dip(caret), bounding_box_dip(bounding_box);
-  ConvertRectToDIP(&caret_dip);
-  ConvertRectToDIP(&bounding_box_dip);
-  TextInputCaretInfo info = {PP_ToGfxRect(caret_dip),
-                             PP_ToGfxRect(bounding_box_dip)};
-  text_input_caret_info_ = std::move(info);
-  render_frame_->PepperCaretPositionChanged(this);
-}
-
-void PepperPluginInstanceImpl::CancelCompositionText(PP_Instance instance) {
-  if (render_frame_)
-    render_frame_->PepperCancelComposition(this);
-}
-
-void PepperPluginInstanceImpl::SelectionChanged(PP_Instance instance) {
-  // TODO(kinaba): currently the browser always calls RequestSurroundingText.
-  // It can be optimized so that it won't call it back until the information
-  // is really needed.
-
-  // Avoid calling in nested context or else this will reenter the plugin. This
-  // uses a weak pointer rather than exploiting the fact that this class is
-  // refcounted because we don't actually want this operation to affect the
-  // lifetime of the instance.
-  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&PepperPluginInstanceImpl::RequestSurroundingText,
-                     weak_factory_.GetWeakPtr(),
-                     static_cast<size_t>(kExtraCharsForTextInput)));
-}
-
-void PepperPluginInstanceImpl::UpdateSurroundingText(PP_Instance instance,
-                                                     const char* text,
-                                                     uint32_t caret,
-                                                     uint32_t anchor) {
-  if (!render_frame_)
-    return;
-  surrounding_text_ = text;
-  selection_caret_ = caret;
-  selection_anchor_ = anchor;
-  render_frame_->PepperSelectionChanged(this);
-}
-
-PP_Var PepperPluginInstanceImpl::ResolveRelativeToDocument(
-    PP_Instance instance,
-    PP_Var relative,
-    PP_URLComponents_Dev* components) {
-  StringVar* relative_string = StringVar::FromPPVar(relative);
-  if (!relative_string)
-    return PP_MakeNull();
-
-  GURL document_url = container()->GetDocument().BaseURL();
-  return ppapi::PPB_URLUtil_Shared::GenerateURLReturn(
-      document_url.Resolve(relative_string->value()), components);
-}
-
-PP_Bool PepperPluginInstanceImpl::DocumentCanRequest(PP_Instance instance,
-                                                     PP_Var url) {
-  StringVar* url_string = StringVar::FromPPVar(url);
-  if (!url_string)
-    return PP_FALSE;
-
-  blink::WebSecurityOrigin security_origin;
-  if (!SecurityOriginForInstance(instance, &security_origin))
-    return PP_FALSE;
-
-  GURL gurl(url_string->value());
-  if (!gurl.is_valid())
-    return PP_FALSE;
-
-  return PP_FromBool(security_origin.CanRequest(gurl));
-}
-
-PP_Bool PepperPluginInstanceImpl::DocumentCanAccessDocument(
-    PP_Instance instance,
-    PP_Instance target) {
-  blink::WebSecurityOrigin our_origin;
-  if (!SecurityOriginForInstance(instance, &our_origin))
-    return PP_FALSE;
-
-  blink::WebSecurityOrigin target_origin;
-  if (!SecurityOriginForInstance(instance, &target_origin))
-    return PP_FALSE;
-
-  return PP_FromBool(our_origin.CanAccess(target_origin));
-}
-
-PP_Var PepperPluginInstanceImpl::GetDocumentURL(
-    PP_Instance instance,
-    PP_URLComponents_Dev* components) {
-  blink::WebDocument document = container()->GetDocument();
-  return ppapi::PPB_URLUtil_Shared::GenerateURLReturn(document.Url(),
-                                                      components);
-}
-
-PP_Var PepperPluginInstanceImpl::GetPluginInstanceURL(
-    PP_Instance instance,
-    PP_URLComponents_Dev* components) {
-  return ppapi::PPB_URLUtil_Shared::GenerateURLReturn(plugin_url_, components);
-}
-
-PP_Var PepperPluginInstanceImpl::GetPluginReferrerURL(
-    PP_Instance instance,
-    PP_URLComponents_Dev* components) {
-  blink::WebDocument document = container()->GetDocument();
-  if (!full_frame_)
-    return ppapi::PPB_URLUtil_Shared::GenerateURLReturn(document.Url(),
-                                                        components);
-  WebLocalFrame* frame = document.GetFrame();
-  if (!frame)
-    return PP_MakeUndefined();
-  WebString referer = frame->GetDocumentLoader()->OriginalReferrer();
-  if (referer.IsEmpty())
-    return PP_MakeUndefined();
-  return ppapi::PPB_URLUtil_Shared::GenerateURLReturn(
-      blink::WebStringToGURL(referer), components);
-}
-
-PP_ExternalPluginResult PepperPluginInstanceImpl::ResetAsProxied(
-    scoped_refptr<PluginModule> module) {
-  // Save the original module and switch over to the new one now that this
-  // plugin is using the IPC-based proxy.
-  original_module_ = module_;
-  module_ = module;
-
-  // For NaCl instances, remember the NaCl plugin instance interface, so we
-  // can shut it down by calling its DidDestroy in our Delete() method.
-  original_instance_interface_ = std::move(instance_interface_);
-
-  base::RepeatingCallback<const void*(const char*)> get_plugin_interface_func =
-      base::BindRepeating(&PluginModule::GetPluginInterface, module_);
-  PPP_Instance_Combined* ppp_instance_combined =
-      PPP_Instance_Combined::Create(std::move(get_plugin_interface_func));
-  if (!ppp_instance_combined) {
-    // The proxy must support at least one usable PPP_Instance interface.
-    // While this could be a failure to implement the interface in the NaCl
-    // module, it is more likely that the NaCl process has crashed. Either
-    // way, report that module initialization failed.
-    return PP_EXTERNAL_PLUGIN_ERROR_MODULE;
-  }
-
-  instance_interface_.reset(ppp_instance_combined);
-  // Clear all PPP interfaces we may have cached.
-  plugin_input_event_interface_ = nullptr;
-  checked_for_plugin_input_event_interface_ = false;
-  plugin_mouse_lock_interface_ = nullptr;
-  plugin_private_interface_ = nullptr;
-  plugin_textinput_interface_ = nullptr;
-
-  // Re-send the DidCreate event via the proxy.
-  std::unique_ptr<const char* []> argn_array(StringVectorToArgArray(argn_));
-  std::unique_ptr<const char* []> argv_array(StringVectorToArgArray(argv_));
-  if (!instance_interface_->DidCreate(
-          pp_instance(), argn_.size(), argn_array.get(), argv_array.get()))
-    return PP_EXTERNAL_PLUGIN_ERROR_INSTANCE;
-  if (message_channel_)
-    message_channel_->Start();
-
-  // Clear sent_initial_did_change_view_ and cancel any pending DidChangeView
-  // event. This way, SendDidChangeView will send the "current" view
-  // immediately (before other events like HandleDocumentLoad).
-  sent_initial_did_change_view_ = false;
-  view_change_weak_ptr_factory_.InvalidateWeakPtrs();
-  SendDidChangeView();
-
-  DCHECK(external_document_load_);
-  external_document_load_ = false;
-  if (!external_document_response_.IsNull()) {
-    document_loader_ = nullptr;
-    // Pass the response to the new proxy.
-    HandleDocumentLoad(external_document_response_);
-    external_document_response_ = blink::WebURLResponse();
-    // Replay any document load events we've received to the real loader.
-    external_document_loader_->ReplayReceivedData(document_loader_);
-    external_document_loader_.reset();
-  }
-
-  return PP_EXTERNAL_PLUGIN_OK;
-}
-
-bool PepperPluginInstanceImpl::IsValidInstanceOf(PluginModule* module) {
-  DCHECK(module);
-  return module == module_.get() || module == original_module_.get();
-}
-
-RenderFrame* PepperPluginInstanceImpl::GetRenderFrame() {
-  return render_frame_;
-}
-
-blink::WebPluginContainer* PepperPluginInstanceImpl::GetContainer() {
-  return container_;
-}
-
-v8::Isolate* PepperPluginInstanceImpl::GetIsolate() {
-  return isolate_;
-}
-
-ppapi::VarTracker* PepperPluginInstanceImpl::GetVarTracker() {
-  return HostGlobals::Get()->GetVarTracker();
-}
-
-const GURL& PepperPluginInstanceImpl::GetPluginURL() { return plugin_url_; }
-
-base::FilePath PepperPluginInstanceImpl::GetModulePath() {
-  return module_->path();
-}
-
-PP_Resource PepperPluginInstanceImpl::CreateImage(gfx::ImageSkia* source_image,
-                                                  float scale) {
-  gfx::ImageSkiaRep image_skia_rep = source_image->GetRepresentation(scale);
-
-  if (image_skia_rep.is_null() || image_skia_rep.scale() != scale)
-    return 0;
-
-  scoped_refptr<PPB_ImageData_Impl> image_data(
-      new PPB_ImageData_Impl(pp_instance(), PPB_ImageData_Impl::PLATFORM));
-  if (!image_data->Init(PPB_ImageData_Impl::GetNativeImageDataFormat(),
-                        image_skia_rep.pixel_width(),
-                        image_skia_rep.pixel_height(),
-                        false)) {
-    return 0;
-  }
-
-  ImageDataAutoMapper mapper(image_data.get());
-  if (!mapper.is_valid())
-    return 0;
-
-  SkCanvas* canvas = image_data->GetCanvas();
-  // Note: Do not SkBitmap::copyTo the canvas bitmap directly because it will
-  // ignore the allocated pixels in shared memory and re-allocate a new buffer.
-  canvas->writePixels(image_skia_rep.GetBitmap(), 0, 0);
-
-  return image_data->GetReference();
-}
-
-PP_ExternalPluginResult PepperPluginInstanceImpl::SwitchToOutOfProcessProxy(
-    const base::FilePath& file_path,
-    ppapi::PpapiPermissions permissions,
-    const IPC::ChannelHandle& channel_handle,
-    base::ProcessId plugin_pid,
-    int plugin_child_id) {
-  // Create a new module for each instance of the external plugin that is using
-  // the IPC based out-of-process proxy. We can't use the existing module,
-  // because it is configured for the in-process plugin, and we must keep it
-  // that way to allow the page to create other instances.
-  scoped_refptr<PluginModule> external_plugin_module(
-      module_->CreateModuleForExternalPluginInstance());
-
-  RendererPpapiHostImpl* renderer_ppapi_host =
-      external_plugin_module->CreateOutOfProcessModule(
-          render_frame_, file_path, permissions, channel_handle, plugin_pid,
-          plugin_child_id, true,
-          render_frame_->GetTaskRunner(blink::TaskType::kInternalDefault));
-  if (!renderer_ppapi_host) {
-    DLOG(ERROR) << "CreateExternalPluginModule() failed";
-    return PP_EXTERNAL_PLUGIN_ERROR_MODULE;
-  }
-
-  // Finally, switch the instance to the proxy.
-  return external_plugin_module->InitAsProxiedExternalPlugin(this);
-}
-
-void PepperPluginInstanceImpl::SetAlwaysOnTop(bool on_top) {
-  always_on_top_ = on_top;
-}
-
-void PepperPluginInstanceImpl::DoSetCursor(std::unique_ptr<ui::Cursor> cursor) {
-  if (is_deleted_)
-    return;
-
-  cursor_ = std::move(cursor);
-  if (render_frame_) {
-    // Update the cursor appearance immediately if the requesting plugin is the
-    // one which receives the last mouse event. Otherwise, the new cursor won't
-    // be picked up until the plugin gets the next input event. That is bad if,
-    // e.g., the plugin would like to set an invisible cursor when there isn't
-    // any user input for a while.
-    if (container()->WasTargetForLastMouseEvent()) {
-      render_frame_->GetLocalRootWebFrameWidget()->SetCursor(*cursor_);
-    }
-  }
-}
-
-bool PepperPluginInstanceImpl::IsFullPagePlugin() {
-  WebLocalFrame* frame = container()->GetDocument().GetFrame();
-  return frame->View()->MainFrame()->IsWebLocalFrame() &&
-         frame->View()
-             ->MainFrame()
-             ->ToWebLocalFrame()
-             ->GetDocument()
-             .IsPluginDocument();
-}
-
-bool PepperPluginInstanceImpl::IsRectTopmost(const gfx::Rect& rect) {
-  return container_->IsRectTopmost(rect);
-}
-
-int PepperPluginInstanceImpl::MakePendingFileRefRendererHost(
-    const base::FilePath& path) {
-  RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host();
-  PepperFileRefRendererHost* file_ref_host(
-      new PepperFileRefRendererHost(host_impl, pp_instance(), 0, path));
-  return host_impl->GetPpapiHost()->AddPendingResourceHost(
-      std::unique_ptr<ppapi::host::ResourceHost>(file_ref_host));
-}
-
-void PepperPluginInstanceImpl::SetEmbedProperty(PP_Var key, PP_Var value) {
-  if (message_channel_)
-    message_channel_->SetReadOnlyProperty(key, value);
-}
-
-bool PepperPluginInstanceImpl::CanAccessMainFrame() const {
-  if (!container_)
-    return false;
-  blink::WebDocument containing_document = container_->GetDocument();
-
-  if (!containing_document.GetFrame() ||
-      !containing_document.GetFrame()->View() ||
-      !containing_document.GetFrame()->View()->MainFrame()) {
-    return false;
-  }
-  blink::WebFrame* main_frame =
-      containing_document.GetFrame()->View()->MainFrame();
-
-  return containing_document.GetSecurityOrigin().CanAccess(
-      main_frame->GetSecurityOrigin());
-}
-
-void PepperPluginInstanceImpl::KeepSizeAttributesBeforeFullscreen() {
-  WebElement element = container_->GetElement();
-  width_before_fullscreen_ = element.GetAttribute(WebString::FromUTF8(kWidth));
-  height_before_fullscreen_ =
-      element.GetAttribute(WebString::FromUTF8(kHeight));
-  border_before_fullscreen_ =
-      element.GetAttribute(WebString::FromUTF8(kBorder));
-  style_before_fullscreen_ = element.GetAttribute(WebString::FromUTF8(kStyle));
-}
-
-void PepperPluginInstanceImpl::SetSizeAttributesForFullscreen() {
-  if (!render_frame_)
-    return;
-
-  display::ScreenInfo info =
-      render_frame_->GetLocalRootWebFrameWidget()->GetScreenInfo();
-  screen_size_for_fullscreen_ = info.rect.size();
-  std::string width = base::NumberToString(screen_size_for_fullscreen_.width());
-  std::string height =
-      base::NumberToString(screen_size_for_fullscreen_.height());
-
-  WebElement element = container_->GetElement();
-  element.SetAttribute(WebString::FromUTF8(kWidth), WebString::FromUTF8(width));
-  element.SetAttribute(WebString::FromUTF8(kHeight),
-                       WebString::FromUTF8(height));
-  element.SetAttribute(WebString::FromUTF8(kBorder), WebString::FromUTF8("0"));
-
-  // There should be no style settings that matter in fullscreen mode,
-  // so just replace them instead of appending.
-  // NOTE: "position: fixed" and "display: block" reset the plugin and
-  // using %% settings might not work without them (e.g. if the plugin is a
-  // child of a container element).
-  std::string style;
-  style += StringPrintf("width: %s !important; ", width.c_str());
-  style += StringPrintf("height: %s !important; ", height.c_str());
-  style += "margin: 0 !important; padding: 0 !important; border: 0 !important";
-  container_->GetElement().SetAttribute(kStyle, WebString::FromUTF8(style));
-}
-
-void PepperPluginInstanceImpl::ResetSizeAttributesAfterFullscreen() {
-  screen_size_for_fullscreen_ = gfx::Size();
-  WebElement element = container_->GetElement();
-  element.SetAttribute(WebString::FromUTF8(kWidth), width_before_fullscreen_);
-  element.SetAttribute(WebString::FromUTF8(kHeight), height_before_fullscreen_);
-  element.SetAttribute(WebString::FromUTF8(kBorder), border_before_fullscreen_);
-  element.SetAttribute(WebString::FromUTF8(kStyle), style_before_fullscreen_);
-}
-
-bool PepperPluginInstanceImpl::IsMouseLocked() {
-  return container_->IsMouseLocked();
-}
-
-bool PepperPluginInstanceImpl::LockMouse(bool request_unadjusted_movement) {
-  return container_->LockMouse(request_unadjusted_movement);
-}
-
-void PepperPluginInstanceImpl::DidDataFromWebURLResponse(
-    const blink::WebURLResponse& response,
-    int pending_host_id,
-    const ppapi::URLResponseInfoData& data) {
-  if (is_deleted_)
-    return;
-
-  RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host();
-
-  if (host_impl->in_process_router()) {
-    // Running in-process, we can just create the resource and call the
-    // PPP_Instance function directly.
-    scoped_refptr<ppapi::proxy::URLLoaderResource> loader_resource(
-        new ppapi::proxy::URLLoaderResource(
-            host_impl->in_process_router()->GetPluginConnection(pp_instance()),
-            pp_instance(),
-            pending_host_id,
-            data));
-
-    PP_Resource loader_pp_resource = loader_resource->GetReference();
-    if (!instance_interface_->HandleDocumentLoad(pp_instance(),
-                                                 loader_pp_resource))
-      loader_resource->Close();
-    // We don't pass a ref into the plugin, if it wants one, it will have taken
-    // an additional one.
-    ppapi::PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(
-        loader_pp_resource);
-  } else {
-    // Running out-of-process. Initiate an IPC call to notify the plugin
-    // process.
-    ppapi::proxy::HostDispatcher* dispatcher =
-        ppapi::proxy::HostDispatcher::GetForInstance(pp_instance());
-    dispatcher->Send(new PpapiMsg_PPPInstance_HandleDocumentLoad(
-        ppapi::API_ID_PPP_INSTANCE, pp_instance(), pending_host_id, data));
-  }
-}
-
-void PepperPluginInstanceImpl::ConvertRectToDIP(PP_Rect* rect) const {
-  rect->point.x *= viewport_to_dip_scale_;
-  rect->point.y *= viewport_to_dip_scale_;
-  rect->size.width *= viewport_to_dip_scale_;
-  rect->size.height *= viewport_to_dip_scale_;
-}
-
-void PepperPluginInstanceImpl::ConvertDIPToViewport(gfx::Rect* rect) const {
-  rect->set_x(rect->x() / viewport_to_dip_scale_);
-  rect->set_y(rect->y() / viewport_to_dip_scale_);
-  rect->set_width(rect->width() / viewport_to_dip_scale_);
-  rect->set_height(rect->height() / viewport_to_dip_scale_);
-}
-
-void PepperPluginInstanceImpl::IncrementTextureReferenceCount(
-    const viz::TransferableResource& resource) {
-  auto it = std::ranges::find(texture_ref_counts_, resource.mailbox(),
-                              &MailboxRefCount::first);
-  if (it == texture_ref_counts_.end()) {
-    texture_ref_counts_.emplace_back(resource.mailbox(), 1);
-    return;
-  }
-
-  it->second++;
-}
-
-bool PepperPluginInstanceImpl::DecrementTextureReferenceCount(
-    const viz::TransferableResource& resource) {
-  auto it = std::ranges::find(texture_ref_counts_, resource.mailbox(),
-                              &MailboxRefCount::first);
-  CHECK(it != texture_ref_counts_.end());
-
-  if (it->second == 1) {
-    texture_ref_counts_.erase(it);
-    return true;
-  }
-
-  it->second--;
-  return false;
-}
-
-bool PepperPluginInstanceImpl::IsTextureInUse(
-    const viz::TransferableResource& resource) const {
-  return base::Contains(texture_ref_counts_, resource.mailbox(),
-                        &MailboxRefCount::first);
-}
-
-void PepperPluginInstanceImpl::OnImeSetComposition(
-    const std::u16string& text,
-    const std::vector<ui::ImeTextSpan>& ime_text_spans,
-    int selection_start,
-    int selection_end) {
-  // When a PPAPI plugin has focus, we bypass blink core editing composition
-  // events.
-  if (!IsPluginAcceptingCompositionEvents()) {
-    composition_text_ = text;
-  } else {
-    // TODO(kinaba) currently all composition events are sent directly to
-    // plugins. Use DOM event mechanism after blink is made aware about
-    // plugins that support composition.
-    // The code below mimics the behavior of blink::Editor::setComposition.
-
-    // Empty -> nonempty: composition started.
-    if (composition_text_.empty() && !text.empty()) {
-      HandleCompositionStart(std::u16string());
-    }
-    // Nonempty -> empty: composition canceled.
-    if (!composition_text_.empty() && text.empty()) {
-      HandleCompositionEnd(std::u16string());
-    }
-    composition_text_ = text;
-    // Nonempty: composition is ongoing.
-    if (!composition_text_.empty()) {
-      HandleCompositionUpdate(composition_text_, ime_text_spans,
-                              selection_start, selection_end);
-    }
-  }
-}
-
-void PepperPluginInstanceImpl::OnImeCommitText(
-    const std::u16string& text,
-    const gfx::Range& replacement_range,
-    int relative_cursor_pos) {
-  HandlePepperImeCommit(text);
-}
-
-void PepperPluginInstanceImpl::OnImeFinishComposingText(bool keep_selection) {
-  const std::u16string& text = composition_text_;
-  HandlePepperImeCommit(text);
-}
-
-void PepperPluginInstanceImpl::HandlePepperImeCommit(
-    const std::u16string& text) {
-  if (text.empty())
-    return;
-
-  if (!IsPluginAcceptingCompositionEvents()) {
-    // For pepper plugins unable to handle IME events, send the plugin a
-    // sequence of characters instead.
-    size_t i = 0;
-    for (base::i18n::UTF16CharIterator iterator(text); iterator.Advance();) {
-      blink::WebKeyboardEvent char_event(blink::WebInputEvent::Type::kChar,
-                                         blink::WebInputEvent::kNoModifiers,
-                                         ui::EventTimeForNow());
-      char_event.windows_key_code = text[i];
-      char_event.native_key_code = text[i];
-
-      for (const size_t char_start = i; i < iterator.array_pos(); ++i) {
-        char_event.text[i - char_start] = text[i];
-        char_event.unmodified_text[i - char_start] = text[i];
-      }
-
-      ui::Cursor dummy_cursor_info;
-      HandleInputEvent(char_event, &dummy_cursor_info);
-    }
-  } else {
-    // Mimics the order of events sent by blink.
-    // See blink::Editor::setComposition() for the corresponding code.
-    HandleCompositionEnd(text);
-    HandleTextInput(text);
-  }
-  composition_text_.clear();
-}
-
-void PepperPluginInstanceImpl::SetVolume(double volume) {
-  audio_controller().SetVolume(volume);
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.h b/content/renderer/pepper/pepper_plugin_instance_impl.h
deleted file mode 100644
index 2b8d37c..0000000
--- a/content/renderer/pepper/pepper_plugin_instance_impl.h
+++ /dev/null
@@ -1,836 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_PLUGIN_INSTANCE_IMPL_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_PLUGIN_INSTANCE_IMPL_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <list>
-#include <memory>
-#include <optional>
-#include <set>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/functional/callback.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "build/build_config.h"
-#include "cc/layers/content_layer_client.h"
-#include "cc/layers/layer.h"
-#include "cc/layers/texture_layer_client.h"
-#include "cc/paint/paint_canvas.h"
-#include "components/viz/common/resources/transferable_resource.h"
-#include "content/common/content_export.h"
-#include "content/common/pepper_plugin.mojom.h"
-#include "content/public/renderer/pepper_plugin_instance.h"
-#include "content/public/renderer/render_frame.h"
-#include "content/public/renderer/render_frame_observer.h"
-#include "gin/handle.h"
-#include "mojo/public/cpp/bindings/associated_receiver.h"
-#include "mojo/public/cpp/bindings/associated_remote.h"
-#include "ppapi/c/dev/pp_cursor_type_dev.h"
-#include "ppapi/c/dev/ppp_printing_dev.h"
-#include "ppapi/c/dev/ppp_text_input_dev.h"
-#include "ppapi/c/pp_completion_callback.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/c/pp_time.h"
-#include "ppapi/c/pp_var.h"
-#include "ppapi/c/ppb_audio_config.h"
-#include "ppapi/c/ppb_gamepad.h"
-#include "ppapi/c/ppb_input_event.h"
-#include "ppapi/c/ppp_graphics_3d.h"
-#include "ppapi/c/ppp_input_event.h"
-#include "ppapi/c/ppp_mouse_lock.h"
-#include "ppapi/c/private/ppp_instance_private.h"
-#include "ppapi/shared_impl/ppb_instance_shared.h"
-#include "ppapi/shared_impl/ppb_view_shared.h"
-#include "ppapi/shared_impl/singleton_resource_id.h"
-#include "ppapi/shared_impl/tracked_callback.h"
-#include "ppapi/thunk/ppb_gamepad_api.h"
-#include "ppapi/thunk/resource_creation_api.h"
-#include "third_party/blink/public/platform/web_string.h"
-#include "third_party/blink/public/platform/web_url_response.h"
-#include "third_party/blink/public/web/web_associated_url_loader_client.h"
-#include "third_party/blink/public/web/web_plugin.h"
-#include "ui/accessibility/ax_mode.h"
-#include "ui/base/cursor/cursor.h"
-#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
-#include "ui/base/ime/text_input_type.h"
-#include "ui/gfx/geometry/rect.h"
-#include "url/gurl.h"
-#include "v8/include/v8-forward.h"
-#include "v8/include/v8-persistent-handle.h"
-
-struct PP_Point;
-
-namespace blink {
-class WebCoalescedInputEvent;
-class WebInputEvent;
-class WebMouseEvent;
-class WebPluginContainer;
-class WebURLResponse;
-struct WebURLError;
-struct WebPrintParams;
-}  // namespace blink
-
-namespace cc {
-class TextureLayer;
-}
-
-namespace gfx {
-class Range;
-class Rect;
-}
-
-namespace ppapi {
-class Resource;
-struct InputEventData;
-struct PPP_Instance_Combined;
-struct URLResponseInfoData;
-class ScopedPPVar;
-}
-
-namespace printing {
-class MetafileSkia;
-}
-
-namespace content {
-
-class MessageChannel;
-class PepperAudioController;
-class PepperGraphics2DHost;
-class PluginModule;
-class PluginObject;
-class PPB_Graphics3D_Impl;
-class RenderFrameImpl;
-
-// Represents one time a plugin appears on one web page.
-//
-// Note: to get from a PP_Instance to a PepperPluginInstance*, use the
-// ResourceTracker.
-class CONTENT_EXPORT PepperPluginInstanceImpl
-    : public base::RefCounted<PepperPluginInstanceImpl>,
-      public PepperPluginInstance,
-      public ppapi::PPB_Instance_Shared,
-      public cc::TextureLayerClient,
-      public RenderFrameObserver,
-      public mojom::PepperPluginInstance {
- public:
-  // Create and return a PepperPluginInstanceImpl object which supports the most
-  // recent version of PPP_Instance possible by querying the given
-  // get_plugin_interface function. If the plugin does not support any valid
-  // PPP_Instance interface, returns NULL.
-  static PepperPluginInstanceImpl* Create(RenderFrameImpl* render_frame,
-                                          PluginModule* module,
-                                          blink::WebPluginContainer* container,
-                                          const GURL& plugin_url,
-                                          v8::Isolate* isolate);
-
-  // Return the PepperPluginInstanceImpl for the given |instance_id|. Will
-  // return the instance even if it is in the process of being deleted.
-  // Currently only used in tests.
-  static PepperPluginInstanceImpl* GetForTesting(PP_Instance instance_id);
-
-  PepperPluginInstanceImpl(const PepperPluginInstanceImpl&) = delete;
-  PepperPluginInstanceImpl& operator=(const PepperPluginInstanceImpl&) = delete;
-
-  // Returns the associated RenderFrameImpl. Can be null (in tests) or if the
-  // frame has been destroyed.
-  RenderFrameImpl* render_frame() const { return render_frame_; }
-  PluginModule* module() const { return module_.get(); }
-
-  // Returns the associated mojo host channel to the browser. Can be null if
-  // `render_frame()` returns null.
-  mojom::PepperPluginInstanceHost* GetPepperPluginInstanceHost() {
-    return pepper_host_remote_.get();
-  }
-
-  blink::WebPluginContainer* container() const { return container_; }
-
-  // Returns the PP_Instance uniquely identifying this instance. Guaranteed
-  // nonzero.
-  PP_Instance pp_instance() const { return pp_instance_; }
-
-  ppapi::thunk::ResourceCreationAPI& resource_creation() {
-    return *resource_creation_.get();
-  }
-
-  MessageChannel* message_channel() { return message_channel_; }
-  v8::Local<v8::Object> GetMessageChannelObject();
-  // Called when |message_channel_| is destroyed as it may be destroyed prior to
-  // the plugin being destroyed.
-  void MessageChannelDestroyed();
-
-  // Return the v8 context for the frame that the plugin is contained in. Care
-  // should be taken to use the correct context for plugin<->JS interactions.
-  // In cases where JS calls into the plugin, the caller's context should
-  // typically be used. When calling from the plugin into JS, this context
-  // should typically used.
-  v8::Local<v8::Context> GetMainWorldContext();
-
-  // Does some pre-destructor cleanup on the instance. This is necessary
-  // because some cleanup depends on the plugin instance still existing (like
-  // calling the plugin's DidDestroy function). This function is called from
-  // the WebPlugin implementation when WebKit is about to remove the plugin.
-  void Delete();
-
-  // Returns true if Delete() has been called on this object.
-  bool is_deleted() const;
-
-  GURL document_url() const { return document_url_; }
-
-  // Paints the current backing store to the web page.
-  void Paint(cc::PaintCanvas* canvas,
-             const gfx::Rect& plugin_rect,
-             const gfx::Rect& paint_rect);
-
-  // Schedules a paint of the page for the given region. The coordinates are
-  // relative to the top-left of the plugin. This does nothing if the plugin
-  // has not yet been positioned. You can supply an empty gfx::Rect() to
-  // invalidate the entire plugin.
-  void InvalidateRect(const gfx::Rect& rect);
-
-  // Schedules a scroll of the plugin.  This uses optimized scrolling only for
-  // full-frame plugins, as otherwise there could be other elements on top.  The
-  // slow path can also be triggered if there is an overlapping frame.
-  void ScrollRect(int dx, int dy, const gfx::Rect& rect);
-
-  // Commit the output to the screen.
-  void CommitTransferableResource(const viz::TransferableResource& resource);
-
-  // Passes the committed texture to |texture_layer_| and marks it as in use.
-  void PassCommittedTextureToTextureLayer();
-
-  // Callback when the compositor is finished consuming the committed texture.
-  void FinishedConsumingCommittedTexture(
-      const viz::TransferableResource& resource,
-      scoped_refptr<PPB_Graphics3D_Impl> graphics_3d,
-      const gpu::SyncToken& sync_token,
-      bool is_lost);
-
-  // Called when the out-of-process plugin implementing this instance crashed.
-  void InstanceCrashed();
-
-  // PPB_Instance and PPB_Instance_Private implementation.
-  bool full_frame() const { return full_frame_; }
-  const ppapi::ViewData& view_data() const { return view_data_; }
-
-  // PPP_Instance and PPP_Instance_Private.
-  bool Initialize(const std::vector<std::string>& arg_names,
-                  const std::vector<std::string>& arg_values,
-                  bool full_frame);
-  bool HandleDocumentLoad(const blink::WebURLResponse& response);
-  bool HandleCoalescedInputEvent(const blink::WebCoalescedInputEvent& event,
-                                 ui::Cursor* cursor);
-  bool HandleInputEvent(const blink::WebInputEvent& event, ui::Cursor* cursor);
-  PP_Var GetInstanceObject(v8::Isolate* isolate);
-  void ViewChanged(const gfx::Rect& window,
-                   const gfx::Rect& clip,
-                   const gfx::Rect& unobscured);
-
-  // Handlers for composition events.
-  void OnImeSetComposition(const std::u16string& text,
-                           const std::vector<ui::ImeTextSpan>& ime_text_spans,
-                           int selection_start,
-                           int selection_end);
-  void OnImeCommitText(const std::u16string& text,
-                       const gfx::Range& replacement_range,
-                       int relative_cursor_pos);
-  void OnImeFinishComposingText(bool keep_selection);
-  void HandlePepperImeCommit(const std::u16string& text);
-  bool HandleCompositionStart(const std::u16string& text);
-  bool HandleCompositionUpdate(
-      const std::u16string& text,
-      const std::vector<ui::ImeTextSpan>& ime_text_spans,
-      int selection_start,
-      int selection_end);
-  bool HandleCompositionEnd(const std::u16string& text);
-  bool HandleTextInput(const std::u16string& text);
-
-  // Gets the current text input status.
-  ui::TextInputType text_input_type() const { return text_input_type_; }
-  gfx::Rect GetCaretBounds() const;
-  bool IsPluginAcceptingCompositionEvents() const;
-  void GetSurroundingText(std::u16string* text, gfx::Range* range) const;
-
-  // Notifications about focus changes, see has_webkit_focus_ below.
-  void SetWebKitFocus(bool has_focus);
-
-  // Notification about page visibility. The default is "visible".
-  void PageVisibilityChanged(bool is_visible);
-
-  // Notifications that the view has started painting. This message is used to
-  // send Flush callbacks to the plugin for Graphics2D/3D.
-  void ViewInitiatedPaint();
-
-  // Tracks all live PluginObjects.
-  void AddPluginObject(PluginObject* plugin_object);
-  void RemovePluginObject(PluginObject* plugin_object);
-
-  std::u16string GetSelectedText(bool html);
-  void RequestSurroundingText(size_t desired_number_of_characters);
-
-  bool SupportsPrintInterface();
-  int PrintBegin(const blink::WebPrintParams& print_params);
-  void PrintPage(int page_number, cc::PaintCanvas* canvas);
-  void PrintEnd();
-
-  // Implementation of PPB_Fullscreen.
-
-  // Because going to/from fullscreen is asynchronous, there are 4 states:
-  // - normal            : desired_fullscreen_state_ == false
-  //                       view_data_.is_fullscreen == false
-  // - fullscreen pending: desired_fullscreen_state_ == true
-  //                       view_data_.is_fullscreen == false
-  // - fullscreen        : desired_fullscreen_state_ == true
-  //                       view_data_.is_fullscreen == true
-  // - normal pending    : desired_fullscreen_state_ = false
-  //                       view_data_.is_fullscreen = true
-  bool IsFullscreenOrPending();
-
-  // Switches between fullscreen and normal mode. The transition is
-  // asynchronous. WebKit will trigger corresponding ViewChanged calls.  Returns
-  // true on success, false on failure (e.g. trying to enter fullscreen without
-  // user activation or trying to set fullscreen when already in fullscreen
-  // mode).
-  bool SetFullscreen(bool fullscreen);
-
-  // Send the message on to the plugin.
-  void HandleMessage(ppapi::ScopedPPVar message);
-
-  // Send the message synchronously to the plugin, and get a result. Returns
-  // true if the plugin handled the message, false if it didn't. The plugin
-  // won't handle the message if it has not registered a PPP_MessageHandler.
-  bool HandleBlockingMessage(ppapi::ScopedPPVar message,
-                             ppapi::ScopedPPVar* result);
-
-  // Returns true if the plugin has transient user activation.
-  bool HasTransientUserActivation() const;
-
-  // A mouse lock request was pending and this reports success or failure.
-  void OnLockMouseACK(bool succeeded);
-  // A mouse lock was in place, but has been lost.
-  void OnMouseLockLost();
-  // A mouse lock is enabled and mouse events are being delivered.
-  void HandleMouseLockedInputEvent(const blink::WebMouseEvent& event);
-
-  // Simulates an input event to the plugin by passing it down to WebKit,
-  // which sends it back up to the plugin as if it came from the user.
-  void SimulateInputEvent(const ppapi::InputEventData& input_event);
-
-  // Simulates an IME event at the level of `blink::WebView` which sends it back
-  // up to the plugin as if it came from the user.
-  bool SimulateIMEEvent(const ppapi::InputEventData& input_event);
-  void SimulateImeSetCompositionEvent(const ppapi::InputEventData& input_event);
-
-  // The document loader is valid when the plugin is "full-frame" and in this
-  // case is non-NULL as long as the corresponding loader resource is alive.
-  // This pointer is non-owning, so the loader must use set_document_loader to
-  // clear itself when it is destroyed.
-  blink::WebAssociatedURLLoaderClient* document_loader() const {
-    return document_loader_;
-  }
-  void set_document_loader(blink::WebAssociatedURLLoaderClient* loader) {
-    document_loader_ = loader;
-  }
-
-  void SetGraphics2DTransform(const float& scale,
-                              const gfx::PointF& translation);
-
-  // PluginInstance implementation
-  RenderFrame* GetRenderFrame() override;
-  blink::WebPluginContainer* GetContainer() override;
-  v8::Isolate* GetIsolate() override;
-  ppapi::VarTracker* GetVarTracker() override;
-  const GURL& GetPluginURL() override;
-  base::FilePath GetModulePath() override;
-  PP_Resource CreateImage(gfx::ImageSkia* source_image, float scale) override;
-  PP_ExternalPluginResult SwitchToOutOfProcessProxy(
-      const base::FilePath& file_path,
-      ppapi::PpapiPermissions permissions,
-      const IPC::ChannelHandle& channel_handle,
-      base::ProcessId plugin_pid,
-      int plugin_child_id) override;
-  void SetAlwaysOnTop(bool on_top) override;
-  bool IsFullPagePlugin() override;
-  bool IsRectTopmost(const gfx::Rect& rect) override;
-  int MakePendingFileRefRendererHost(const base::FilePath& path) override;
-  void SetEmbedProperty(PP_Var key, PP_Var value) override;
-  void SetSelectedText(const std::u16string& selected_text) override;
-  void SetLinkUnderCursor(const std::string& url) override;
-  void SetTextInputType(ui::TextInputType type) override;
-  void PostMessageToJavaScript(PP_Var message) override;
-
-  // PPB_Instance_API implementation.
-  PP_Bool BindGraphics(PP_Instance instance, PP_Resource device) override;
-  PP_Bool IsFullFrame(PP_Instance instance) override;
-  const ppapi::ViewData* GetViewData(PP_Instance instance) override;
-  PP_Var GetWindowObject(PP_Instance instance) override;
-  PP_Var GetOwnerElementObject(PP_Instance instance) override;
-  PP_Var ExecuteScript(PP_Instance instance,
-                       PP_Var script,
-                       PP_Var* exception) override;
-  uint32_t GetAudioHardwareOutputSampleRate(PP_Instance instance) override;
-  uint32_t GetAudioHardwareOutputBufferSize(PP_Instance instance) override;
-  PP_Var GetDefaultCharSet(PP_Instance instance) override;
-  PP_Bool IsFullscreen(PP_Instance instance) override;
-  PP_Bool SetFullscreen(PP_Instance instance, PP_Bool fullscreen) override;
-  PP_Bool GetScreenSize(PP_Instance instance, PP_Size* size) override;
-  ppapi::Resource* GetSingletonResource(PP_Instance instance,
-                                        ppapi::SingletonResourceID id) override;
-  int32_t RequestInputEvents(PP_Instance instance,
-                             uint32_t event_classes) override;
-  int32_t RequestFilteringInputEvents(PP_Instance instance,
-                                      uint32_t event_classes) override;
-  void ClearInputEventRequest(PP_Instance instance,
-                              uint32_t event_classes) override;
-  void PostMessage(PP_Instance instance, PP_Var message) override;
-  int32_t RegisterMessageHandler(PP_Instance instance,
-                                 void* user_data,
-                                 const PPP_MessageHandler_0_2* handler,
-                                 PP_Resource message_loop) override;
-  void UnregisterMessageHandler(PP_Instance instance) override;
-  PP_Bool SetCursor(PP_Instance instance,
-                    PP_MouseCursor_Type type,
-                    PP_Resource image,
-                    const PP_Point* hot_spot) override;
-  int32_t LockMouse(PP_Instance instance,
-                    scoped_refptr<ppapi::TrackedCallback> callback) override;
-  void UnlockMouse(PP_Instance instance) override;
-  void SetTextInputType(PP_Instance instance, PP_TextInput_Type type) override;
-  void UpdateCaretPosition(PP_Instance instance,
-                           const PP_Rect& caret,
-                           const PP_Rect& bounding_box) override;
-  void CancelCompositionText(PP_Instance instance) override;
-  void SelectionChanged(PP_Instance instance) override;
-  void UpdateSurroundingText(PP_Instance instance,
-                             const char* text,
-                             uint32_t caret,
-                             uint32_t anchor) override;
-  PP_Var ResolveRelativeToDocument(PP_Instance instance,
-                                   PP_Var relative,
-                                   PP_URLComponents_Dev* components) override;
-  PP_Bool DocumentCanRequest(PP_Instance instance, PP_Var url) override;
-  PP_Bool DocumentCanAccessDocument(PP_Instance instance,
-                                    PP_Instance target) override;
-  PP_Var GetDocumentURL(PP_Instance instance,
-                        PP_URLComponents_Dev* components) override;
-  PP_Var GetPluginInstanceURL(PP_Instance instance,
-                              PP_URLComponents_Dev* components) override;
-  PP_Var GetPluginReferrerURL(PP_Instance instance,
-                              PP_URLComponents_Dev* components) override;
-
-  // Reset this instance as proxied. Assigns the instance a new module, resets
-  // cached interfaces to point to the out-of-process proxy and re-sends
-  // DidCreate, DidChangeView, and HandleDocumentLoad (if necessary).
-  // This should be used only when switching an in-process instance to an
-  // external out-of-process instance.
-  PP_ExternalPluginResult ResetAsProxied(scoped_refptr<PluginModule> module);
-
-  // Checks whether this is a valid instance of the given module. After calling
-  // ResetAsProxied above, a NaCl plugin instance's module changes, so external
-  // hosts won't recognize it as a valid instance of the original module. This
-  // method fixes that be checking that either module_ or original_module_ match
-  // the given module.
-  bool IsValidInstanceOf(PluginModule* module);
-
-  // cc::TextureLayerClient implementation.
-  bool PrepareTransferableResource(
-      viz::TransferableResource* transferable_resource,
-      viz::ReleaseCallback* release_callback) override;
-
-  // RenderFrameObserver
-  void OnDestruct() override;
-
-  PepperAudioController& audio_controller() {
-    return *audio_controller_;
-  }
-
- private:
-  friend class base::RefCounted<PepperPluginInstanceImpl>;
-  friend class PpapiPluginInstanceTest;
-  friend class PpapiUnittest;
-
-  // Delete should be called by the WebPlugin before this destructor.
-  ~PepperPluginInstanceImpl() override;
-
-  // mojom::PepperPluginInstance overrides:
-  void SetVolume(double volume) override;
-
-  // Class to record document load notifications and play them back once the
-  // real document loader becomes available. Used only by external instances.
-  class ExternalDocumentLoader : public blink::WebAssociatedURLLoaderClient {
-   public:
-    ExternalDocumentLoader();
-
-    ExternalDocumentLoader(const ExternalDocumentLoader&) = delete;
-    ExternalDocumentLoader& operator=(const ExternalDocumentLoader&) = delete;
-
-    ~ExternalDocumentLoader() override;
-
-    void ReplayReceivedData(WebAssociatedURLLoaderClient* document_loader);
-
-    // blink::WebAssociatedURLLoaderClient implementation.
-    void DidReceiveData(base::span<const char> data) override;
-    void DidFinishLoading() override;
-    void DidFail(const blink::WebURLError& error) override;
-
-   private:
-    std::list<std::string> data_;
-    bool finished_loading_;
-    std::unique_ptr<blink::WebURLError> error_;
-  };
-
-  // Implements PPB_Gamepad_API. This is just to avoid having an excessive
-  // number of interfaces implemented by PepperPluginInstanceImpl.
-  class GamepadImpl : public ppapi::thunk::PPB_Gamepad_API,
-                      public ppapi::Resource {
-   public:
-    GamepadImpl();
-    // Resource implementation.
-    ppapi::thunk::PPB_Gamepad_API* AsPPB_Gamepad_API() override;
-    void Sample(PP_Instance instance, PP_GamepadsSampleData* data) override;
-
-   private:
-    ~GamepadImpl() override;
-  };
-
-  // See the static Create functions above for creating PepperPluginInstanceImpl
-  // objects. This constructor is private so that we can hide the
-  // PPP_Instance_Combined details while still having 1 constructor to maintain
-  // for member initialization.
-  PepperPluginInstanceImpl(RenderFrameImpl* render_frame,
-                           PluginModule* module,
-                           ppapi::PPP_Instance_Combined* instance_interface,
-                           blink::WebPluginContainer* container,
-                           const GURL& plugin_url,
-                           v8::Isolate* isolate);
-
-  bool LoadInputEventInterface();
-  bool LoadMouseLockInterface();
-  bool LoadPrintInterface();
-  bool LoadPrivateInterface();
-  bool LoadTextInputInterface();
-
-  // Update any transforms that should be applied to the texture layer.
-  void UpdateLayerTransform();
-
-  // Determines if we think the plugin has focus, both content area and webkit
-  // (see has_webkit_focus_ below).
-  bool PluginHasFocus() const;
-  void SendFocusChangeNotification();
-
-  void UpdateTouchEventRequest();
-  void UpdateWheelEventRequest();
-
-  void ScheduleAsyncDidChangeView();
-  void SendAsyncDidChangeView();
-  void SendDidChangeView();
-
-  // Reports the current plugin geometry to the plugin by calling
-  // DidChangeView.
-  void ReportGeometry();
-
-  // Queries the plugin for supported print formats and sets |format| to the
-  // best format to use. Returns false if the plugin does not support any
-  // print format that we can handle (we can handle only PDF).
-  bool GetPreferredPrintOutputFormat(PP_PrintOutputFormat_Dev* format,
-                                     const blink::WebPrintParams& params);
-
-  // Updates the layer for compositing. This creates a layer and attaches to the
-  // container if:
-  // - we have a bound Graphics3D and the Graphics3D has a texture, OR
-  //   we have a bound Graphics2D and are using software compositing
-  // - we are not in full-screen mode (or transitioning to it)
-  // Otherwise it destroys the layer.
-  // It does either operation lazily.
-  // force_creation: Force UpdateLayer() to recreate the layer and attaches
-  //   to the container. Set to true if the bound device has been changed.
-  void UpdateLayer(bool force_creation);
-
-  void DoSetCursor(std::unique_ptr<ui::Cursor> cursor);
-
-  // Internal helper functions for HandleCompositionXXX().
-  bool SendCompositionEventToPlugin(PP_InputEvent_Type type,
-                                    const std::u16string& text);
-  bool SendCompositionEventWithImeTextSpanInformationToPlugin(
-      PP_InputEvent_Type type,
-      const std::u16string& text,
-      const std::vector<ui::ImeTextSpan>& ime_text_spans,
-      int selection_start,
-      int selection_end);
-
-  // Internal helper function for XXXInputEvents().
-  void RequestInputEventsHelper(uint32_t event_classes);
-
-  // Checks if the security origin of the document containing this instance can
-  // assess the security origin of the main frame document.
-  bool CanAccessMainFrame() const;
-
-  // Track, set and reset size attributes to control the size of the plugin
-  // in and out of fullscreen mode.
-  void KeepSizeAttributesBeforeFullscreen();
-  void SetSizeAttributesForFullscreen();
-  void ResetSizeAttributesAfterFullscreen();
-
-  bool IsMouseLocked();
-  bool LockMouse(bool request_unadjusted_movement);
-
-  void DidDataFromWebURLResponse(const blink::WebURLResponse& response,
-                                 int pending_host_id,
-                                 const ppapi::URLResponseInfoData& data);
-
-  // Converts the PP_Rect between DIP and Viewport.
-  void ConvertRectToDIP(PP_Rect* rect) const;
-  void ConvertDIPToViewport(gfx::Rect* rect) const;
-
-  // Each time CommitTransferableResource() is called, this instance is given
-  // ownership of a texture and gpu::Mailbox. This instance always needs to hold
-  // on to the most recently committed texture, since UpdateLayer() might
-  // require it. Since it is possible for a gpu::Mailbox to be passed to
-  // |texture_layer_| more than once, a reference counting mechanism is
-  // necessary to ensure that a texture isn't returned until all copies of
-  // it have been released by texture_layer_.
-  //
-  // This method should be called each time a viz::TransferableResource is
-  // passed to |texture_layer_|. It increments an internal reference count.
-  void IncrementTextureReferenceCount(
-      const viz::TransferableResource& resource);
-
-  // This method should be called each time |texture_layer_| finishes consuming
-  // a viz::TransferableResource. It decrements an internal reference count.
-  // Returns whether the last reference was removed.
-  bool DecrementTextureReferenceCount(
-      const viz::TransferableResource& resource);
-
-  // Whether a given viz::TransferableResource is in use by |texture_layer_|.
-  bool IsTextureInUse(const viz::TransferableResource& resource) const;
-
-  raw_ptr<RenderFrameImpl> render_frame_;
-  scoped_refptr<PluginModule> module_;
-  std::unique_ptr<ppapi::PPP_Instance_Combined> instance_interface_;
-  // If this is the NaCl plugin, we create a new module when we switch to the
-  // IPC-based PPAPI proxy. Store the original module and instance interface
-  // so we can shut down properly.
-  scoped_refptr<PluginModule> original_module_;
-  std::unique_ptr<ppapi::PPP_Instance_Combined> original_instance_interface_;
-
-  PP_Instance pp_instance_;
-
-  // These are the scale and the translation that will be applied to the layer.
-  gfx::PointF graphics2d_translation_;
-  float graphics2d_scale_;
-
-  // NULL until we have been initialized.
-  raw_ptr<blink::WebPluginContainer> container_;
-  scoped_refptr<cc::TextureLayer> texture_layer_;
-  bool layer_is_hardware_;
-
-  // Plugin URL.
-  const GURL plugin_url_;
-
-  GURL document_url_;
-
-  // Set to true the first time the plugin is clicked. Used to collect metrics.
-  bool has_been_clicked_;
-
-  // Indicates whether this is a full frame instance, which means it represents
-  // an entire document rather than an embed tag.
-  bool full_frame_;
-
-  // Stores the current state of the plugin view.
-  ppapi::ViewData view_data_;
-  // The last state sent to the plugin. It is only valid after
-  // |sent_initial_did_change_view_| is set to true.
-  ppapi::ViewData last_sent_view_data_;
-  // The current unobscured portion of the plugin.
-  gfx::Rect unobscured_rect_;
-  // The viewport coordinates to window coordinates ratio.
-  float viewport_to_dip_scale_;
-
-  // Indicates if we've ever sent a didChangeView to the plugin. This ensures we
-  // always send an initial notification, even if the position and clip are the
-  // same as the default values.
-  bool sent_initial_did_change_view_;
-
-  // The current device context for painting in 2D or 3D.
-  scoped_refptr<PPB_Graphics3D_Impl> bound_graphics_3d_;
-  raw_ptr<PepperGraphics2DHost> bound_graphics_2d_platform_;
-
-  // Whether the plugin has focus or not.
-  bool has_webkit_focus_;
-
-  // The id of the current find operation, or -1 if none is in process.
-  int find_identifier_;
-
-  // Helper object that creates resources.
-  std::unique_ptr<ppapi::thunk::ResourceCreationAPI> resource_creation_;
-
-  // The plugin-provided interfaces.
-  // When adding PPP interfaces, make sure to reset them in ResetAsProxied.
-  raw_ptr<const PPP_InputEvent> plugin_input_event_interface_;
-  raw_ptr<const PPP_MouseLock> plugin_mouse_lock_interface_;
-  raw_ptr<const PPP_Instance_Private> plugin_private_interface_;
-  raw_ptr<const PPP_TextInput_Dev> plugin_textinput_interface_;
-
-  // Flags indicating whether we have asked this plugin instance for the
-  // corresponding interfaces, so that we can ask only once.
-  // When adding flags, make sure to reset them in ResetAsProxied.
-  bool checked_for_plugin_input_event_interface_;
-
-  // This is only valid between a successful PrintBegin call and a PrintEnd
-  // call.
-  PP_PrintSettings_Dev current_print_settings_;
-
-  // The entire document goes into one metafile. However, it is impossible to
-  // know if a call to PrintPage() is the last call. Thus in PrintPage(), just
-  // store the page number in |ranges_|. The hack is in PrintEnd(), where a
-  // valid |metafile_| is preserved in PrintWebFrameHelper::PrintPages(). This
-  // makes it possible to generate the entire PDF given the variables below:
-  //
-  // The metafile to save into, which is guaranteed to be valid between a
-  // successful PrintBegin call and a PrintEnd call.
-  raw_ptr<printing::MetafileSkia> metafile_;
-  // An array of page ranges.
-  std::vector<PP_PrintPageNumberRange_Dev> ranges_;
-
-  scoped_refptr<ppapi::Resource> gamepad_impl_;
-  scoped_refptr<ppapi::Resource> uma_private_impl_;
-
-  // The plugin print interface.
-  raw_ptr<const PPP_Printing_Dev> plugin_print_interface_;
-
-  // The plugin 3D interface.
-  raw_ptr<const PPP_Graphics3D> plugin_graphics_3d_interface_;
-
-  // Contains the cursor if it's set by the plugin.
-  std::unique_ptr<ui::Cursor> cursor_ =
-      std::make_unique<ui::Cursor>(ui::mojom::CursorType::kPointer);
-
-  // Set to true if this plugin thinks it will always be on top. This allows us
-  // to use a more optimized painting path in some cases.
-  bool always_on_top_;
-
-  // Implementation of PPB_Fullscreen.
-
-  // Since entering fullscreen mode is an asynchronous operation, we set this
-  // variable to the desired state at the time we issue the fullscreen change
-  // request. The plugin will receive a DidChangeView event when it goes
-  // fullscreen.
-  bool desired_fullscreen_state_;
-
-  // WebKit does not resize the plugin when going into fullscreen mode, so we do
-  // this here by modifying the various plugin attributes and then restoring
-  // them on exit.
-  blink::WebString width_before_fullscreen_;
-  blink::WebString height_before_fullscreen_;
-  blink::WebString border_before_fullscreen_;
-  blink::WebString style_before_fullscreen_;
-  gfx::Size screen_size_for_fullscreen_;
-
-  // The MessageChannel used to implement bidirectional postMessage for the
-  // instance.
-  v8::Persistent<v8::Object> message_channel_object_;
-
-  // A pointer to the MessageChannel underlying |message_channel_object_|. It is
-  // only valid as long as |message_channel_object_| is alive.
-  raw_ptr<MessageChannel> message_channel_;
-
-  // Bitmap for crashed plugin. Lazily initialized.
-  cc::PaintImage sad_plugin_image_;
-
-  typedef std::set<raw_ptr<PluginObject, SetExperimental>> PluginObjectSet;
-  PluginObjectSet live_plugin_objects_;
-
-  // Classes of events that the plugin has registered for, both for filtering
-  // and not. The bits are PP_INPUTEVENT_CLASS_*.
-  uint32_t input_event_mask_;
-  uint32_t filtered_input_event_mask_;
-
-  // Text composition status.
-  struct TextInputCaretInfo {
-    gfx::Rect caret;
-    gfx::Rect caret_bounds;
-  };
-  std::optional<TextInputCaretInfo> text_input_caret_info_;
-  ui::TextInputType text_input_type_;
-
-  // Text selection status.
-  std::string surrounding_text_;
-  size_t selection_caret_;
-  size_t selection_anchor_;
-
-  scoped_refptr<ppapi::TrackedCallback> lock_mouse_callback_;
-
-  // We store the arguments so we can re-send them if we are reset to talk to
-  // NaCl via the IPC NaCl proxy.
-  std::vector<std::string> argn_;
-  std::vector<std::string> argv_;
-
-  // Non-owning pointer to the document loader, if any.
-  raw_ptr<blink::WebAssociatedURLLoaderClient> document_loader_;
-  // State for deferring document loads. Used only by external instances.
-  blink::WebURLResponse external_document_response_;
-  std::unique_ptr<ExternalDocumentLoader> external_document_loader_;
-  bool external_document_load_;
-
-  // The link currently under the cursor.
-  std::u16string link_under_cursor_;
-
-  // We store the isolate at construction so that we can be sure to use the
-  // Isolate in which this Instance was created when interacting with v8.
-  raw_ptr<v8::Isolate> isolate_;
-
-  bool is_deleted_;
-
-  // The text that is currently selected in the plugin.
-  std::u16string selected_text_;
-
-  // The most recently committed texture. This is kept around in case the layer
-  // needs to be regenerated.
-  viz::TransferableResource committed_texture_;
-
-  // The Graphics3D that produced the most recently committed texture.
-  scoped_refptr<PPB_Graphics3D_Impl> committed_texture_graphics_3d_;
-
-  gpu::SyncToken committed_texture_consumed_sync_token_;
-
-  // Holds the number of references |texture_layer_| has to any given
-  // gpu::Mailbox.
-  // We expect there to be no more than 10 textures in use at a time. A
-  // std::vector will have better performance than a std::map.
-  using MailboxRefCount = std::pair<gpu::Mailbox, int>;
-  std::vector<MailboxRefCount> texture_ref_counts_;
-
-  bool initialized_;
-  bool created_in_process_instance_;
-
-  // The controller for all active audios of this pepper instance.
-  std::unique_ptr<PepperAudioController> audio_controller_;
-
-  // Current text input composition text. Empty if no composition is in
-  // progress.
-  std::u16string composition_text_;
-
-  mojo::AssociatedRemote<mojom::PepperPluginInstanceHost> pepper_host_remote_;
-  mojo::AssociatedReceiver<mojom::PepperPluginInstance> pepper_receiver_{this};
-
-  // We use a weak ptr factory for scheduling DidChangeView events so that we
-  // can tell whether updates are pending and consolidate them. When there's
-  // already a weak ptr pending (HasWeakPtrs is true), code should update the
-  // view_data_ but not send updates. This also allows us to cancel scheduled
-  // view change events.
-  base::WeakPtrFactory<PepperPluginInstanceImpl> view_change_weak_ptr_factory_{
-      this};
-  base::WeakPtrFactory<PepperPluginInstanceImpl> weak_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_PLUGIN_INSTANCE_IMPL_H_
diff --git a/content/renderer/pepper/pepper_plugin_registry.cc b/content/renderer/pepper/pepper_plugin_registry.cc
deleted file mode 100644
index 3d1ccd3a..0000000
--- a/content/renderer/pepper/pepper_plugin_registry.cc
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_plugin_registry.h"
-
-#include <stddef.h>
-
-#include "base/containers/contains.h"
-#include "base/logging.h"
-#include "content/common/pepper_plugin_list.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "ppapi/shared_impl/ppapi_permissions.h"
-
-namespace content {
-
-// static
-PepperPluginRegistry* PepperPluginRegistry::GetInstance() {
-  static PepperPluginRegistry* registry = nullptr;
-  // This object leaks.  It is a temporary hack to work around a crash.
-  // http://code.google.com/p/chromium/issues/detail?id=63234
-  if (!registry) {
-    registry = new PepperPluginRegistry;
-    registry->Initialize();
-  }
-  return registry;
-}
-
-const ContentPluginInfo* PepperPluginRegistry::GetInfoForPlugin(
-    const WebPluginInfo& info) {
-  for (const auto& plugin : plugin_list_) {
-    if (info.path == plugin.path)
-      return &plugin;
-  }
-  // We did not find the plugin in our list. But wait! the plugin can also
-  // be a latecomer, as it happens with pepper flash. This information
-  // is actually in |info| and we can use it to construct it and add it to
-  // the list. This same deal needs to be done in the browser side in
-  // PluginService.
-  ContentPluginInfo plugin;
-  if (!MakePepperPluginInfo(info, &plugin))
-    return nullptr;
-
-  plugin_list_.push_back(plugin);
-  return &plugin_list_.back();
-}
-
-PluginModule* PepperPluginRegistry::GetLiveModule(
-    const base::FilePath& path,
-    const std::optional<url::Origin>& origin_lock) {
-  auto module_iter = live_modules_.find({path, origin_lock});
-  if (module_iter == live_modules_.end())
-    return nullptr;
-
-  // Check the instances for the module to see if they've all been Delete()d.
-  // We don't want to return a PluginModule in that case, since the plugin may
-  // have exited already.
-  const PluginModule::PluginInstanceSet& instance_set =
-      module_iter->second->GetAllInstances();
-
-  // If instance_set is empty, InstanceCreated() hasn't been called yet, so
-  // it's safe to return the PluginModule.
-  if (instance_set.empty())
-    return module_iter->second;
-
-  auto instance_iter = instance_set.begin();
-  while (instance_iter != instance_set.end()) {
-    if (!(*instance_iter)->is_deleted())
-      return module_iter->second;
-    ++instance_iter;
-  }
-  return nullptr;
-}
-
-void PepperPluginRegistry::AddLiveModule(
-    const base::FilePath& path,
-    const std::optional<url::Origin>& origin_lock,
-    PluginModule* module) {
-  DCHECK(!base::Contains(live_modules_, std::make_pair(path, origin_lock)));
-  live_modules_[{path, origin_lock}] = module;
-}
-
-void PepperPluginRegistry::PluginModuleDead(PluginModule* dead_module) {
-  // DANGER: Don't dereference the dead_module pointer! It may be in the
-  // process of being deleted.
-
-  // Modules aren't destroyed very often and there are normally at most a
-  // couple of them. So for now we just do a brute-force search.
-  for (auto i = live_modules_.begin(); i != live_modules_.end(); ++i) {
-    if (i->second == dead_module) {
-      live_modules_.erase(i);
-      return;
-    }
-  }
-  // Can occur in tests.
-}
-
-PepperPluginRegistry::~PepperPluginRegistry() {
-  // Explicitly clear all preloaded modules first. This will cause callbacks
-  // to erase these modules from the live_modules_ list, and we don't want
-  // that to happen implicitly out-of-order.
-  preloaded_modules_.clear();
-
-  DCHECK(live_modules_.empty());
-}
-
-PepperPluginRegistry::PepperPluginRegistry() {}
-
-void PepperPluginRegistry::Initialize() {
-  ComputePepperPluginList(&plugin_list_);
-
-  // Note that in each case, AddLiveModule must be called before completing
-  // initialization. If we bail out (in the continue clauses) before saving
-  // the initialized module, it will still try to unregister itself in its
-  // destructor.
-  for (const auto& current : plugin_list_) {
-    if (current.is_out_of_process)
-      continue;  // Out of process plugins need no special pre-initialization.
-
-    auto module = base::MakeRefCounted<PluginModule>(
-        current.name, current.version, current.path,
-        ppapi::PpapiPermissions(current.permissions));
-    AddLiveModule(current.path, std::optional<url::Origin>(), module.get());
-    if (current.is_internal) {
-      if (!module->InitAsInternalPlugin(current.internal_entry_points)) {
-        DVLOG(1) << "Failed to load pepper module: " << current.path.value();
-        continue;
-      }
-    } else {
-      // Preload all external plugins we're not running out of process.
-      if (!module->InitAsLibrary(current.path)) {
-        DVLOG(1) << "Failed to load pepper module: " << current.path.value();
-        continue;
-      }
-    }
-    preloaded_modules_[current.path] = module;
-  }
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_plugin_registry.h b/content/renderer/pepper/pepper_plugin_registry.h
deleted file mode 100644
index 70c5dcbd..0000000
--- a/content/renderer/pepper/pepper_plugin_registry.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_PLUGIN_REGISTRY_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_PLUGIN_REGISTRY_H_
-
-#include <map>
-#include <optional>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "content/public/common/content_plugin_info.h"
-#include "url/origin.h"
-
-namespace content {
-class PluginModule;
-
-// This class holds references to all of the known pepper plugin modules.
-//
-// It keeps two lists. One list of preloaded in-process modules, and one list
-// is a list of all live modules (some of which may be out-of-process and hence
-// not preloaded).
-class PepperPluginRegistry {
- public:
-  PepperPluginRegistry(const PepperPluginRegistry&) = delete;
-  PepperPluginRegistry& operator=(const PepperPluginRegistry&) = delete;
-
-  ~PepperPluginRegistry();
-
-  static PepperPluginRegistry* GetInstance();
-
-  // Retrieves the information associated with the given plugin info. The
-  // return value will be NULL if there is no such plugin.
-  //
-  // The returned pointer is owned by the PluginRegistry.
-  const ContentPluginInfo* GetInfoForPlugin(const WebPluginInfo& info);
-
-  // Returns an existing loaded module for the given path. It will search for
-  // both preloaded in-process or currently active (non crashed) out-of-process
-  // plugins matching the given name (and origin if supplied). Returns NULL if
-  // the plugin hasn't been loaded.
-  PluginModule* GetLiveModule(const base::FilePath& path,
-                              const std::optional<url::Origin>& origin_lock);
-
-  // Notifies the registry that a new non-preloaded module has been created.
-  // This is normally called for out-of-process plugins. Once this is called,
-  // the module is available to be returned by GetModule(). The module will
-  // automatically unregister itself by calling PluginModuleDestroyed().
-  // |origin_lock| is used to segregate plugins by origin, omitted if the
-  // plugin is to handle content from all origins.
-  void AddLiveModule(const base::FilePath& path,
-                     const std::optional<url::Origin>& origin_lock,
-                     PluginModule* module);
-
-  void PluginModuleDead(PluginModule* dead_module);
-
- private:
-  PepperPluginRegistry();
-  void Initialize();
-
-  // All known pepper plugins.
-  std::vector<ContentPluginInfo> plugin_list_;
-
-  // Plugins that have been preloaded so they can be executed in-process in
-  // the renderer (the sandbox prevents on-demand loading).
-  typedef std::map<base::FilePath, scoped_refptr<PluginModule> >
-      OwningModuleMap;
-  OwningModuleMap preloaded_modules_;
-
-  // A list of non-owning pointers to all currently-live plugin modules. This
-  // includes both preloaded ones in preloaded_modules_, and out-of-process
-  // modules whose lifetime is managed externally. This will contain only
-  // non-crashed modules. If an out-of-process module crashes, it may
-  // continue as long as there are WebKit references to it, but it will not
-  // appear in this list.
-  using NonOwningModuleMap =
-      std::map<std::pair<base::FilePath, std::optional<url::Origin>>,
-               raw_ptr<PluginModule, CtnExperimental>>;
-  NonOwningModuleMap live_modules_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_PLUGIN_REGISTRY_H_
diff --git a/content/renderer/pepper/pepper_proxy_channel_delegate_impl.cc b/content/renderer/pepper/pepper_proxy_channel_delegate_impl.cc
deleted file mode 100644
index 11989f84..0000000
--- a/content/renderer/pepper/pepper_proxy_channel_delegate_impl.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_proxy_channel_delegate_impl.h"
-
-#include "base/synchronization/waitable_event.h"
-#include "build/build_config.h"
-#include "content/child/child_process.h"
-#include "ipc/ipc_platform_file.h"
-
-namespace content {
-
-PepperProxyChannelDelegateImpl::~PepperProxyChannelDelegateImpl() {}
-
-base::SingleThreadTaskRunner*
-PepperProxyChannelDelegateImpl::GetIPCTaskRunner() {
-  // This is called only in the renderer so we know we have a child process.
-  DCHECK(ChildProcess::current()) << "Must be in the renderer.";
-  return ChildProcess::current()->io_task_runner();
-}
-
-base::WaitableEvent* PepperProxyChannelDelegateImpl::GetShutdownEvent() {
-  DCHECK(ChildProcess::current()) << "Must be in the renderer.";
-  return ChildProcess::current()->GetShutDownEvent();
-}
-
-IPC::PlatformFileForTransit
-PepperProxyChannelDelegateImpl::ShareHandleWithRemote(
-    base::PlatformFile handle,
-    base::ProcessId remote_pid,
-    bool should_close_source) {
-  return IPC::GetPlatformFileForTransit(handle, should_close_source);
-}
-
-base::UnsafeSharedMemoryRegion
-PepperProxyChannelDelegateImpl::ShareUnsafeSharedMemoryRegionWithRemote(
-    const base::UnsafeSharedMemoryRegion& region,
-    base::ProcessId remote_pid) {
-  return region.Duplicate();
-}
-
-base::ReadOnlySharedMemoryRegion
-PepperProxyChannelDelegateImpl::ShareReadOnlySharedMemoryRegionWithRemote(
-    const base::ReadOnlySharedMemoryRegion& region,
-    base::ProcessId remote_pid) {
-  return region.Duplicate();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_proxy_channel_delegate_impl.h b/content/renderer/pepper/pepper_proxy_channel_delegate_impl.h
deleted file mode 100644
index 151d441..0000000
--- a/content/renderer/pepper/pepper_proxy_channel_delegate_impl.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_PROXY_CHANNEL_DELEGATE_IMPL_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_PROXY_CHANNEL_DELEGATE_IMPL_H_
-
-#include "base/task/single_thread_task_runner.h"
-#include "ppapi/proxy/proxy_channel.h"
-
-namespace base {
-class WaitableEvent;
-}
-
-namespace content {
-
-class PepperProxyChannelDelegateImpl
-    : public ppapi::proxy::ProxyChannel::Delegate {
- public:
-  ~PepperProxyChannelDelegateImpl() override;
-
-  // ProxyChannel::Delegate implementation.
-  base::SingleThreadTaskRunner* GetIPCTaskRunner() override;
-  base::WaitableEvent* GetShutdownEvent() override;
-  IPC::PlatformFileForTransit ShareHandleWithRemote(
-      base::PlatformFile handle,
-      base::ProcessId remote_pid,
-      bool should_close_source) override;
-  base::UnsafeSharedMemoryRegion ShareUnsafeSharedMemoryRegionWithRemote(
-      const base::UnsafeSharedMemoryRegion& region,
-      base::ProcessId remote_pid) override;
-  base::ReadOnlySharedMemoryRegion ShareReadOnlySharedMemoryRegionWithRemote(
-      const base::ReadOnlySharedMemoryRegion& region,
-      base::ProcessId remote_pid) override;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_PROXY_CHANNEL_DELEGATE_IMPL_H_
diff --git a/content/renderer/pepper/pepper_try_catch.cc b/content/renderer/pepper/pepper_try_catch.cc
deleted file mode 100644
index 2a06e7a..0000000
--- a/content/renderer/pepper/pepper_try_catch.cc
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_try_catch.h"
-
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/v8_var_converter.h"
-#include "gin/converter.h"
-#include "ppapi/shared_impl/ppapi_globals.h"
-#include "ppapi/shared_impl/var_tracker.h"
-#include "v8/include/v8-context.h"
-#include "v8/include/v8-isolate.h"
-#include "v8/include/v8-primitive.h"
-
-namespace content {
-
-namespace {
-
-const char kConversionException[] =
-    "Error: Failed conversion between PP_Var and V8 value";
-const char kInvalidException[] = "Error: An invalid exception was thrown.";
-
-}  // namespace
-
-PepperTryCatch::PepperTryCatch(PepperPluginInstanceImpl* instance,
-                               V8VarConverter* var_converter)
-    : instance_(instance), var_converter_(var_converter) {}
-
-PepperTryCatch::~PepperTryCatch() {}
-
-v8::Local<v8::Value> PepperTryCatch::ToV8(PP_Var var) {
-  if (HasException()) {
-    SetException(kConversionException);
-    return v8::Local<v8::Value>();
-  }
-
-  v8::Local<v8::Value> result;
-  bool success = var_converter_->ToV8Value(var, GetContext(), &result);
-  if (!success) {
-    SetException(kConversionException);
-    return v8::Local<v8::Value>();
-  }
-  return result;
-}
-
-ppapi::ScopedPPVar PepperTryCatch::FromV8(v8::Local<v8::Value> v8_value) {
-  if (HasException() || v8_value.IsEmpty()) {
-    SetException(kConversionException);
-    return ppapi::ScopedPPVar();
-  }
-  ppapi::ScopedPPVar result;
-  bool success =
-      var_converter_->FromV8ValueSync(v8_value, GetContext(), &result);
-  if (!success) {
-    SetException(kConversionException);
-    return ppapi::ScopedPPVar();
-  }
-  return result;
-}
-
-ppapi::ScopedPPVar PepperTryCatch::FromV8Maybe(
-    v8::MaybeLocal<v8::Value> v8_value) {
-  return FromV8(v8_value.FromMaybe(v8::Local<v8::Value>()));
-}
-
-PepperTryCatchV8::PepperTryCatchV8(PepperPluginInstanceImpl* instance,
-                                   V8VarConverter* var_converter,
-                                   v8::Isolate* isolate)
-    : PepperTryCatch(instance, var_converter),
-      exception_(PP_MakeUndefined()) {
-  // Typically when using PepperTryCatchV8 we are passed an isolate. We verify
-  // that this isolate is the same as the plugin isolate.
-  DCHECK(isolate == instance_->GetIsolate());
-
-  // We assume that a handle scope and context has been setup by the user of
-  // this class. This is typically true because this class is used when calling
-  // into the plugin from JavaScript. We want to use whatever v8 context the
-  // caller is in.
-}
-
-PepperTryCatchV8::~PepperTryCatchV8() {
-  ppapi::PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(exception_);
-}
-
-bool PepperTryCatchV8::HasException() {
-  return GetContext().IsEmpty() || exception_.type != PP_VARTYPE_UNDEFINED;
-}
-
-v8::Local<v8::Context> PepperTryCatchV8::GetContext() {
-  // When calling from JS into the plugin always use the current context.
-  return instance_->GetIsolate()->GetCurrentContext();
-}
-
-bool PepperTryCatchV8::ThrowException() {
-  if (!HasException())
-    return false;
-
-  // If there is no context then we have an exception but we don't try to throw
-  // it into v8.
-  if (GetContext().IsEmpty())
-    return true;
-
-  std::string message(kInvalidException);
-  ppapi::StringVar* message_var = ppapi::StringVar::FromPPVar(exception_);
-  if (message_var)
-    message = message_var->value();
-  instance_->GetIsolate()->ThrowException(v8::Exception::Error(
-      gin::StringToV8(instance_->GetIsolate(), message)));
-
-  ppapi::PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(exception_);
-  exception_ = PP_MakeUndefined();
-  return true;
-}
-
-void PepperTryCatchV8::ThrowException(const char* message) {
-  SetException(message);
-  ThrowException();
-}
-
-void PepperTryCatchV8::SetException(const char* message) {
-  if (HasException())
-    return;
-
-  exception_ = ppapi::StringVar::StringToPPVar(message);
-}
-
-PepperTryCatchVar::PepperTryCatchVar(PepperPluginInstanceImpl* instance,
-                                     V8VarConverter* var_converter,
-                                     PP_Var* exception)
-    : PepperTryCatch(instance, var_converter),
-      handle_scope_(instance_->GetIsolate()),
-      try_catch_(instance_->GetIsolate()),
-      exception_(exception),
-      exception_is_set_(false) {
-  // Store a handle to the context here for 2 reasons:
-  // 1) To hold a handle to it in case all other handles are destroyed.
-  // 2) Because calling PepperPluginInstanceImpl::GetMainWorldContext() later
-  //    can result in trying to access the plugin element. However the plugin
-  //    element may have been destroyed during the PepperTryCatchVar (for
-  //    example if a script is executed which destroys the plugin element). So
-  //    we want to avoid accessing the plugin element again beyond this point.
-  context_ = instance_->GetMainWorldContext();
-
-  // We switch to the plugin context if it's not empty.
-  if (!context_.IsEmpty())
-    context_->Enter();
-}
-
-PepperTryCatchVar::~PepperTryCatchVar() {
-  if (!context_.IsEmpty())
-    context_->Exit();
-}
-
-bool PepperTryCatchVar::HasException() {
-  if (exception_is_set_)
-    return true;
-
-  std::string exception_message;
-  if (context_.IsEmpty()) {
-    exception_message = "The v8 context has been destroyed.";
-  } else if (try_catch_.HasCaught()) {
-    v8::Local<v8::Message> message(try_catch_.Message());
-    if (!message.IsEmpty()) {
-      v8::String::Utf8Value utf8(handle_scope_.GetIsolate(),
-                                 try_catch_.Message()->Get());
-      exception_message = std::string(*utf8, utf8.length());
-    } else {
-      exception_message = "There was a v8 exception.";
-    }
-  }
-
-  if (!exception_message.empty()) {
-    exception_is_set_ = true;
-    if (exception_)
-      *exception_ = ppapi::StringVar::StringToPPVar(exception_message);
-  }
-
-  return exception_is_set_;
-}
-
-v8::Local<v8::Context> PepperTryCatchVar::GetContext() {
-  return context_;
-}
-
-void PepperTryCatchVar::SetException(const char* message) {
-  if (exception_is_set_)
-    return;
-
-  if (exception_)
-    *exception_ = ppapi::StringVar::StringToPPVar(message, strlen(message));
-  exception_is_set_ = true;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_try_catch.h b/content/renderer/pepper/pepper_try_catch.h
deleted file mode 100644
index f70cf08..0000000
--- a/content/renderer/pepper/pepper_try_catch.h
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_TRY_CATCH_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_TRY_CATCH_H_
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "content/common/content_export.h"
-#include "ppapi/c/pp_var.h"
-#include "ppapi/shared_impl/scoped_pp_var.h"
-#include "v8/include/v8-exception.h"
-#include "v8/include/v8-forward.h"
-
-namespace content {
-
-class PepperPluginInstanceImpl;
-class V8VarConverter;
-
-// Base class for scripting TryCatch helpers.
-class CONTENT_EXPORT PepperTryCatch {
- public:
-  // PepperTryCatch objects should only be used as stack variables. This object
-  // takes a reference on the given PepperPluginInstanceImpl.
-  PepperTryCatch(PepperPluginInstanceImpl* instance,
-                 V8VarConverter* var_converter);
-  virtual ~PepperTryCatch();
-
-  virtual void SetException(const char* message) = 0;
-  virtual bool HasException() = 0;
-  // Gets the context to execute scripts in.
-  virtual v8::Local<v8::Context> GetContext() = 0;
-
-  // Convenience functions for doing conversions to/from V8 values and sets an
-  // exception if there is an error in the conversion.
-  v8::Local<v8::Value> ToV8(PP_Var var);
-  ppapi::ScopedPPVar FromV8(v8::Local<v8::Value> v8_value);
-  ppapi::ScopedPPVar FromV8Maybe(v8::MaybeLocal<v8::Value> v8_value);
-
- protected:
-  // Make sure that |instance_| is alive for the lifetime of PepperTryCatch.
-  // PepperTryCatch is used mostly in Pepper scripting code, where it can be
-  // possible to enter JavaScript synchronously which can cause the plugin to
-  // be deleted.
-  //
-  // Note that PepperTryCatch objects should only ever be on the stack, so this
-  // shouldn't keep the instance around for too long.
-  scoped_refptr<PepperPluginInstanceImpl> instance_;
-
-  raw_ptr<V8VarConverter> var_converter_;
-};
-
-// Catches var exceptions and emits a v8 exception.
-class PepperTryCatchV8 : public PepperTryCatch {
- public:
-  PepperTryCatchV8(PepperPluginInstanceImpl* instance,
-                   V8VarConverter* var_converter,
-                   v8::Isolate* isolate);
-
-  PepperTryCatchV8(const PepperTryCatchV8&) = delete;
-  PepperTryCatchV8& operator=(const PepperTryCatchV8&) = delete;
-
-  ~PepperTryCatchV8() override;
-
-  bool ThrowException();
-  void ThrowException(const char* message);
-  PP_Var* exception() { return &exception_; }
-
-  // PepperTryCatch
-  void SetException(const char* message) override;
-  bool HasException() override;
-  v8::Local<v8::Context> GetContext() override;
-
- private:
-  PP_Var exception_;
-};
-
-// Catches v8 exceptions and emits a var exception.
-class PepperTryCatchVar : public PepperTryCatch {
- public:
-  // The PP_Var exception will be placed in |exception|. The user of this class
-  // is responsible for managing the lifetime of the exception. It is valid to
-  //  pass NULL for |exception| in which case no exception will be set.
-  PepperTryCatchVar(PepperPluginInstanceImpl* instance,
-                    V8VarConverter* var_converter,
-                    PP_Var* exception);
-
-  PepperTryCatchVar(const PepperTryCatchVar&) = delete;
-  PepperTryCatchVar& operator=(const PepperTryCatchVar&) = delete;
-
-  ~PepperTryCatchVar() override;
-
-  // PepperTryCatch
-  void SetException(const char* message) override;
-  bool HasException() override;
-  v8::Local<v8::Context> GetContext() override;
-
- private:
-  // Code which uses PepperTryCatchVar doesn't typically have a HandleScope,
-  // make one for them. Note that this class is always allocated on the stack.
-  v8::HandleScope handle_scope_;
-
-  v8::Local<v8::Context> context_;
-
-  v8::TryCatch try_catch_;
-
-  raw_ptr<PP_Var> exception_;
-  bool exception_is_set_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_TRY_CATCH_H_
diff --git a/content/renderer/pepper/pepper_url_loader_host.cc b/content/renderer/pepper/pepper_url_loader_host.cc
deleted file mode 100644
index 0b172cd..0000000
--- a/content/renderer/pepper/pepper_url_loader_host.cc
+++ /dev/null
@@ -1,450 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_url_loader_host.h"
-
-#include <stddef.h>
-
-#include "base/feature_list.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/strings/string_util.h"
-#include "content/public/common/content_features.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "content/renderer/pepper/url_request_info_util.h"
-#include "content/renderer/pepper/url_response_info_util.h"
-#include "net/base/net_errors.h"
-#include "net/http/http_request_headers.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/shared_impl/ppapi_globals.h"
-#include "third_party/blink/public/platform/web_security_origin.h"
-#include "third_party/blink/public/platform/web_url_error.h"
-#include "third_party/blink/public/platform/web_url_request.h"
-#include "third_party/blink/public/platform/web_url_response.h"
-#include "third_party/blink/public/web/blink.h"
-#include "third_party/blink/public/web/web_associated_url_loader.h"
-#include "third_party/blink/public/web/web_associated_url_loader_options.h"
-#include "third_party/blink/public/web/web_document.h"
-#include "third_party/blink/public/web/web_element.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-#include "third_party/blink/public/web/web_plugin_container.h"
-
-using blink::WebAssociatedURLLoader;
-using blink::WebAssociatedURLLoaderOptions;
-using blink::WebLocalFrame;
-using blink::WebString;
-using blink::WebURL;
-using blink::WebURLError;
-using blink::WebURLRequest;
-using blink::WebURLResponse;
-
-#ifdef _MSC_VER
-// Do not warn about use of std::copy with raw pointers.
-#pragma warning(disable : 4996)
-#endif
-
-namespace content {
-
-PepperURLLoaderHost::PepperURLLoaderHost(RendererPpapiHostImpl* host,
-                                         bool main_document_loader,
-                                         PP_Instance instance,
-                                         PP_Resource resource)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      renderer_ppapi_host_(host),
-      main_document_loader_(main_document_loader),
-      has_universal_access_(false),
-      bytes_sent_(0),
-      total_bytes_to_be_sent_(-1),
-      bytes_received_(0),
-      total_bytes_to_be_received_(-1),
-      pending_response_(false) {
-  DCHECK((main_document_loader && !resource) ||
-         (!main_document_loader && resource));
-}
-
-PepperURLLoaderHost::~PepperURLLoaderHost() {
-  // Normally deleting this object will delete the loader which will implicitly
-  // cancel the load. But this won't happen for the main document loader. So it
-  // would be nice to issue a Close() here.
-  //
-  // However, the PDF plugin will cancel the document load and then close the
-  // resource (which is reasonable). It then makes a second request to load the
-  // document so it can set the "want progress" flags (which is unreasonable --
-  // we should probably provide download progress on document loads).
-  //
-  // But a Close() on the main document (even if the request is already
-  // canceled) will cancel all pending subresources, of which the second
-  // request is one, and the load will fail. Even if we fixed the PDF reader to
-  // change the timing or to send progress events to avoid the second request,
-  // we don't want to cancel other loads when the main one is closed.
-  //
-  // "Leaking" the main document load here by not closing it will only affect
-  // plugins handling main document loads (which are very few, mostly only PDF)
-  // that dereference without explicitly closing the main document load (which
-  // PDF doesn't do -- it explicitly closes it before issuing the second
-  // request). And the worst thing that will happen is that any remaining data
-  // will get queued inside WebKit.
-  if (main_document_loader_) {
-    // The PluginInstance has a non-owning pointer to us.
-    PepperPluginInstanceImpl* instance_object =
-        renderer_ppapi_host_->GetPluginInstanceImpl(pp_instance());
-    if (instance_object) {
-      DCHECK(instance_object->document_loader() == this);
-      instance_object->set_document_loader(nullptr);
-    }
-  }
-
-  // There is a path whereby the destructor for the loader_ member can
-  // invoke InstanceWasDeleted() upon this URLLoaderResource, thereby
-  // re-entering the scoped_ptr destructor with the same scoped_ptr object
-  // via loader_.reset(). Be sure that loader_ is first NULL then destroy
-  // the scoped_ptr. See http://crbug.com/159429.
-  std::unique_ptr<WebAssociatedURLLoader> for_destruction_only(
-      loader_.release());
-}
-
-int32_t PepperURLLoaderHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    ppapi::host::HostMessageContext* context) {
-  PPAPI_BEGIN_MESSAGE_MAP(PepperURLLoaderHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_URLLoader_Open,
-                                      OnHostMsgOpen)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_URLLoader_SetDeferLoading,
-                                      OnHostMsgSetDeferLoading)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_URLLoader_Close,
-                                        OnHostMsgClose);
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(
-        PpapiHostMsg_URLLoader_GrantUniversalAccess,
-        OnHostMsgGrantUniversalAccess)
-  PPAPI_END_MESSAGE_MAP()
-  return PP_ERROR_FAILED;
-}
-
-bool PepperURLLoaderHost::WillFollowRedirect(
-    const WebURL& new_url,
-    const WebURLResponse& redirect_response) {
-  DCHECK(out_of_order_replies_.empty());
-  // Follows the Firefox approach
-  // (https://bugzilla.mozilla.org/show_bug.cgi?id=1436241) to disallow
-  // cross-origin 307/308 POST redirects for requests from plugins. But we try
-  // allowing only GET and HEAD methods rather than disallowing POST.
-  // See http://crbug.com/332023 for details.
-  int status = redirect_response.HttpStatusCode();
-  if ((status == 307 || status == 308)) {
-    std::string method = base::ToUpperASCII(request_data_.method);
-    // method can be an empty string for default behavior, GET.
-    if (!method.empty() && method != net::HttpRequestHeaders::kGetMethod &&
-        method != net::HttpRequestHeaders::kHeadMethod) {
-      return false;
-    }
-  }
-
-  if (!request_data_.follow_redirects) {
-    SaveResponse(redirect_response);
-    SetDefersLoading(true);
-    // Defer the request and wait the plugin to audit the redirect. We
-    // shouldn't return false here as decision has been delegated to the
-    // plugin.
-  }
-  return true;
-}
-
-void PepperURLLoaderHost::DidSendData(uint64_t bytes_sent,
-                                      uint64_t total_bytes_to_be_sent) {
-  // TODO(darin): Bounds check input?
-  bytes_sent_ = static_cast<int64_t>(bytes_sent);
-  total_bytes_to_be_sent_ = static_cast<int64_t>(total_bytes_to_be_sent);
-  UpdateProgress();
-}
-
-void PepperURLLoaderHost::DidReceiveResponse(const WebURLResponse& response) {
-  // Sets -1 if the content length is unknown. Send before issuing callback.
-  total_bytes_to_be_received_ = response.ExpectedContentLength();
-  UpdateProgress();
-
-  SaveResponse(response);
-}
-
-void PepperURLLoaderHost::DidDownloadData(uint64_t data_length) {
-  bytes_received_ += data_length;
-  UpdateProgress();
-}
-
-void PepperURLLoaderHost::DidReceiveData(base::span<const char> data) {
-  // Note that |loader| will be NULL for document loads.
-  bytes_received_ += data.size();
-  UpdateProgress();
-
-  auto message = std::make_unique<PpapiPluginMsg_URLLoader_SendData>();
-  message->WriteData(data.data(), data.size());
-  SendUpdateToPlugin(std::move(message));
-}
-
-void PepperURLLoaderHost::DidFinishLoading() {
-  // Note that |loader| will be NULL for document loads.
-  SendUpdateToPlugin(
-      std::make_unique<PpapiPluginMsg_URLLoader_FinishedLoading>(PP_OK));
-}
-
-void PepperURLLoaderHost::DidFail(const WebURLError& error) {
-  // Note that |loader| will be NULL for document loads.
-  int32_t pp_error = PP_ERROR_FAILED;
-  // TODO(bbudge): Extend pp_errors.h to cover interesting network errors
-  // from the net error domain.
-  switch (error.reason()) {
-    case net::ERR_ACCESS_DENIED:
-    case net::ERR_NETWORK_ACCESS_DENIED:
-      pp_error = PP_ERROR_NOACCESS;
-      break;
-  }
-
-  if (error.is_web_security_violation())
-    pp_error = PP_ERROR_NOACCESS;
-  SendUpdateToPlugin(
-      std::make_unique<PpapiPluginMsg_URLLoader_FinishedLoading>(pp_error));
-}
-
-void PepperURLLoaderHost::DidConnectPendingHostToResource() {
-  for (const auto& reply : pending_replies_)
-    host()->SendUnsolicitedReply(pp_resource(), *reply);
-  pending_replies_.clear();
-}
-
-int32_t PepperURLLoaderHost::OnHostMsgOpen(
-    ppapi::host::HostMessageContext* context,
-    const ppapi::URLRequestInfoData& request_data) {
-  // An "Open" isn't a resource Call so has no reply, but failure to open
-  // implies a load failure. To make it harder to forget to send the load
-  // failed reply from the open handler, we instead catch errors and convert
-  // them to load failed messages.
-  int32_t ret = InternalOnHostMsgOpen(context, request_data);
-  DCHECK(ret != PP_OK_COMPLETIONPENDING);
-
-  if (ret != PP_OK)
-    SendUpdateToPlugin(
-        std::make_unique<PpapiPluginMsg_URLLoader_FinishedLoading>(ret));
-  return PP_OK;
-}
-
-// Since this is wrapped by OnHostMsgOpen, we can return errors here and they
-// will be translated into a FinishedLoading call automatically.
-int32_t PepperURLLoaderHost::InternalOnHostMsgOpen(
-    ppapi::host::HostMessageContext* context,
-    const ppapi::URLRequestInfoData& request_data) {
-  // Main document loads are already open, so don't allow people to open them
-  // again.
-  if (main_document_loader_)
-    return PP_ERROR_INPROGRESS;
-
-  // Create a copy of the request data since CreateWebURLRequest will populate
-  // the file refs.
-  ppapi::URLRequestInfoData filled_in_request_data = request_data;
-
-  if (URLRequestRequiresUniversalAccess(filled_in_request_data) &&
-      !has_universal_access_) {
-    ppapi::PpapiGlobals::Get()->LogWithSource(
-        pp_instance(),
-        PP_LOGLEVEL_ERROR,
-        std::string(),
-        "PPB_URLLoader.Open: The URL you're requesting is "
-        " on a different security origin than your plugin. To request "
-        " cross-origin resources, see "
-        " PP_URLREQUESTPROPERTY_ALLOWCROSSORIGINREQUESTS.");
-    return PP_ERROR_NOACCESS;
-  }
-
-  if (loader_.get())
-    return PP_ERROR_INPROGRESS;
-
-  WebLocalFrame* frame = GetFrame();
-  if (!frame)
-    return PP_ERROR_FAILED;
-
-  WebURLRequest web_request;
-  if (!CreateWebURLRequest(
-          pp_instance(), &filled_in_request_data, frame, &web_request)) {
-    return PP_ERROR_FAILED;
-  }
-
-  // Requests from plug-ins must be marked as PLUGIN, and must skip service
-  // workers, see the comment in CreateWebURLRequest.
-  DCHECK_EQ(blink::mojom::RequestContextType::PLUGIN,
-            web_request.GetRequestContext());
-  DCHECK(web_request.GetSkipServiceWorker());
-
-  WebAssociatedURLLoaderOptions options;
-  if (has_universal_access_) {
-    options.grant_universal_access = true;
-  } else {
-    // All other HTTP requests are untrusted.
-    options.untrusted_http = true;
-    if (filled_in_request_data.allow_cross_origin_requests) {
-      // Allow cross-origin requests with access control. The request specifies
-      // if credentials are to be sent.
-      web_request.SetMode(network::mojom::RequestMode::kCors);
-      web_request.SetCredentialsMode(
-          filled_in_request_data.allow_credentials
-              ? network::mojom::CredentialsMode::kInclude
-              : network::mojom::CredentialsMode::kOmit);
-    } else {
-      web_request.SetMode(network::mojom::RequestMode::kSameOrigin);
-      // Same-origin requests can always send credentials. Use the default
-      // credentials mode "include".
-    }
-  }
-
-  loader_ = frame->CreateAssociatedURLLoader(options);
-  if (!loader_.get())
-    return PP_ERROR_FAILED;
-
-  // Don't actually save the request until we know we're going to load.
-  request_data_ = filled_in_request_data;
-  loader_->LoadAsynchronously(web_request, this);
-
-  // Although the request is technically pending, this is not a "Call" message
-  // so we don't return COMPLETIONPENDING.
-  return PP_OK;
-}
-
-int32_t PepperURLLoaderHost::OnHostMsgSetDeferLoading(
-    ppapi::host::HostMessageContext* context,
-    bool defers_loading) {
-  SetDefersLoading(defers_loading);
-  return PP_OK;
-}
-
-int32_t PepperURLLoaderHost::OnHostMsgClose(
-    ppapi::host::HostMessageContext* context) {
-  Close();
-  return PP_OK;
-}
-
-int32_t PepperURLLoaderHost::OnHostMsgGrantUniversalAccess(
-    ppapi::host::HostMessageContext* context) {
-  // Only plugins with permission can bypass same origin.
-  if (host()->permissions().HasPermission(ppapi::PERMISSION_PDF)) {
-    has_universal_access_ = true;
-    return PP_OK;
-  }
-  return PP_ERROR_FAILED;
-}
-
-void PepperURLLoaderHost::SendUpdateToPlugin(
-    std::unique_ptr<IPC::Message> message) {
-  // We must send messages to the plugin in the order that the responses are
-  // received from webkit, even when the host isn't ready to send messages or
-  // when the host performs an asynchronous operation.
-  //
-  // Only {FinishedLoading, ReceivedResponse, SendData} have ordering
-  // contraints; all other messages are immediately added to pending_replies_.
-  //
-  // Accepted orderings for {FinishedLoading, ReceivedResponse, SendData} are:
-  //   - {ReceivedResponse, SendData (zero or more times), FinishedLoading}
-  //   - {FinishedLoading (when status != PP_OK)}
-  if (message->type() == PpapiPluginMsg_URLLoader_SendData::ID ||
-      message->type() == PpapiPluginMsg_URLLoader_FinishedLoading::ID) {
-    // Messages that must be sent after ReceivedResponse.
-    if (pending_response_) {
-      out_of_order_replies_.push_back(std::move(message));
-    } else {
-      SendOrderedUpdateToPlugin(std::move(message));
-    }
-  } else if (message->type() == PpapiPluginMsg_URLLoader_ReceivedResponse::ID) {
-    // Allow SendData and FinishedLoading into the ordered queue.
-    DCHECK(pending_response_);
-    SendOrderedUpdateToPlugin(std::move(message));
-    for (auto& reply : out_of_order_replies_)
-      SendOrderedUpdateToPlugin(std::move(reply));
-    out_of_order_replies_.clear();
-    pending_response_ = false;
-  } else {
-    // Messages without ordering constraints.
-    SendOrderedUpdateToPlugin(std::move(message));
-  }
-}
-
-void PepperURLLoaderHost::SendOrderedUpdateToPlugin(
-    std::unique_ptr<IPC::Message> message) {
-  if (pp_resource() == 0) {
-    pending_replies_.push_back(std::move(message));
-  } else {
-    host()->SendUnsolicitedReply(pp_resource(), *message);
-  }
-}
-
-void PepperURLLoaderHost::Close() {
-  if (loader_.get()) {
-    loader_->Cancel();
-  } else if (main_document_loader_) {
-    // TODO(raymes): Calling WebLocalFrame::stopLoading here is incorrect as it
-    // cancels all URL loaders associated with the frame. If a client has opened
-    // other URLLoaders and then closes the main one, the others should still
-    // remain connected. Work out how to only cancel the main request:
-    // crbug.com/384197.
-    WebLocalFrame* frame = GetFrame();
-    if (frame)
-      frame->DeprecatedStopLoading();
-  }
-}
-
-WebLocalFrame* PepperURLLoaderHost::GetFrame() {
-  PepperPluginInstanceImpl* instance_object =
-      static_cast<PepperPluginInstanceImpl*>(
-          renderer_ppapi_host_->GetPluginInstance(pp_instance()));
-  if (!instance_object || instance_object->is_deleted())
-    return nullptr;
-  return instance_object->GetContainer()->GetDocument().GetFrame();
-}
-
-void PepperURLLoaderHost::SetDefersLoading(bool defers_loading) {
-  if (loader_.get())
-    loader_->SetDefersLoading(defers_loading);
-
-  // TODO(brettw) bug 96770: We need a way to set the defers loading flag on
-  // main document loads (when the loader_ is null).
-}
-
-void PepperURLLoaderHost::SaveResponse(const WebURLResponse& response) {
-  // When we're the main document loader, we send the response data up front,
-  // so we don't want to trigger any callbacks in the plugin which aren't
-  // expected. We should not be getting redirects so the response sent
-  // up-front should be valid (plugin document loads happen after all
-  // redirects are processed since WebKit has to know the MIME type).
-  if (!main_document_loader_) {
-    // We note when there's a callback in flight for a response to ensure that
-    // messages we send to the plugin are not sent out of order. See
-    // SendUpdateToPlugin() for more details.
-    DCHECK(!pending_response_);
-    pending_response_ = true;
-
-    SendUpdateToPlugin(
-        std::make_unique<PpapiPluginMsg_URLLoader_ReceivedResponse>(
-            DataFromWebURLResponse(response)));
-  }
-}
-
-void PepperURLLoaderHost::UpdateProgress() {
-  bool record_download = request_data_.record_download_progress;
-  bool record_upload = request_data_.record_upload_progress;
-  if (record_download || record_upload) {
-    // Here we go through some effort to only send the exact information that
-    // the requestor wanted in the request flags. It would be just as
-    // efficient to send all of it, but we don't want people to rely on
-    // getting download progress when they happen to set the upload progress
-    // flag.
-    ppapi::proxy::ResourceMessageReplyParams params;
-    SendUpdateToPlugin(
-        std::make_unique<PpapiPluginMsg_URLLoader_UpdateProgress>(
-            record_upload ? bytes_sent_ : -1,
-            record_upload ? total_bytes_to_be_sent_ : -1,
-            record_download ? bytes_received_ : -1,
-            record_download ? total_bytes_to_be_received_ : -1));
-  }
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_url_loader_host.h b/content/renderer/pepper/pepper_url_loader_host.h
deleted file mode 100644
index d1eecccc..0000000
--- a/content/renderer/pepper/pepper_url_loader_host.h
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_URL_LOADER_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_URL_LOADER_HOST_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/memory/raw_ptr.h"
-#include "ppapi/host/resource_host.h"
-#include "ppapi/proxy/resource_message_params.h"
-#include "ppapi/shared_impl/url_request_info_data.h"
-#include "ppapi/shared_impl/url_response_info_data.h"
-#include "third_party/blink/public/web/web_associated_url_loader_client.h"
-
-namespace blink {
-class WebAssociatedURLLoader;
-class WebLocalFrame;
-}  // namespace blink
-
-namespace content {
-
-class RendererPpapiHostImpl;
-
-class PepperURLLoaderHost : public ppapi::host::ResourceHost,
-                            public blink::WebAssociatedURLLoaderClient {
- public:
-  // If main_document_loader is true, PP_Resource must be 0 since it will be
-  // pending until the plugin resource attaches to it.
-  PepperURLLoaderHost(RendererPpapiHostImpl* host,
-                      bool main_document_loader,
-                      PP_Instance instance,
-                      PP_Resource resource);
-
-  PepperURLLoaderHost(const PepperURLLoaderHost&) = delete;
-  PepperURLLoaderHost& operator=(const PepperURLLoaderHost&) = delete;
-
-  ~PepperURLLoaderHost() override;
-
-  // ResourceHost implementation.
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-
-  // blink::WebAssociatedURLLoaderClient implementation.
-  bool WillFollowRedirect(const blink::WebURL& new_url,
-                          const blink::WebURLResponse& redir_response) override;
-  void DidSendData(uint64_t bytes_sent,
-                   uint64_t total_bytes_to_be_sent) override;
-  void DidReceiveResponse(const blink::WebURLResponse& response) override;
-  void DidDownloadData(uint64_t data_length) override;
-  void DidReceiveData(base::span<const char> data) override;
-  void DidFinishLoading() override;
-  void DidFail(const blink::WebURLError& error) override;
-
- private:
-  // ResourceHost protected overrides.
-  void DidConnectPendingHostToResource() override;
-
-  // IPC messages
-  int32_t OnHostMsgOpen(ppapi::host::HostMessageContext* context,
-                        const ppapi::URLRequestInfoData& request_data);
-  int32_t InternalOnHostMsgOpen(ppapi::host::HostMessageContext* context,
-                                const ppapi::URLRequestInfoData& request_data);
-  int32_t OnHostMsgSetDeferLoading(ppapi::host::HostMessageContext* context,
-                                   bool defers_loading);
-  int32_t OnHostMsgClose(ppapi::host::HostMessageContext* context);
-  int32_t OnHostMsgGrantUniversalAccess(
-      ppapi::host::HostMessageContext* context);
-
-  // Sends or queues an unsolicited message to the plugin resource. This
-  // handles cases where messages must be reordered for the plugin and
-  // the case where we have created a pending host resource and the
-  // plugin has not connected to us yet.
-  //
-  // Takes ownership of the given pointer.
-  void SendUpdateToPlugin(std::unique_ptr<IPC::Message> msg);
-
-  // Sends or queues an unsolicited message to the plugin resource. This is
-  // used inside SendUpdateToPlugin for messages that are already ordered
-  // properly.
-  //
-  // Takes ownership of the given pointer.
-  void SendOrderedUpdateToPlugin(std::unique_ptr<IPC::Message> msg);
-
-  void Close();
-
-  // Returns the frame for the current request.
-  blink::WebLocalFrame* GetFrame();
-
-  // Calls SetDefersLoading on the current load. This encapsulates the logic
-  // differences between document loads and regular ones.
-  void SetDefersLoading(bool defers_loading);
-
-  // Converts a WebURLResponse to a URLResponseInfo and saves it.
-  void SaveResponse(const blink::WebURLResponse& response);
-
-  // Sends the UpdateProgress message (if necessary) to the plugin.
-  void UpdateProgress();
-
-  // Non-owning pointer.
-  raw_ptr<RendererPpapiHostImpl> renderer_ppapi_host_;
-
-  // If true, then the plugin instance is a full-frame plugin and we're just
-  // wrapping the main document's loader (i.e. loader_ is null).
-  bool main_document_loader_;
-
-  // The data that generated the request.
-  ppapi::URLRequestInfoData request_data_;
-
-  // Set to true when this loader can ignore same originl policy.
-  bool has_universal_access_;
-
-  // The loader associated with this request. MAY BE NULL.
-  //
-  // This will be NULL if the load hasn't been opened yet, or if this is a main
-  // document loader (when registered as a mime type). Therefore, you should
-  // always NULL check this value before using it. In the case of a main
-  // document load, you would call the functions on the document to cancel the
-  // load, etc. since there is no loader.
-  std::unique_ptr<blink::WebAssociatedURLLoader> loader_;
-
-  int64_t bytes_sent_;
-  int64_t total_bytes_to_be_sent_;
-  int64_t bytes_received_;
-  int64_t total_bytes_to_be_received_;
-
-  // Messages sent while the resource host is pending. These will be forwarded
-  // to the plugin when the plugin side connects. The pointers are owned by
-  // this object and must be deleted.
-  std::vector<std::unique_ptr<IPC::Message>> pending_replies_;
-  std::vector<std::unique_ptr<IPC::Message>> out_of_order_replies_;
-
-  // True when there's a pending DataFromURLResponse call which will send a
-  // PpapiPluginMsg_URLLoader_ReceivedResponse to the plugin, which introduces
-  // ordering constraints on following messages to the plugin.
-  bool pending_response_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_URL_LOADER_HOST_H_
diff --git a/content/renderer/pepper/pepper_url_request_unittest.cc b/content/renderer/pepper/pepper_url_request_unittest.cc
deleted file mode 100644
index ed18887..0000000
--- a/content/renderer/pepper/pepper_url_request_unittest.cc
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/compiler_specific.h"
-#include "content/public/test/render_view_test.h"
-#include "content/renderer/pepper/url_request_info_util.h"
-#include "ppapi/proxy/connection.h"
-#include "ppapi/proxy/url_request_info_resource.h"
-#include "ppapi/shared_impl/proxy_lock.h"
-#include "ppapi/shared_impl/test_globals.h"
-#include "ppapi/shared_impl/url_request_info_data.h"
-#include "ppapi/thunk/thunk.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/web_url_request.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-#include "third_party/blink/public/web/web_local_frame_client.h"
-#include "third_party/blink/public/web/web_view.h"
-
-// This test is a end-to-end test from the resource to the WebKit request
-// object. The actual resource implementation is so simple, it makes sense to
-// test it by making sure the conversion routines actually work at the same
-// time.
-
-using blink::WebString;
-using blink::WebView;
-using blink::WebURL;
-using blink::WebURLRequest;
-using ppapi::proxy::URLRequestInfoResource;
-using ppapi::URLRequestInfoData;
-
-namespace content {
-
-class URLRequestInfoTest : public RenderViewTest {
- public:
-  // Note: using -1 as the instance value allows code in
-  // url_request_info_util.cc to detect that this is a test instance.
-  URLRequestInfoTest() : pp_instance_(-1) {}
-
-  void SetUp() override {
-    RenderViewTest::SetUp();
-    test_globals_.GetResourceTracker()->DidCreateInstance(pp_instance_);
-
-    // This resource doesn't do IPC, so a null connection is fine.
-    info_ = new URLRequestInfoResource(
-        ppapi::proxy::Connection(), pp_instance_, URLRequestInfoData());
-  }
-
-  void TearDown() override {
-    test_globals_.GetResourceTracker()->DidDeleteInstance(pp_instance_);
-    RenderViewTest::TearDown();
-  }
-
-  WebString GetURL() {
-    WebURLRequest web_request;
-    URLRequestInfoData data = info_->GetData();
-    if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request))
-      return WebString();
-    return web_request.Url().GetString();
-  }
-
-  WebString GetMethod() {
-    WebURLRequest web_request;
-    URLRequestInfoData data = info_->GetData();
-    if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request))
-      return WebString();
-    return web_request.HttpMethod();
-  }
-
-  blink::mojom::RequestContextType GetContext() {
-    WebURLRequest web_request;
-    URLRequestInfoData data = info_->GetData();
-    if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request))
-      return blink::mojom::RequestContextType::UNSPECIFIED;
-    return web_request.GetRequestContext();
-  }
-
-  network::mojom::RequestDestination GetDestination() {
-    WebURLRequest web_request;
-    URLRequestInfoData data = info_->GetData();
-    if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request))
-      return network::mojom::RequestDestination::kEmpty;
-    return web_request.GetRequestDestination();
-  }
-
-  network::mojom::RequestMode GetMode() {
-    WebURLRequest web_request;
-    URLRequestInfoData data = info_->GetData();
-    if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request))
-      return network::mojom::RequestMode::kNavigate;
-    return web_request.GetMode();
-  }
-
-  WebString GetHeaderValue(const char* field) {
-    WebURLRequest web_request;
-    URLRequestInfoData data = info_->GetData();
-    if (!CreateWebURLRequest(pp_instance_, &data, GetMainFrame(), &web_request))
-      return WebString();
-    return web_request.HttpHeaderField(WebString::FromUTF8(field));
-  }
-
-  bool SetBooleanProperty(PP_URLRequestProperty prop, bool b) {
-    return info_->SetBooleanProperty(prop, b);
-  }
-  bool SetStringProperty(PP_URLRequestProperty prop, const std::string& s) {
-    return info_->SetStringProperty(prop, s);
-  }
-
-  PP_Instance pp_instance_;
-
-  // Disables locking for the duration of the test.
-  ppapi::ProxyLock::LockingDisablerForTest disable_locking_;
-
-  // Needs to be alive for resource tracking to work.
-  ppapi::TestGlobals test_globals_;
-
-  scoped_refptr<URLRequestInfoResource> info_;
-};
-
-TEST_F(URLRequestInfoTest, GetInterface) {
-  const PPB_URLRequestInfo* request_info =
-      ppapi::thunk::GetPPB_URLRequestInfo_1_0_Thunk();
-  EXPECT_TRUE(request_info);
-  EXPECT_TRUE(request_info->Create);
-  EXPECT_TRUE(request_info->IsURLRequestInfo);
-  EXPECT_TRUE(request_info->SetProperty);
-  EXPECT_TRUE(request_info->AppendDataToBody);
-  EXPECT_TRUE(request_info->AppendFileToBody);
-}
-
-TEST_F(URLRequestInfoTest, AsURLRequestInfo) {
-  EXPECT_EQ(info_.get(), info_->AsPPB_URLRequestInfo_API());
-}
-
-TEST_F(URLRequestInfoTest, StreamToFile) {
-  SetStringProperty(PP_URLREQUESTPROPERTY_URL, "http://www.google.com");
-
-  EXPECT_FALSE(SetBooleanProperty(PP_URLREQUESTPROPERTY_STREAMTOFILE, true));
-  EXPECT_FALSE(SetBooleanProperty(PP_URLREQUESTPROPERTY_STREAMTOFILE, false));
-}
-
-TEST_F(URLRequestInfoTest, FollowRedirects) {
-  EXPECT_TRUE(info_->GetData().follow_redirects);
-
-  EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_FOLLOWREDIRECTS, false));
-  EXPECT_FALSE(info_->GetData().follow_redirects);
-
-  EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_FOLLOWREDIRECTS, true));
-  EXPECT_TRUE(info_->GetData().follow_redirects);
-}
-
-TEST_F(URLRequestInfoTest, RecordDownloadProgress) {
-  EXPECT_FALSE(info_->GetData().record_download_progress);
-
-  EXPECT_TRUE(
-      SetBooleanProperty(PP_URLREQUESTPROPERTY_RECORDDOWNLOADPROGRESS, true));
-  EXPECT_TRUE(info_->GetData().record_download_progress);
-
-  EXPECT_TRUE(
-      SetBooleanProperty(PP_URLREQUESTPROPERTY_RECORDDOWNLOADPROGRESS, false));
-  EXPECT_FALSE(info_->GetData().record_download_progress);
-}
-
-TEST_F(URLRequestInfoTest, RecordUploadProgress) {
-  EXPECT_FALSE(info_->GetData().record_upload_progress);
-
-  EXPECT_TRUE(
-      SetBooleanProperty(PP_URLREQUESTPROPERTY_RECORDUPLOADPROGRESS, true));
-  EXPECT_TRUE(info_->GetData().record_upload_progress);
-
-  EXPECT_TRUE(
-      SetBooleanProperty(PP_URLREQUESTPROPERTY_RECORDUPLOADPROGRESS, false));
-  EXPECT_FALSE(info_->GetData().record_upload_progress);
-}
-
-TEST_F(URLRequestInfoTest, AllowCrossOriginRequests) {
-  EXPECT_FALSE(info_->GetData().allow_cross_origin_requests);
-
-  EXPECT_TRUE(
-      SetBooleanProperty(PP_URLREQUESTPROPERTY_ALLOWCROSSORIGINREQUESTS, true));
-  EXPECT_TRUE(info_->GetData().allow_cross_origin_requests);
-
-  EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_ALLOWCROSSORIGINREQUESTS,
-                                 false));
-  EXPECT_FALSE(info_->GetData().allow_cross_origin_requests);
-}
-
-TEST_F(URLRequestInfoTest, AllowCredentials) {
-  EXPECT_FALSE(info_->GetData().allow_credentials);
-
-  EXPECT_TRUE(SetBooleanProperty(PP_URLREQUESTPROPERTY_ALLOWCREDENTIALS, true));
-  EXPECT_TRUE(info_->GetData().allow_credentials);
-
-  EXPECT_TRUE(
-      SetBooleanProperty(PP_URLREQUESTPROPERTY_ALLOWCREDENTIALS, false));
-  EXPECT_FALSE(info_->GetData().allow_credentials);
-}
-
-TEST_F(URLRequestInfoTest, SetURL) {
-  const char* url = "http://www.google.com/";
-  EXPECT_TRUE(SetStringProperty(PP_URLREQUESTPROPERTY_URL, url));
-  EXPECT_STREQ(url, GetURL().Utf8().data());
-}
-
-TEST_F(URLRequestInfoTest, JavascriptURL) {
-  const char* url = "javascript:foo = bar";
-  EXPECT_FALSE(URLRequestRequiresUniversalAccess(info_->GetData()));
-  SetStringProperty(PP_URLREQUESTPROPERTY_URL, url);
-  EXPECT_TRUE(URLRequestRequiresUniversalAccess(info_->GetData()));
-}
-
-TEST_F(URLRequestInfoTest, SetMethod) {
-  // Test default method is "GET".
-  EXPECT_STREQ("GET", GetMethod().Utf8().data());
-  EXPECT_TRUE(SetStringProperty(PP_URLREQUESTPROPERTY_METHOD, "POST"));
-  EXPECT_STREQ("POST", GetMethod().Utf8().data());
-}
-
-TEST_F(URLRequestInfoTest, SetHeaders) {
-  // Test default header field.
-  EXPECT_STREQ("", GetHeaderValue("foo").Utf8().data());
-  // Test that we can set a header field.
-  EXPECT_TRUE(SetStringProperty(PP_URLREQUESTPROPERTY_HEADERS, "foo: bar"));
-  EXPECT_STREQ("bar", GetHeaderValue("foo").Utf8().data());
-  // Test that we can set multiple header fields using \n delimiter.
-  EXPECT_TRUE(
-      SetStringProperty(PP_URLREQUESTPROPERTY_HEADERS, "foo: bar\nbar: baz"));
-  EXPECT_STREQ("bar", GetHeaderValue("foo").Utf8().data());
-  EXPECT_STREQ("baz", GetHeaderValue("bar").Utf8().data());
-}
-
-TEST_F(URLRequestInfoTest, RequestContextAndDestination) {
-  // Test context and destination for PLUGIN.
-  EXPECT_EQ(blink::mojom::RequestContextType::PLUGIN, GetContext());
-  EXPECT_EQ(network::mojom::RequestDestination::kEmbed, GetDestination());
-  EXPECT_EQ(network::mojom::RequestMode::kNoCors, GetMode());
-}
-
-// TODO(bbudge) Unit tests for AppendDataToBody, AppendFileToBody.
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_video_capture_host.cc b/content/renderer/pepper/pepper_video_capture_host.cc
deleted file mode 100644
index 970254e..0000000
--- a/content/renderer/pepper/pepper_video_capture_host.cc
+++ /dev/null
@@ -1,443 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_video_capture_host.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "content/public/renderer/render_frame.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/pepper_media_device_manager.h"
-#include "content/renderer/pepper/pepper_platform_video_capture.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "media/base/limits.h"
-#include "media/base/video_frame.h"
-#include "media/base/video_util.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/host_dispatcher.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/shared_impl/host_resource.h"
-#include "ppapi/thunk/enter.h"
-#include "ppapi/thunk/ppb_buffer_api.h"
-#include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h"
-#include "third_party/libyuv/include/libyuv/planar_functions.h"
-
-using ppapi::HostResource;
-using ppapi::TrackedCallback;
-using ppapi::thunk::EnterResourceNoLock;
-using ppapi::thunk::PPB_Buffer_API;
-
-namespace {
-
-// Maximum number of buffers to actually allocate.
-const uint32_t kMaxBuffers = 20;
-
-}  // namespace
-
-namespace content {
-
-PepperVideoCaptureHost::PepperVideoCaptureHost(RendererPpapiHostImpl* host,
-                                               PP_Instance instance,
-                                               PP_Resource resource)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      renderer_ppapi_host_(host),
-      buffer_count_hint_(0),
-      status_(PP_VIDEO_CAPTURE_STATUS_STOPPED),
-      enumeration_helper_(this,
-                          PepperMediaDeviceManager::GetForRenderFrame(
-                              host->GetRenderFrameForInstance(pp_instance())),
-                          PP_DEVICETYPE_DEV_VIDEOCAPTURE,
-                          host->GetDocumentURL(instance)) {
-}
-
-PepperVideoCaptureHost::~PepperVideoCaptureHost() {
-  Close();
-}
-
-bool PepperVideoCaptureHost::Init() {
-  return !!renderer_ppapi_host_->GetPluginInstance(pp_instance());
-}
-
-int32_t PepperVideoCaptureHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    ppapi::host::HostMessageContext* context) {
-  int32_t result = PP_ERROR_FAILED;
-  if (enumeration_helper_.HandleResourceMessage(msg, context, &result))
-    return result;
-
-  PPAPI_BEGIN_MESSAGE_MAP(PepperVideoCaptureHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_VideoCapture_Open, OnOpen)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_VideoCapture_StartCapture,
-                                        OnStartCapture)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_VideoCapture_ReuseBuffer,
-                                      OnReuseBuffer)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_VideoCapture_StopCapture,
-                                        OnStopCapture)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_VideoCapture_Close,
-                                        OnClose)
-  PPAPI_END_MESSAGE_MAP()
-  return PP_ERROR_FAILED;
-}
-
-void PepperVideoCaptureHost::OnInitialized(bool succeeded) {
-  if (succeeded) {
-    open_reply_context_.params.set_result(PP_OK);
-  } else {
-    DetachPlatformVideoCapture();
-    open_reply_context_.params.set_result(PP_ERROR_FAILED);
-  }
-
-  host()->SendReply(open_reply_context_,
-                    PpapiPluginMsg_VideoCapture_OpenReply());
-}
-
-void PepperVideoCaptureHost::OnStarted() {
-  if (SetStatus(PP_VIDEO_CAPTURE_STATUS_STARTED, false))
-    SendStatus();
-}
-
-void PepperVideoCaptureHost::OnStopped() {
-  if (SetStatus(PP_VIDEO_CAPTURE_STATUS_STOPPED, false))
-    SendStatus();
-}
-
-void PepperVideoCaptureHost::OnPaused() {
-  if (SetStatus(PP_VIDEO_CAPTURE_STATUS_PAUSED, false))
-    SendStatus();
-}
-
-void PepperVideoCaptureHost::OnError() {
-  PostErrorReply();
-}
-
-void PepperVideoCaptureHost::PostErrorReply() {
-  // It either comes because some error was detected while starting (e.g. 2
-  // conflicting "master" resolution), or because the browser failed to start
-  // the capture.
-  SetStatus(PP_VIDEO_CAPTURE_STATUS_STOPPED, true);
-  host()->SendUnsolicitedReply(
-      pp_resource(),
-      PpapiPluginMsg_VideoCapture_OnError(
-          static_cast<uint32_t>(PP_ERROR_FAILED)));
-}
-
-void PepperVideoCaptureHost::OnFrameReady(
-    scoped_refptr<media::VideoFrame> frame) {
-  if (alloc_size_ != frame->visible_rect().size() || buffers_.empty()) {
-    alloc_size_ = frame->visible_rect().size();
-    int rounded_frame_rate;
-    if (frame->metadata().frame_rate.has_value()) {
-      rounded_frame_rate =
-          static_cast<int>(*frame->metadata().frame_rate + 0.5 /* round */);
-    } else {
-      rounded_frame_rate = blink::MediaStreamVideoSource::kUnknownFrameRate;
-    }
-    AllocBuffers(alloc_size_, rounded_frame_rate);
-  }
-
-  for (uint32_t i = 0; i < buffers_.size(); ++i) {
-    if (!buffers_[i].in_use) {
-      if (buffers_[i].buffer->size() <
-          media::VideoFrame::AllocationSize(media::PIXEL_FORMAT_I420,
-                                            alloc_size_)) {
-        // TODO(ihf): handle size mismatches gracefully here.
-        return;
-      }
-      uint8_t* dst = reinterpret_cast<uint8_t*>(buffers_[i].data.get());
-      static_assert(media::VideoFrame::Plane::kY == 0, "y plane should be 0");
-      static_assert(media::VideoFrame::Plane::kU == 1, "u plane should be 1");
-      static_assert(media::VideoFrame::Plane::kV == 2, "v plane should be 2");
-
-      if (frame->storage_type() ==
-          media::VideoFrame::STORAGE_GPU_MEMORY_BUFFER) {
-        // NV12 is the only supported GMB pixel format at the moment.
-        DCHECK_EQ(frame->format(), media::PIXEL_FORMAT_NV12);
-        scoped_refptr<media::VideoFrame> mapped_frame =
-            media::ConvertToMemoryMappedFrame(frame);
-        if (!mapped_frame) {
-          DLOG(ERROR) << "VideoFrame failed to map";
-          return;
-        }
-        scoped_refptr<media::VideoFrame> dst_frame =
-            media::VideoFrame::WrapExternalData(
-                media::PIXEL_FORMAT_I420, frame->natural_size(),
-                gfx::Rect(frame->natural_size()), frame->natural_size(), dst,
-                buffers_[i].buffer->size(), frame->timestamp());
-        media::EncoderStatus status =
-            frame_converter_.ConvertAndScale(*mapped_frame, *dst_frame);
-        if (!status.is_ok()) {
-          return;
-        }
-      } else {
-        DCHECK_EQ(frame->format(), media::PIXEL_FORMAT_I420);
-        size_t num_planes = media::VideoFrame::NumPlanes(frame->format());
-        for (size_t plane = 0; plane < num_planes; ++plane) {
-          const uint8_t* src = frame->visible_data(plane);
-          int row_bytes = frame->row_bytes(plane);
-          int src_stride = frame->stride(plane);
-          int rows = frame->rows(plane);
-          libyuv::CopyPlane(src, src_stride, dst, row_bytes, row_bytes, rows);
-        }
-      }
-
-      buffers_[i].in_use = true;
-      host()->SendUnsolicitedReply(
-          pp_resource(), PpapiPluginMsg_VideoCapture_OnBufferReady(i));
-      return;
-    }
-  }
-}
-
-void PepperVideoCaptureHost::AllocBuffers(const gfx::Size& resolution,
-                                          int frame_rate) {
-  PP_VideoCaptureDeviceInfo_Dev info = {
-      static_cast<uint32_t>(resolution.width()),
-      static_cast<uint32_t>(resolution.height()),
-      static_cast<uint32_t>(frame_rate)};
-  ReleaseBuffers();
-
-  const size_t size = media::VideoFrame::AllocationSize(
-      media::PIXEL_FORMAT_I420, gfx::Size(info.width, info.height));
-
-  ppapi::proxy::ResourceMessageReplyParams params(pp_resource(), 0);
-
-  // Allocate buffers. We keep a reference to them, that is released in
-  // ReleaseBuffers. In the mean time, we prepare the resource and handle here
-  // for sending below.
-  std::vector<HostResource> buffer_host_resources;
-  buffers_.reserve(buffer_count_hint_);
-  ppapi::ResourceTracker* tracker = HostGlobals::Get()->GetResourceTracker();
-  ppapi::proxy::HostDispatcher* dispatcher =
-      ppapi::proxy::HostDispatcher::GetForInstance(pp_instance());
-  for (size_t i = 0; i < buffer_count_hint_; ++i) {
-    PP_Resource res = PPB_Buffer_Impl::Create(pp_instance(), size);
-    if (!res)
-      break;
-
-    EnterResourceNoLock<PPB_Buffer_API> enter(res, true);
-    DCHECK(enter.succeeded());
-
-    BufferInfo buf;
-    buf.buffer = static_cast<PPB_Buffer_Impl*>(enter.object());
-    buf.data = buf.buffer->Map();
-    if (!buf.data) {
-      tracker->ReleaseResource(res);
-      break;
-    }
-    buffers_.push_back(buf);
-
-    // Add to HostResource array to be sent.
-    {
-      HostResource host_resource;
-      host_resource.SetHostResource(pp_instance(), res);
-      buffer_host_resources.push_back(host_resource);
-
-      // Add a reference for the plugin, which is resposible for releasing it.
-      tracker->AddRefResource(res);
-    }
-
-    // Add the serialized shared memory handle to params. FileDescriptor is
-    // treated in special case.
-    {
-      EnterResourceNoLock<PPB_Buffer_API> enter2(res, true);
-      DCHECK(enter2.succeeded());
-      base::UnsafeSharedMemoryRegion* shm;
-      int32_t result = enter2.object()->GetSharedMemory(&shm);
-      DCHECK(result == PP_OK);
-      params.AppendHandle(ppapi::proxy::SerializedHandle(
-          dispatcher->ShareUnsafeSharedMemoryRegionWithRemote(*shm)));
-    }
-  }
-
-  if (buffers_.empty()) {
-    // We couldn't allocate/map buffers at all. Send an error and stop the
-    // capture.
-    SetStatus(PP_VIDEO_CAPTURE_STATUS_STOPPING, true);
-    platform_video_capture_->StopCapture();
-    PostErrorReply();
-    return;
-  }
-
-  host()->Send(
-      new PpapiPluginMsg_ResourceReply(params,
-                                       PpapiPluginMsg_VideoCapture_OnDeviceInfo(
-                                           info, buffer_host_resources, size)));
-}
-
-int32_t PepperVideoCaptureHost::OnOpen(
-    ppapi::host::HostMessageContext* context,
-    const std::string& device_id,
-    const PP_VideoCaptureDeviceInfo_Dev& requested_info,
-    uint32_t buffer_count) {
-  if (platform_video_capture_.get())
-    return PP_ERROR_FAILED;
-
-  SetRequestedInfo(requested_info, buffer_count);
-
-  GURL document_url = renderer_ppapi_host_->GetDocumentURL(pp_instance());
-  if (!document_url.is_valid())
-    return PP_ERROR_FAILED;
-
-  platform_video_capture_ = std::make_unique<PepperPlatformVideoCapture>(
-      renderer_ppapi_host_->GetRenderFrameForInstance(pp_instance())
-          ->GetRoutingID(),
-      device_id, this);
-
-  open_reply_context_ = context->MakeReplyMessageContext();
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperVideoCaptureHost::OnStartCapture(
-    ppapi::host::HostMessageContext* context) {
-  if (!SetStatus(PP_VIDEO_CAPTURE_STATUS_STARTING, false) ||
-      !platform_video_capture_.get())
-    return PP_ERROR_FAILED;
-
-  DCHECK(buffers_.empty());
-
-  // It's safe to call this regardless it's capturing or not, because
-  // PepperPlatformVideoCapture maintains the state.
-  platform_video_capture_->StartCapture(video_capture_params_);
-  return PP_OK;
-}
-
-int32_t PepperVideoCaptureHost::OnReuseBuffer(
-    ppapi::host::HostMessageContext* context,
-    uint32_t buffer) {
-  if (buffer >= buffers_.size() || !buffers_[buffer].in_use)
-    return PP_ERROR_BADARGUMENT;
-  buffers_[buffer].in_use = false;
-  return PP_OK;
-}
-
-int32_t PepperVideoCaptureHost::OnStopCapture(
-    ppapi::host::HostMessageContext* context) {
-  return StopCapture();
-}
-
-int32_t PepperVideoCaptureHost::OnClose(
-    ppapi::host::HostMessageContext* context) {
-  return Close();
-}
-
-int32_t PepperVideoCaptureHost::StopCapture() {
-  if (!SetStatus(PP_VIDEO_CAPTURE_STATUS_STOPPING, false))
-    return PP_ERROR_FAILED;
-
-  DCHECK(platform_video_capture_.get());
-
-  ReleaseBuffers();
-  // It's safe to call this regardless it's capturing or not, because
-  // PepperPlatformVideoCapture maintains the state.
-  platform_video_capture_->StopCapture();
-  return PP_OK;
-}
-
-int32_t PepperVideoCaptureHost::Close() {
-  if (!platform_video_capture_.get())
-    return PP_OK;
-
-  StopCapture();
-  DCHECK(buffers_.empty());
-  DetachPlatformVideoCapture();
-  return PP_OK;
-}
-
-void PepperVideoCaptureHost::ReleaseBuffers() {
-  ppapi::ResourceTracker* tracker = HostGlobals::Get()->GetResourceTracker();
-  for (size_t i = 0; i < buffers_.size(); ++i) {
-    buffers_[i].buffer->Unmap();
-    tracker->ReleaseResource(buffers_[i].buffer->pp_resource());
-  }
-  buffers_.clear();
-}
-
-void PepperVideoCaptureHost::SendStatus() {
-  host()->SendUnsolicitedReply(pp_resource(),
-                               PpapiPluginMsg_VideoCapture_OnStatus(status_));
-}
-
-void PepperVideoCaptureHost::SetRequestedInfo(
-    const PP_VideoCaptureDeviceInfo_Dev& device_info,
-    uint32_t buffer_count) {
-  // Clamp the buffer count to between 1 and |kMaxBuffers|.
-  buffer_count_hint_ = std::clamp(buffer_count, 1U, kMaxBuffers);
-  // Clamp the frame rate to between 1 and |kMaxFramesPerSecond - 1|.
-  int frames_per_second =
-      std::clamp(device_info.frames_per_second, 1U,
-                 uint32_t{media::limits::kMaxFramesPerSecond - 1});
-
-  video_capture_params_.requested_format = media::VideoCaptureFormat(
-      gfx::Size(device_info.width, device_info.height), frames_per_second,
-      media::PIXEL_FORMAT_I420);
-}
-
-void PepperVideoCaptureHost::DetachPlatformVideoCapture() {
-  if (platform_video_capture_) {
-    platform_video_capture_->DetachEventHandler();
-    platform_video_capture_.reset();
-  }
-}
-
-bool PepperVideoCaptureHost::SetStatus(PP_VideoCaptureStatus_Dev status,
-                                       bool forced) {
-  if (!forced) {
-    switch (status) {
-      case PP_VIDEO_CAPTURE_STATUS_STOPPED:
-        if (status_ != PP_VIDEO_CAPTURE_STATUS_STOPPING)
-          return false;
-        break;
-      case PP_VIDEO_CAPTURE_STATUS_STARTING:
-        if (status_ != PP_VIDEO_CAPTURE_STATUS_STOPPED)
-          return false;
-        break;
-      case PP_VIDEO_CAPTURE_STATUS_STARTED:
-        switch (status_) {
-          case PP_VIDEO_CAPTURE_STATUS_STARTING:
-          case PP_VIDEO_CAPTURE_STATUS_PAUSED:
-            break;
-          default:
-            return false;
-        }
-        break;
-      case PP_VIDEO_CAPTURE_STATUS_PAUSED:
-        switch (status_) {
-          case PP_VIDEO_CAPTURE_STATUS_STARTING:
-          case PP_VIDEO_CAPTURE_STATUS_STARTED:
-            break;
-          default:
-            return false;
-        }
-        break;
-      case PP_VIDEO_CAPTURE_STATUS_STOPPING:
-        switch (status_) {
-          case PP_VIDEO_CAPTURE_STATUS_STARTING:
-          case PP_VIDEO_CAPTURE_STATUS_STARTED:
-          case PP_VIDEO_CAPTURE_STATUS_PAUSED:
-            break;
-          default:
-            return false;
-        }
-        break;
-    }
-  }
-
-  status_ = status;
-  return true;
-}
-
-PepperVideoCaptureHost::BufferInfo::BufferInfo()
-    : in_use(false), data(nullptr), buffer() {}
-
-PepperVideoCaptureHost::BufferInfo::BufferInfo(const BufferInfo& other) =
-    default;
-
-PepperVideoCaptureHost::BufferInfo::~BufferInfo() {
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_video_capture_host.h b/content/renderer/pepper/pepper_video_capture_host.h
deleted file mode 100644
index 976e28f..0000000
--- a/content/renderer/pepper/pepper_video_capture_host.h
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_CAPTURE_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_CAPTURE_HOST_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/pepper_device_enumeration_host_helper.h"
-#include "content/renderer/pepper/ppb_buffer_impl.h"
-#include "media/base/video_frame_converter.h"
-#include "media/capture/video_capture_types.h"
-#include "ppapi/c/dev/ppp_video_capture_dev.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/resource_host.h"
-#include "third_party/blink/public/platform/media/video_capture.h"
-
-namespace media {
-class VideoFrame;
-}  // namespace media
-
-namespace content {
-class PepperPlatformVideoCapture;
-class RendererPpapiHostImpl;
-
-class PepperVideoCaptureHost : public ppapi::host::ResourceHost {
- public:
-  PepperVideoCaptureHost(RendererPpapiHostImpl* host,
-                         PP_Instance instance,
-                         PP_Resource resource);
-
-  PepperVideoCaptureHost(const PepperVideoCaptureHost&) = delete;
-  PepperVideoCaptureHost& operator=(const PepperVideoCaptureHost&) = delete;
-
-  ~PepperVideoCaptureHost() override;
-
-  bool Init();
-
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-
-  // These methods are called by PepperPlatformVideoCapture only.
-
-  // Called when video capture is initialized. We can start
-  // video capture if |succeeded| is true.
-  void OnInitialized(bool succeeded);
-
-  // Called when video capture has started successfully.
-  void OnStarted();
-
-  // Called when video capture has stopped. There will be no more
-  // frames delivered.
-  void OnStopped();
-
-  // Called when video capture has paused.
-  void OnPaused();
-
-  // Called when video capture cannot be started because of an error.
-  void OnError();
-
-  // Called when a video frame is ready.
-  void OnFrameReady(scoped_refptr<media::VideoFrame> frame);
-
- private:
-  int32_t OnOpen(ppapi::host::HostMessageContext* context,
-                 const std::string& device_id,
-                 const PP_VideoCaptureDeviceInfo_Dev& requested_info,
-                 uint32_t buffer_count);
-  int32_t OnStartCapture(ppapi::host::HostMessageContext* context);
-  int32_t OnReuseBuffer(ppapi::host::HostMessageContext* context,
-                        uint32_t buffer);
-  int32_t OnStopCapture(ppapi::host::HostMessageContext* context);
-  int32_t OnClose(ppapi::host::HostMessageContext* context);
-
-  int32_t StopCapture();
-  int32_t Close();
-  void PostErrorReply();
-  void AllocBuffers(const gfx::Size& resolution, int frame_rate);
-  void ReleaseBuffers();
-  void SendStatus();
-
-  void SetRequestedInfo(const PP_VideoCaptureDeviceInfo_Dev& device_info,
-                        uint32_t buffer_count);
-
-  void DetachPlatformVideoCapture();
-
-  bool SetStatus(PP_VideoCaptureStatus_Dev status, bool forced);
-
-  std::unique_ptr<PepperPlatformVideoCapture> platform_video_capture_;
-
-  // Buffers of video frame.
-  struct BufferInfo {
-    BufferInfo();
-    BufferInfo(const BufferInfo& other);
-    ~BufferInfo();
-
-    bool in_use;
-    raw_ptr<void> data;
-    scoped_refptr<PPB_Buffer_Impl> buffer;
-  };
-
-  raw_ptr<RendererPpapiHostImpl> renderer_ppapi_host_;
-
-  gfx::Size alloc_size_;
-  std::vector<BufferInfo> buffers_;
-  size_t buffer_count_hint_;
-
-  media::VideoCaptureParams video_capture_params_;
-
-  PP_VideoCaptureStatus_Dev status_;
-
-  ppapi::host::ReplyMessageContext open_reply_context_;
-
-  PepperDeviceEnumerationHostHelper enumeration_helper_;
-
-  media::VideoFrameConverter frame_converter_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_CAPTURE_HOST_H_
diff --git a/content/renderer/pepper/pepper_video_decoder_host.cc b/content/renderer/pepper/pepper_video_decoder_host.cc
deleted file mode 100644
index 2f797f7..0000000
--- a/content/renderer/pepper/pepper_video_decoder_host.cc
+++ /dev/null
@@ -1,622 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_video_decoder_host.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-
-#include "base/command_line.h"
-#include "base/containers/contains.h"
-#include "base/functional/bind.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "base/metrics/histogram_functions.h"
-#include "build/build_config.h"
-#include "content/common/pepper_file_util.h"
-#include "content/public/common/content_client.h"
-#include "content/public/renderer/content_renderer_client.h"
-#include "content/public/renderer/ppapi_gfx_conversion.h"
-#include "content/public/renderer/render_thread.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/ppb_graphics_3d_impl.h"
-#include "content/renderer/pepper/video_decoder_shim.h"
-#include "content/renderer/render_thread_impl.h"
-#include "gpu/command_buffer/client/client_shared_image.h"
-#include "gpu/command_buffer/client/raster_interface.h"
-#include "gpu/command_buffer/common/shared_image_usage.h"
-#include "gpu/ipc/client/command_buffer_proxy_impl.h"
-#include "media/base/limits.h"
-#include "media/base/media_util.h"
-#include "media/video/video_decode_accelerator.h"
-#include "ppapi/c/pp_completion_callback.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/proxy/video_decoder_constants.h"
-#include "ppapi/thunk/enter.h"
-#include "ppapi/thunk/ppb_graphics_3d_api.h"
-
-using ppapi::proxy::SerializedHandle;
-using ppapi::thunk::EnterResourceNoLock;
-using ppapi::thunk::PPB_Graphics3D_API;
-
-namespace content {
-
-namespace {
-
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-enum class HardwareAccelerationBehavior : int {
-  kOther = 0,
-
-  // The PepperVideoDecoderHost used a hardware decoder backed by the legacy
-  // VideoDecodeAccelerator path from beginning to end.
-  kHardwareDecoderOnlyWithoutMojoVideoDecoder = 1,
-
-  // The PepperVideoDecoderHost initialized (and possibly started using) a
-  // hardware decoder backed by the legacy VideoDecodeAccelerator path but then
-  // fell back to software decoding.
-  kHardwareDecoderWithoutMojoVideoDecoderAndThenSoftwareDecoder = 2,
-
-  // The PepperVideoDecoderHost used a hardware decoder backed by the newer
-  // MojoVideoDecoder path from beginning to end.
-  kHardwareDecoderOnlyWithMojoVideoDecoder = 3,
-
-  // The PepperVideoDecoderHost initialized (and possibly started using) a
-  // hardware decoder backed by the newer MojoVideoDecoder path but then fell
-  // back to software decoding.
-  kHardwareDecoderWithMojoVideoDecoderAndThenSoftwareDecoder = 4,
-
-  // The PepperVideoDecoderHost used a software video decoder from beginning to
-  // end.
-  kSoftwareDecoderOnly = 5,
-
-  kMaxValue = kSoftwareDecoderOnly
-};
-
-media::VideoCodecProfile PepperToMediaVideoProfile(PP_VideoProfile profile) {
-  switch (profile) {
-    case PP_VIDEOPROFILE_H264BASELINE:
-      return media::H264PROFILE_BASELINE;
-    case PP_VIDEOPROFILE_H264MAIN:
-      return media::H264PROFILE_MAIN;
-    case PP_VIDEOPROFILE_H264EXTENDED:
-      return media::H264PROFILE_EXTENDED;
-    case PP_VIDEOPROFILE_H264HIGH:
-      return media::H264PROFILE_HIGH;
-    case PP_VIDEOPROFILE_H264HIGH10PROFILE:
-      return media::H264PROFILE_HIGH10PROFILE;
-    case PP_VIDEOPROFILE_H264HIGH422PROFILE:
-      return media::H264PROFILE_HIGH422PROFILE;
-    case PP_VIDEOPROFILE_H264HIGH444PREDICTIVEPROFILE:
-      return media::H264PROFILE_HIGH444PREDICTIVEPROFILE;
-    case PP_VIDEOPROFILE_H264SCALABLEBASELINE:
-      return media::H264PROFILE_SCALABLEBASELINE;
-    case PP_VIDEOPROFILE_H264SCALABLEHIGH:
-      return media::H264PROFILE_SCALABLEHIGH;
-    case PP_VIDEOPROFILE_H264STEREOHIGH:
-      return media::H264PROFILE_STEREOHIGH;
-    case PP_VIDEOPROFILE_H264MULTIVIEWHIGH:
-      return media::H264PROFILE_MULTIVIEWHIGH;
-    case PP_VIDEOPROFILE_VP8_ANY:
-      return media::VP8PROFILE_ANY;
-    case PP_VIDEOPROFILE_VP9_ANY:
-      return media::VP9PROFILE_PROFILE0;
-    // No default case, to catch unhandled PP_VideoProfile values.
-  }
-
-  return media::VIDEO_CODEC_PROFILE_UNKNOWN;
-}
-
-}  // namespace
-
-PepperVideoDecoderHost::PendingDecode::PendingDecode(
-    int32_t decode_id,
-    uint32_t shm_id,
-    uint32_t size,
-    const ppapi::host::ReplyMessageContext& reply_context)
-    : decode_id(decode_id),
-      shm_id(shm_id),
-      size(size),
-      reply_context(reply_context) {}
-
-PepperVideoDecoderHost::PendingDecode::~PendingDecode() {}
-
-PepperVideoDecoderHost::MappedBuffer::MappedBuffer(
-    base::UnsafeSharedMemoryRegion region,
-    base::WritableSharedMemoryMapping mapping)
-    : region(std::move(region)), mapping(std::move(mapping)) {}
-
-PepperVideoDecoderHost::MappedBuffer::~MappedBuffer() {}
-
-PepperVideoDecoderHost::MappedBuffer::MappedBuffer(MappedBuffer&&) = default;
-PepperVideoDecoderHost::MappedBuffer& PepperVideoDecoderHost::MappedBuffer::
-operator=(MappedBuffer&&) = default;
-
-PepperVideoDecoderHost::SharedImage::SharedImage(
-    gfx::Size size,
-    PictureBufferState state,
-    scoped_refptr<gpu::ClientSharedImage> client_shared_image)
-    : size(size),
-      state(state),
-      client_shared_image(std::move(client_shared_image)) {}
-
-PepperVideoDecoderHost::SharedImage::SharedImage(
-    const SharedImage& shared_image) = default;
-
-PepperVideoDecoderHost::SharedImage::~SharedImage() = default;
-
-PepperVideoDecoderHost::PepperVideoDecoderHost(RendererPpapiHost* host,
-                                               PP_Instance instance,
-                                               PP_Resource resource)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      renderer_ppapi_host_(host) {}
-
-PepperVideoDecoderHost::~PepperVideoDecoderHost() {
-  if (decoder_) {
-    scoped_refptr<viz::RasterContextProvider> context_provider =
-        decoder_->context_provider();
-    // Destroy `decoder_`, so it will destroy all available shared images.
-    decoder_->Destroy();
-
-    // If video decoder was destroyed before plugin returned all shared images,
-    // this is our last chance to destroy them.
-    if (!shared_images_.empty()) {
-      CHECK(context_provider);
-      // Plugin's GLES2Interface and Renderer's RasterInterface are synchronized
-      // by issued `ShallowFlushCHROMIUM` after each work. To synchronize with
-      // SharedImageInterface we generate sync token here.
-      gpu::SyncToken sync_token;
-      context_provider->RasterInterface()->GenUnverifiedSyncTokenCHROMIUM(
-          sync_token.GetData());
-
-      auto* sii = context_provider->SharedImageInterface();
-
-      for (auto& shared_image : shared_images_) {
-        // All assigned textures should have been destroyed by `decoder_`
-        CHECK_NE(shared_image.second.state, PictureBufferState::ASSIGNED);
-        sii->DestroySharedImage(
-            sync_token, std::move(shared_image.second.client_shared_image));
-      }
-    }
-  }
-
-  auto hw_behavior = HardwareAccelerationBehavior::kOther;
-  if (software_fallback_used_) {
-    if (mojo_video_decoder_path_initialized_) {
-      hw_behavior = HardwareAccelerationBehavior::
-          kHardwareDecoderWithMojoVideoDecoderAndThenSoftwareDecoder;
-    } else {
-      hw_behavior = HardwareAccelerationBehavior::kSoftwareDecoderOnly;
-    }
-  } else if (mojo_video_decoder_path_initialized_) {
-    hw_behavior =
-        HardwareAccelerationBehavior::kHardwareDecoderOnlyWithMojoVideoDecoder;
-  }
-
-  base::UmaHistogramEnumeration(
-      "Media.PepperVideoDecoder.HardwareAccelerationBehavior", hw_behavior);
-}
-
-int32_t PepperVideoDecoderHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    ppapi::host::HostMessageContext* context) {
-  PPAPI_BEGIN_MESSAGE_MAP(PepperVideoDecoderHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_VideoDecoder_Initialize,
-                                      OnHostMsgInitialize)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_VideoDecoder_GetShm,
-                                      OnHostMsgGetShm)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_VideoDecoder_Decode,
-                                      OnHostMsgDecode)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(
-        PpapiHostMsg_VideoDecoder_RecycleSharedImage,
-        OnHostMsgRecycleSharedImage)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_VideoDecoder_Flush,
-                                        OnHostMsgFlush)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_VideoDecoder_Reset,
-                                        OnHostMsgReset)
-  PPAPI_END_MESSAGE_MAP()
-  return PP_ERROR_FAILED;
-}
-
-int32_t PepperVideoDecoderHost::OnHostMsgInitialize(
-    ppapi::host::HostMessageContext* context,
-    const ppapi::HostResource& graphics_context,
-    PP_VideoProfile profile,
-    PP_HardwareAcceleration acceleration,
-    uint32_t min_picture_count) {
-  if (initialized_)
-    return PP_ERROR_FAILED;
-  if (min_picture_count > ppapi::proxy::kMaximumPictureCount)
-    return PP_ERROR_BADARGUMENT;
-
-  EnterResourceNoLock<PPB_Graphics3D_API> enter_graphics(
-      graphics_context.host_resource(), true);
-  if (enter_graphics.failed())
-    return PP_ERROR_FAILED;
-  PPB_Graphics3D_Impl* graphics3d =
-      static_cast<PPB_Graphics3D_Impl*>(enter_graphics.object());
-
-  gpu::CommandBufferProxyImpl* command_buffer =
-      graphics3d->GetCommandBufferProxy();
-  if (!command_buffer)
-    return PP_ERROR_FAILED;
-
-  profile_ = PepperToMediaVideoProfile(profile);
-  software_fallback_allowed_ = (acceleration != PP_HARDWAREACCELERATION_ONLY);
-
-  min_picture_count_ = min_picture_count;
-
-  if (acceleration != PP_HARDWAREACCELERATION_NONE) {
-    uint32_t shim_texture_pool_size = media::limits::kMaxVideoFrames + 1;
-    shim_texture_pool_size =
-        std::max(shim_texture_pool_size, min_picture_count_);
-    auto new_decoder = VideoDecoderShim::Create(this, shim_texture_pool_size,
-                                                /*use_hw_decoder=*/true);
-    if (new_decoder && new_decoder->Initialize(profile_)) {
-      decoder_ = std::move(new_decoder);
-      initialized_ = true;
-      mojo_video_decoder_path_initialized_ = true;
-      return PP_OK;
-    }
-
-    decoder_.reset();
-    if (acceleration == PP_HARDWAREACCELERATION_ONLY)
-      return PP_ERROR_NOTSUPPORTED;
-  }
-
-#if BUILDFLAG(IS_ANDROID)
-  return PP_ERROR_NOTSUPPORTED;
-#else
-  if (!TryFallbackToSoftwareDecoder())
-    return PP_ERROR_FAILED;
-
-  initialized_ = true;
-  return PP_OK;
-#endif
-}
-
-int32_t PepperVideoDecoderHost::OnHostMsgGetShm(
-    ppapi::host::HostMessageContext* context,
-    uint32_t shm_id,
-    uint32_t shm_size) {
-  if (!initialized_)
-    return PP_ERROR_FAILED;
-
-  // Make the buffers larger since we hope to reuse them.
-  shm_size = std::max(
-      shm_size,
-      static_cast<uint32_t>(ppapi::proxy::kMinimumBitstreamBufferSize));
-  if (shm_size > ppapi::proxy::kMaximumBitstreamBufferSize)
-    return PP_ERROR_FAILED;
-
-  if (shm_id >= ppapi::proxy::kMaximumPendingDecodes)
-    return PP_ERROR_FAILED;
-  // The shm_id must be inside or at the end of shm_buffers_.
-  if (shm_id > shm_buffers_.size())
-    return PP_ERROR_FAILED;
-  // Reject an attempt to reallocate a busy shm buffer.
-  if (shm_id < shm_buffers_.size() && shm_buffers_[shm_id].busy)
-    return PP_ERROR_FAILED;
-
-  auto shm = base::UnsafeSharedMemoryRegion::Create(shm_size);
-  auto mapping = shm.Map();
-  if (!shm.IsValid() || !mapping.IsValid())
-    return PP_ERROR_FAILED;
-
-  SerializedHandle handle(
-      base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
-          renderer_ppapi_host_->ShareUnsafeSharedMemoryRegionWithRemote(shm)));
-  if (shm_id == shm_buffers_.size()) {
-    shm_buffers_.emplace_back(std::move(shm), std::move(mapping));
-  } else {
-    // Note by the check above this buffer cannot be busy.
-    shm_buffers_[shm_id] = MappedBuffer(std::move(shm), std::move(mapping));
-  }
-
-  ppapi::host::ReplyMessageContext reply_context =
-      context->MakeReplyMessageContext();
-  reply_context.params.AppendHandle(std::move(handle));
-  host()->SendReply(reply_context,
-                    PpapiPluginMsg_VideoDecoder_GetShmReply(shm_size));
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperVideoDecoderHost::OnHostMsgDecode(
-    ppapi::host::HostMessageContext* context,
-    uint32_t shm_id,
-    uint32_t size,
-    int32_t decode_id) {
-  if (!initialized_)
-    return PP_ERROR_FAILED;
-  DCHECK(decoder_);
-  // |shm_id| is just an index into shm_buffers_. Make sure it's in range.
-  if (static_cast<size_t>(shm_id) >= shm_buffers_.size())
-    return PP_ERROR_FAILED;
-  // Reject an attempt to pass a busy buffer to the decoder again.
-  if (shm_buffers_[shm_id].busy)
-    return PP_ERROR_FAILED;
-  // Reject non-unique decode_id values.
-  if (GetPendingDecodeById(decode_id) != pending_decodes_.end())
-    return PP_ERROR_FAILED;
-
-  if (flush_reply_context_.is_valid() || reset_reply_context_.is_valid())
-    return PP_ERROR_FAILED;
-
-  pending_decodes_.push_back(PendingDecode(decode_id, shm_id, size,
-                                           context->MakeReplyMessageContext()));
-
-  shm_buffers_[shm_id].busy = true;
-  decoder_->Decode(media::BitstreamBuffer(
-      decode_id, shm_buffers_[shm_id].region.Duplicate(), size));
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperVideoDecoderHost::OnHostMsgRecycleSharedImage(
-    ppapi::host::HostMessageContext* context,
-    const gpu::Mailbox& mailbox) {
-  if (!initialized_) {
-    return PP_ERROR_FAILED;
-  }
-
-  DCHECK(decoder_);
-
-  auto it = shared_images_.find(mailbox);
-  if (it == shared_images_.end()) {
-    return PP_ERROR_BADARGUMENT;
-  }
-
-  switch (it->second.state) {
-    case PictureBufferState::ASSIGNED:
-      return PP_ERROR_BADARGUMENT;
-
-    case PictureBufferState::IN_USE:
-      it->second.state = PictureBufferState::ASSIGNED;
-      decoder_->ReuseSharedImage(mailbox, it->second.size);
-      break;
-
-    case PictureBufferState::DISMISSED:
-      DestroySharedImageInternal(it);
-      break;
-  }
-
-  return PP_OK;
-}
-
-int32_t PepperVideoDecoderHost::OnHostMsgFlush(
-    ppapi::host::HostMessageContext* context) {
-  if (!initialized_)
-    return PP_ERROR_FAILED;
-  DCHECK(decoder_);
-  if (flush_reply_context_.is_valid() || reset_reply_context_.is_valid())
-    return PP_ERROR_FAILED;
-
-  flush_reply_context_ = context->MakeReplyMessageContext();
-  decoder_->Flush();
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperVideoDecoderHost::OnHostMsgReset(
-    ppapi::host::HostMessageContext* context) {
-  if (!initialized_)
-    return PP_ERROR_FAILED;
-  DCHECK(decoder_);
-  if (flush_reply_context_.is_valid() || reset_reply_context_.is_valid())
-    return PP_ERROR_FAILED;
-
-  reset_reply_context_ = context->MakeReplyMessageContext();
-  decoder_->Reset();
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-gpu::Mailbox PepperVideoDecoderHost::CreateSharedImage(gfx::Size size) {
-  CHECK(decoder_);
-  const auto& context_provider = decoder_->context_provider();
-  CHECK(context_provider);
-
-  auto* sii = context_provider->SharedImageInterface();
-  auto* rii = context_provider->RasterInterface();
-
-  // These shared images have the contents of VideoFrames copied into them via
-  // the raster interface and then are read and/or written by the plugin via GL.
-  auto client_shared_image = sii->CreateSharedImage(
-      {viz::SinglePlaneFormat::kRGBA_8888, size, gfx::ColorSpace(),
-       kTopLeft_GrSurfaceOrigin, kOpaque_SkAlphaType,
-       gpu::SHARED_IMAGE_USAGE_GLES2_READ |
-           gpu::SHARED_IMAGE_USAGE_GLES2_WRITE |
-           gpu::SHARED_IMAGE_USAGE_RASTER_WRITE,
-       "PepperVideoDecoder"},
-      gpu::SurfaceHandle());
-  CHECK(client_shared_image);
-  auto mailbox = client_shared_image->mailbox();
-
-  // This SI will be used on raster interface later, to avoid plumbing
-  // SyncTokens just for creation wait on it here.
-  rii->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData());
-
-  shared_images_.emplace(mailbox,
-                         SharedImage{size, PictureBufferState::ASSIGNED,
-                                     std::move(client_shared_image)});
-  return mailbox;
-}
-
-void PepperVideoDecoderHost::DestroySharedImage(const gpu::Mailbox& mailbox) {
-  auto it = shared_images_.find(mailbox);
-  CHECK(it != shared_images_.end());
-
-  // VideoDecoderShim tracks only assigned images.
-  CHECK_EQ(it->second.state, PictureBufferState::ASSIGNED);
-  DestroySharedImageInternal(it);
-}
-
-void PepperVideoDecoderHost::DestroySharedImageInternal(
-    std::map<gpu::Mailbox, SharedImage>::iterator it) {
-  CHECK(decoder_);
-  const auto& context_provider = decoder_->context_provider();
-  CHECK(context_provider);
-
-  // Plugin's GLES2Interface and Renderer's RasterInterface are synchronized by
-  // issued `ShallowFlushCHROMIUM` after each work. To synchronize with
-  // SharedImageInterface we generate sync token here.
-  gpu::SyncToken sync_token;
-  context_provider->RasterInterface()->GenUnverifiedSyncTokenCHROMIUM(
-      sync_token.GetData());
-
-  auto* sii = context_provider->SharedImageInterface();
-  sii->DestroySharedImage(sync_token,
-                          std::move(it->second.client_shared_image));
-  shared_images_.erase(it);
-}
-
-void PepperVideoDecoderHost::SharedImageReady(int32_t bitstream_id,
-                                              const gpu::Mailbox& mailbox,
-                                              gfx::Size size,
-                                              const gfx::Rect& visible_rect) {
-  auto it = shared_images_.find(mailbox);
-  CHECK(it != shared_images_.end());
-  CHECK_EQ(it->second.state, PictureBufferState::ASSIGNED);
-  it->second.state = PictureBufferState::IN_USE;
-
-  host()->SendUnsolicitedReply(pp_resource(),
-                               PpapiPluginMsg_VideoDecoder_SharedImageReady(
-                                   bitstream_id, mailbox, PP_FromGfxSize(size),
-                                   PP_FromGfxRect(visible_rect)));
-}
-
-void PepperVideoDecoderHost::NotifyEndOfBitstreamBuffer(
-    int32_t bitstream_buffer_id) {
-  auto it = GetPendingDecodeById(bitstream_buffer_id);
-  if (it == pending_decodes_.end()) {
-    NOTREACHED();
-  }
-  host()->SendReply(it->reply_context,
-                    PpapiPluginMsg_VideoDecoder_DecodeReply(it->shm_id));
-  shm_buffers_[it->shm_id].busy = false;
-  pending_decodes_.erase(it);
-}
-
-void PepperVideoDecoderHost::NotifyFlushDone() {
-  DCHECK(pending_decodes_.empty());
-  host()->SendReply(flush_reply_context_,
-                    PpapiPluginMsg_VideoDecoder_FlushReply());
-  flush_reply_context_ = ppapi::host::ReplyMessageContext();
-}
-
-void PepperVideoDecoderHost::NotifyResetDone() {
-  DCHECK(pending_decodes_.empty());
-  host()->SendReply(reset_reply_context_,
-                    PpapiPluginMsg_VideoDecoder_ResetReply());
-  reset_reply_context_ = ppapi::host::ReplyMessageContext();
-}
-
-void PepperVideoDecoderHost::NotifyError(
-    media::VideoDecodeAccelerator::Error error) {
-  int32_t pp_error = PP_ERROR_FAILED;
-  switch (error) {
-    case media::VideoDecodeAccelerator::UNREADABLE_INPUT:
-      pp_error = PP_ERROR_MALFORMED_INPUT;
-      break;
-    case media::VideoDecodeAccelerator::ILLEGAL_STATE:
-    case media::VideoDecodeAccelerator::INVALID_ARGUMENT:
-    case media::VideoDecodeAccelerator::PLATFORM_FAILURE:
-      pp_error = PP_ERROR_RESOURCE_FAILED;
-      break;
-    // No default case, to catch unhandled enum values.
-  }
-
-  // Try to initialize software decoder and use it instead.
-  if (!software_fallback_used_ && software_fallback_allowed_) {
-    VLOG(0)
-        << "Hardware decoder has returned an error. Trying Software decoder.";
-    if (TryFallbackToSoftwareDecoder())
-      return;
-  }
-
-  host()->SendUnsolicitedReply(
-      pp_resource(), PpapiPluginMsg_VideoDecoder_NotifyError(pp_error));
-}
-
-const uint8_t* PepperVideoDecoderHost::DecodeIdToAddress(uint32_t decode_id) {
-  PendingDecodeList::const_iterator it = GetPendingDecodeById(decode_id);
-  CHECK(it != pending_decodes_.end());
-  uint32_t shm_id = it->shm_id;
-  return static_cast<uint8_t*>(shm_buffers_[shm_id].mapping.memory());
-}
-
-bool PepperVideoDecoderHost::TryFallbackToSoftwareDecoder() {
-#if BUILDFLAG(IS_ANDROID)
-  return false;
-#else
-  DCHECK(!software_fallback_used_ && software_fallback_allowed_);
-
-  uint32_t shim_texture_pool_size = media::limits::kMaxVideoFrames + 1;
-  shim_texture_pool_size = std::max(shim_texture_pool_size,
-                                    min_picture_count_);
-  std::unique_ptr<VideoDecoderShim> new_decoder(VideoDecoderShim::Create(
-      this, shim_texture_pool_size, /*use_hw_decoder=*/false));
-  if (!new_decoder || !new_decoder->Initialize(profile_)) {
-    return false;
-  }
-
-  software_fallback_used_ = true;
-
-  if (decoder_) {
-    decoder_->Destroy();
-    decoder_.reset();
-  }
-  decoder_ = std::move(new_decoder);
-
-  for (auto& shared_image : shared_images_) {
-    // All ASSIGNED images were deleted by decoder. And there shouldn't be any
-    // DISMISSED images yet, because it's set only in this function and this
-    // point can only be reached once.
-
-    CHECK_EQ(shared_image.second.state, PictureBufferState::IN_USE);
-    // Mark as dismissed and delete once plug-in returns them.
-    shared_image.second.state = PictureBufferState::DISMISSED;
-  }
-
-  // If there was a pending Reset() it can be finished now.
-  if (reset_reply_context_.is_valid()) {
-    while (!pending_decodes_.empty()) {
-      const PendingDecode& decode = pending_decodes_.front();
-      host()->SendReply(decode.reply_context,
-                        PpapiPluginMsg_VideoDecoder_DecodeReply(decode.shm_id));
-      DCHECK(shm_buffers_[decode.shm_id].busy);
-      shm_buffers_[decode.shm_id].busy = false;
-      pending_decodes_.pop_front();
-    }
-    NotifyResetDone();
-  }
-
-  // Resubmit all pending decodes.
-  for (const PendingDecode& decode : pending_decodes_) {
-    DCHECK(shm_buffers_[decode.shm_id].busy);
-    decoder_->Decode(media::BitstreamBuffer(
-        decode.decode_id, shm_buffers_[decode.shm_id].region.Duplicate(),
-        decode.size));
-  }
-
-  // Flush the new decoder if Flush() was pending.
-  if (flush_reply_context_.is_valid())
-    decoder_->Flush();
-
-  return true;
-#endif
-}
-
-PepperVideoDecoderHost::PendingDecodeList::iterator
-PepperVideoDecoderHost::GetPendingDecodeById(int32_t decode_id) {
-  return std::ranges::find(pending_decodes_, decode_id,
-                           &PendingDecode::decode_id);
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_video_decoder_host.h b/content/renderer/pepper/pepper_video_decoder_host.h
deleted file mode 100644
index cd021e3..0000000
--- a/content/renderer/pepper/pepper_video_decoder_host.h
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_DECODER_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_DECODER_HOST_H_
-
-#include <stdint.h>
-
-#include <list>
-#include <map>
-#include <memory>
-#include <set>
-#include <vector>
-
-#include "base/memory/raw_ptr.h"
-#include "content/renderer/pepper/video_decoder_shim.h"
-#include "gpu/command_buffer/common/mailbox.h"
-#include "ppapi/c/pp_codecs.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/resource_host.h"
-#include "ppapi/proxy/resource_message_params.h"
-
-namespace gpu {
-class ClientSharedImage;
-}
-
-namespace content {
-
-class RendererPpapiHost;
-
-class PepperVideoDecoderHost : public ppapi::host::ResourceHost {
- public:
-  PepperVideoDecoderHost(RendererPpapiHost* host,
-                         PP_Instance instance,
-                         PP_Resource resource);
-
-  PepperVideoDecoderHost(const PepperVideoDecoderHost&) = delete;
-  PepperVideoDecoderHost& operator=(const PepperVideoDecoderHost&) = delete;
-
-  ~PepperVideoDecoderHost() override;
-
- private:
-  enum class PictureBufferState {
-    ASSIGNED,
-    IN_USE,
-    DISMISSED,
-  };
-
-  struct PendingDecode {
-    PendingDecode(int32_t decode_id,
-                  uint32_t shm_id,
-                  uint32_t size,
-                  const ppapi::host::ReplyMessageContext& reply_context);
-    ~PendingDecode();
-
-    const int32_t decode_id;
-    const uint32_t shm_id;
-    const uint32_t size;
-    const ppapi::host::ReplyMessageContext reply_context;
-  };
-  typedef std::list<PendingDecode> PendingDecodeList;
-
-  struct MappedBuffer {
-    MappedBuffer(base::UnsafeSharedMemoryRegion region,
-                 base::WritableSharedMemoryMapping mapping);
-    ~MappedBuffer();
-
-    MappedBuffer(MappedBuffer&&);
-    MappedBuffer& operator=(MappedBuffer&&);
-
-    base::UnsafeSharedMemoryRegion region;
-    base::WritableSharedMemoryMapping mapping;
-    bool busy = false;
-  };
-
-  struct SharedImage {
-    SharedImage(gfx::Size size,
-                PictureBufferState state,
-                scoped_refptr<gpu::ClientSharedImage> client_shared_image);
-    SharedImage(const SharedImage& shared_image);
-    ~SharedImage();
-
-    gfx::Size size;
-    PictureBufferState state;
-    scoped_refptr<gpu::ClientSharedImage> client_shared_image;
-  };
-
-  friend class VideoDecoderShim;
-
-  // ResourceHost implementation.
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-
-  gpu::Mailbox CreateSharedImage(gfx::Size size);
-  void DestroySharedImage(const gpu::Mailbox& mailbox);
-  void DestroySharedImageInternal(
-      std::map<gpu::Mailbox, SharedImage>::iterator it);
-
-  void SharedImageReady(int32_t decode_id,
-                        const gpu::Mailbox& mailbox,
-                        gfx::Size size,
-                        const gfx::Rect& visible_rect);
-
-  void NotifyEndOfBitstreamBuffer(int32_t bitstream_buffer_id);
-  void NotifyFlushDone();
-  void NotifyResetDone();
-  void NotifyError(media::VideoDecodeAccelerator::Error error);
-
-  int32_t OnHostMsgInitialize(ppapi::host::HostMessageContext* context,
-                              const ppapi::HostResource& graphics_context,
-                              PP_VideoProfile profile,
-                              PP_HardwareAcceleration acceleration,
-                              uint32_t min_picture_count);
-  int32_t OnHostMsgGetShm(ppapi::host::HostMessageContext* context,
-                          uint32_t shm_id,
-                          uint32_t shm_size);
-  int32_t OnHostMsgDecode(ppapi::host::HostMessageContext* context,
-                          uint32_t shm_id,
-                          uint32_t size,
-                          int32_t decode_id);
-  int32_t OnHostMsgRecycleSharedImage(ppapi::host::HostMessageContext* context,
-                                      const gpu::Mailbox& mailbox);
-  int32_t OnHostMsgFlush(ppapi::host::HostMessageContext* context);
-  int32_t OnHostMsgReset(ppapi::host::HostMessageContext* context);
-
-  const uint8_t* DecodeIdToAddress(uint32_t decode_id);
-
-  // Tries to initialize software decoder. Returns true on success.
-  bool TryFallbackToSoftwareDecoder();
-
-  PendingDecodeList::iterator GetPendingDecodeById(int32_t decode_id);
-
-  // Non-owning pointer.
-  raw_ptr<RendererPpapiHost> renderer_ppapi_host_;
-
-  media::VideoCodecProfile profile_;
-
-  // |decoder_| will call DestroySharedImage in its dtor, which accesses these
-  // fields.
-  std::map<gpu::Mailbox, SharedImage> shared_images_;
-
-  std::unique_ptr<VideoDecoderShim> decoder_;
-
-  bool software_fallback_allowed_ = false;
-  bool software_fallback_used_ = false;
-
-  // Used to record UMA values.
-  bool mojo_video_decoder_path_initialized_ = false;
-
-  // Used for UMA stats; not frame-accurate.
-  gfx::Size coded_size_;
-
-  // A vector holding our shm buffers, in sync with a similar vector in the
-  // resource. We use a buffer's index in these vectors as its id on both sides
-  // of the proxy. Only add buffers or update them in place so as not to
-  // invalidate these ids.
-  //
-  // These regions are created here, in the host, and shared with the other side
-  // of the proxy who will write into them. While they are only used in a
-  // read-only way in the host, using a ReadOnlySharedMemoryRegion would involve
-  // an extra round-trip to allow the other side of the proxy to map the region
-  // writable before sending a read-only region back to the host.
-  std::vector<MappedBuffer> shm_buffers_;
-
-  uint32_t min_picture_count_;
-
-  // Keeps list of pending decodes.
-  PendingDecodeList pending_decodes_;
-
-  ppapi::host::ReplyMessageContext flush_reply_context_;
-  ppapi::host::ReplyMessageContext reset_reply_context_;
-
-  bool initialized_ = false;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_DECODER_HOST_H_
diff --git a/content/renderer/pepper/pepper_video_encoder_host.cc b/content/renderer/pepper/pepper_video_encoder_host.cc
deleted file mode 100644
index f5a86f57..0000000
--- a/content/renderer/pepper/pepper_video_encoder_host.cc
+++ /dev/null
@@ -1,566 +0,0 @@
-// Copyright 2015 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_video_encoder_host.h"
-
-#include <utility>
-
-#include "base/functional/bind.h"
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "base/notimplemented.h"
-#include "base/numerics/safe_math.h"
-#include "build/build_config.h"
-#include "content/common/pepper_file_util.h"
-#include "content/public/common/gpu_stream_constants.h"
-#include "content/public/renderer/ppapi_gfx_conversion.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/video_encoder_shim.h"
-#include "content/renderer/render_thread_impl.h"
-#include "gpu/command_buffer/common/context_creation_attribs.h"
-#include "gpu/ipc/client/command_buffer_proxy_impl.h"
-#include "media/base/bitrate.h"
-#include "media/base/bitstream_buffer.h"
-#include "media/base/media_log.h"
-#include "media/base/video_frame.h"
-#include "media/video/video_encode_accelerator.h"
-#include "ppapi/c/pp_codecs.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/c/pp_graphics_3d.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/shared_impl/media_stream_buffer.h"
-
-using ppapi::proxy::SerializedHandle;
-
-namespace content {
-
-namespace {
-
-const uint32_t kDefaultNumberOfBitstreamBuffers = 4;
-
-// TODO(llandwerlin): move following to media_conversion.cc/h?
-media::VideoCodecProfile PP_ToMediaVideoProfile(PP_VideoProfile profile) {
-  switch (profile) {
-    case PP_VIDEOPROFILE_H264BASELINE:
-      return media::H264PROFILE_BASELINE;
-    case PP_VIDEOPROFILE_H264MAIN:
-      return media::H264PROFILE_MAIN;
-    case PP_VIDEOPROFILE_H264EXTENDED:
-      return media::H264PROFILE_EXTENDED;
-    case PP_VIDEOPROFILE_H264HIGH:
-      return media::H264PROFILE_HIGH;
-    case PP_VIDEOPROFILE_H264HIGH10PROFILE:
-      return media::H264PROFILE_HIGH10PROFILE;
-    case PP_VIDEOPROFILE_H264HIGH422PROFILE:
-      return media::H264PROFILE_HIGH422PROFILE;
-    case PP_VIDEOPROFILE_H264HIGH444PREDICTIVEPROFILE:
-      return media::H264PROFILE_HIGH444PREDICTIVEPROFILE;
-    case PP_VIDEOPROFILE_H264SCALABLEBASELINE:
-      return media::H264PROFILE_SCALABLEBASELINE;
-    case PP_VIDEOPROFILE_H264SCALABLEHIGH:
-      return media::H264PROFILE_SCALABLEHIGH;
-    case PP_VIDEOPROFILE_H264STEREOHIGH:
-      return media::H264PROFILE_STEREOHIGH;
-    case PP_VIDEOPROFILE_H264MULTIVIEWHIGH:
-      return media::H264PROFILE_MULTIVIEWHIGH;
-    case PP_VIDEOPROFILE_VP8_ANY:
-      return media::VP8PROFILE_ANY;
-    case PP_VIDEOPROFILE_VP9_ANY:
-      return media::VP9PROFILE_PROFILE0;
-    // No default case, to catch unhandled PP_VideoProfile values.
-  }
-  return media::VIDEO_CODEC_PROFILE_UNKNOWN;
-}
-
-PP_VideoProfile PP_FromMediaVideoProfile(media::VideoCodecProfile profile) {
-  switch (profile) {
-    case media::H264PROFILE_BASELINE:
-      return PP_VIDEOPROFILE_H264BASELINE;
-    case media::H264PROFILE_MAIN:
-      return PP_VIDEOPROFILE_H264MAIN;
-    case media::H264PROFILE_EXTENDED:
-      return PP_VIDEOPROFILE_H264EXTENDED;
-    case media::H264PROFILE_HIGH:
-      return PP_VIDEOPROFILE_H264HIGH;
-    case media::H264PROFILE_HIGH10PROFILE:
-      return PP_VIDEOPROFILE_H264HIGH10PROFILE;
-    case media::H264PROFILE_HIGH422PROFILE:
-      return PP_VIDEOPROFILE_H264HIGH422PROFILE;
-    case media::H264PROFILE_HIGH444PREDICTIVEPROFILE:
-      return PP_VIDEOPROFILE_H264HIGH444PREDICTIVEPROFILE;
-    case media::H264PROFILE_SCALABLEBASELINE:
-      return PP_VIDEOPROFILE_H264SCALABLEBASELINE;
-    case media::H264PROFILE_SCALABLEHIGH:
-      return PP_VIDEOPROFILE_H264SCALABLEHIGH;
-    case media::H264PROFILE_STEREOHIGH:
-      return PP_VIDEOPROFILE_H264STEREOHIGH;
-    case media::H264PROFILE_MULTIVIEWHIGH:
-      return PP_VIDEOPROFILE_H264MULTIVIEWHIGH;
-    case media::VP8PROFILE_ANY:
-      return PP_VIDEOPROFILE_VP8_ANY;
-    case media::VP9PROFILE_PROFILE0:
-      return PP_VIDEOPROFILE_VP9_ANY;
-    default:
-      NOTREACHED();
-  }
-}
-
-media::VideoPixelFormat PP_ToMediaVideoFormat(PP_VideoFrame_Format format) {
-  switch (format) {
-    case PP_VIDEOFRAME_FORMAT_UNKNOWN:
-      return media::PIXEL_FORMAT_UNKNOWN;
-    case PP_VIDEOFRAME_FORMAT_YV12:
-      return media::PIXEL_FORMAT_YV12;
-    case PP_VIDEOFRAME_FORMAT_I420:
-      return media::PIXEL_FORMAT_I420;
-    case PP_VIDEOFRAME_FORMAT_BGRA:
-      return media::PIXEL_FORMAT_UNKNOWN;
-    // No default case, to catch unhandled PP_VideoFrame_Format values.
-  }
-  return media::PIXEL_FORMAT_UNKNOWN;
-}
-
-PP_VideoFrame_Format PP_FromMediaVideoFormat(media::VideoPixelFormat format) {
-  switch (format) {
-    case media::PIXEL_FORMAT_UNKNOWN:
-      return PP_VIDEOFRAME_FORMAT_UNKNOWN;
-    case media::PIXEL_FORMAT_YV12:
-      return PP_VIDEOFRAME_FORMAT_YV12;
-    case media::PIXEL_FORMAT_I420:
-      return PP_VIDEOFRAME_FORMAT_I420;
-    default:
-      return PP_VIDEOFRAME_FORMAT_UNKNOWN;
-  }
-}
-
-PP_VideoProfileDescription PP_FromVideoEncodeAcceleratorSupportedProfile(
-    media::VideoEncodeAccelerator::SupportedProfile profile) {
-  PP_VideoProfileDescription pp_profile;
-  pp_profile.profile = PP_FromMediaVideoProfile(profile.profile);
-  pp_profile.max_resolution = PP_FromGfxSize(profile.max_resolution);
-  pp_profile.max_framerate_numerator = profile.max_framerate_numerator;
-  pp_profile.max_framerate_denominator = profile.max_framerate_denominator;
-  pp_profile.hardware_accelerated = PP_FALSE;
-  return pp_profile;
-}
-
-}  // namespace
-
-PepperVideoEncoderHost::ShmBuffer::ShmBuffer(
-    uint32_t id,
-    base::UnsafeSharedMemoryRegion shm_region)
-    : id(id), region(std::move(shm_region)), in_use(true) {
-  DCHECK(region.IsValid());
-  mapping = region.Map();
-  DCHECK(mapping.IsValid());
-}
-
-PepperVideoEncoderHost::ShmBuffer::~ShmBuffer() {}
-
-media::BitstreamBuffer PepperVideoEncoderHost::ShmBuffer::ToBitstreamBuffer() {
-  DCHECK(region.IsValid());
-  DCHECK(mapping.IsValid());
-  return media::BitstreamBuffer(id, region.Duplicate(), mapping.size());
-}
-
-PepperVideoEncoderHost::PepperVideoEncoderHost(RendererPpapiHost* host,
-                                               PP_Instance instance,
-                                               PP_Resource resource)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      renderer_ppapi_host_(host),
-      buffer_manager_(this),
-      encoder_(new VideoEncoderShim(this)),
-      initialized_(false),
-      encoder_last_error_(PP_ERROR_FAILED),
-      frame_count_(0),
-      media_input_format_(media::PIXEL_FORMAT_UNKNOWN) {}
-
-PepperVideoEncoderHost::~PepperVideoEncoderHost() {
-  Close();
-}
-
-int32_t PepperVideoEncoderHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    ppapi::host::HostMessageContext* context) {
-  PPAPI_BEGIN_MESSAGE_MAP(PepperVideoEncoderHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(
-        PpapiHostMsg_VideoEncoder_GetSupportedProfiles,
-        OnHostMsgGetSupportedProfiles)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_VideoEncoder_Initialize,
-                                      OnHostMsgInitialize)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(
-        PpapiHostMsg_VideoEncoder_GetVideoFrames,
-        OnHostMsgGetVideoFrames)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_VideoEncoder_Encode,
-                                      OnHostMsgEncode)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(
-        PpapiHostMsg_VideoEncoder_RecycleBitstreamBuffer,
-        OnHostMsgRecycleBitstreamBuffer)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(
-        PpapiHostMsg_VideoEncoder_RequestEncodingParametersChange,
-        OnHostMsgRequestEncodingParametersChange)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_VideoEncoder_Close,
-                                        OnHostMsgClose)
-  PPAPI_END_MESSAGE_MAP()
-  return PP_ERROR_FAILED;
-}
-
-void PepperVideoEncoderHost::OnGpuControlLostContext() {
-#if DCHECK_IS_ON()
-  // This should never occur more than once.
-  DCHECK(!lost_context_);
-  lost_context_ = true;
-#endif
-  NotifyPepperError(PP_ERROR_RESOURCE_FAILED);
-}
-
-void PepperVideoEncoderHost::OnGpuControlLostContextMaybeReentrant() {
-  // No internal state to update on lost context.
-}
-
-void PepperVideoEncoderHost::OnGpuControlReturnData(
-    base::span<const uint8_t> data) {
-  NOTIMPLEMENTED();
-}
-
-int32_t PepperVideoEncoderHost::OnHostMsgGetSupportedProfiles(
-    ppapi::host::HostMessageContext* context) {
-  std::vector<PP_VideoProfileDescription> pp_profiles;
-  GetSupportedProfiles(&pp_profiles);
-
-  host()->SendReply(
-      context->MakeReplyMessageContext(),
-      PpapiPluginMsg_VideoEncoder_GetSupportedProfilesReply(pp_profiles));
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperVideoEncoderHost::OnHostMsgInitialize(
-    ppapi::host::HostMessageContext* context,
-    PP_VideoFrame_Format input_format,
-    const PP_Size& input_visible_size,
-    PP_VideoProfile output_profile,
-    uint32_t initial_bitrate,
-    PP_HardwareAcceleration acceleration) {
-  if (initialized_)
-    return PP_ERROR_FAILED;
-
-  media_input_format_ = PP_ToMediaVideoFormat(input_format);
-  if (media_input_format_ == media::PIXEL_FORMAT_UNKNOWN)
-    return PP_ERROR_BADARGUMENT;
-
-  media::VideoCodecProfile media_profile =
-      PP_ToMediaVideoProfile(output_profile);
-  if (media_profile == media::VIDEO_CODEC_PROFILE_UNKNOWN)
-    return PP_ERROR_BADARGUMENT;
-
-  gfx::Size input_size(input_visible_size.width, input_visible_size.height);
-  if (input_size.IsEmpty())
-    return PP_ERROR_BADARGUMENT;
-
-  if (acceleration == PP_HARDWAREACCELERATION_ONLY)
-    return PP_ERROR_NOTSUPPORTED;
-
-  initialize_reply_context_ = context->MakeReplyMessageContext();
-  const media::VideoEncodeAccelerator::Config config(
-      media_input_format_, input_size, media_profile,
-      media::Bitrate::ConstantBitrate(initial_bitrate),
-      media::VideoEncodeAccelerator::kDefaultFramerate,
-      media::VideoEncodeAccelerator::Config::StorageType::kShmem,
-      media::VideoEncodeAccelerator::Config::ContentType::kDisplay);
-  if (encoder_->Initialize(config, this).is_ok()) {
-    return PP_OK_COMPLETIONPENDING;
-  }
-
-  initialize_reply_context_ = ppapi::host::ReplyMessageContext();
-  Close();
-  return PP_ERROR_FAILED;
-}
-
-int32_t PepperVideoEncoderHost::OnHostMsgGetVideoFrames(
-    ppapi::host::HostMessageContext* context) {
-  if (encoder_last_error_)
-    return encoder_last_error_;
-
-  get_video_frames_reply_context_ = context->MakeReplyMessageContext();
-  AllocateVideoFrames();
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperVideoEncoderHost::OnHostMsgEncode(
-    ppapi::host::HostMessageContext* context,
-    uint32_t frame_id,
-    bool force_keyframe) {
-  if (encoder_last_error_)
-    return encoder_last_error_;
-
-  if (frame_id >= frame_count_)
-    return PP_ERROR_FAILED;
-
-  encoder_->Encode(
-      CreateVideoFrame(frame_id, context->MakeReplyMessageContext()),
-      force_keyframe);
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperVideoEncoderHost::OnHostMsgRecycleBitstreamBuffer(
-    ppapi::host::HostMessageContext* context,
-    uint32_t buffer_id) {
-  if (encoder_last_error_)
-    return encoder_last_error_;
-
-  if (buffer_id >= shm_buffers_.size() || shm_buffers_[buffer_id]->in_use)
-    return PP_ERROR_FAILED;
-
-  shm_buffers_[buffer_id]->in_use = true;
-  encoder_->UseOutputBitstreamBuffer(
-      shm_buffers_[buffer_id]->ToBitstreamBuffer());
-
-  return PP_OK;
-}
-
-int32_t PepperVideoEncoderHost::OnHostMsgRequestEncodingParametersChange(
-    ppapi::host::HostMessageContext* context,
-    uint32_t bitrate,
-    uint32_t framerate) {
-  if (encoder_last_error_)
-    return encoder_last_error_;
-
-  encoder_->RequestEncodingParametersChange(
-      media::Bitrate::ConstantBitrate(bitrate), framerate, std::nullopt);
-
-  return PP_OK;
-}
-
-int32_t PepperVideoEncoderHost::OnHostMsgClose(
-    ppapi::host::HostMessageContext* context) {
-  encoder_last_error_ = PP_ERROR_FAILED;
-  Close();
-
-  return PP_OK;
-}
-
-void PepperVideoEncoderHost::RequireBitstreamBuffers(
-    unsigned int frame_count,
-    const gfx::Size& input_coded_size,
-    size_t output_buffer_size) {
-  DCHECK(RenderThreadImpl::current());
-  // We assume RequireBitstreamBuffers is only called once.
-  DCHECK(!initialized_);
-
-  input_coded_size_ = input_coded_size;
-  frame_count_ = frame_count;
-
-  for (uint32_t i = 0; i < kDefaultNumberOfBitstreamBuffers; ++i) {
-    base::UnsafeSharedMemoryRegion region =
-        base::UnsafeSharedMemoryRegion::Create(output_buffer_size);
-    if (!region.IsValid()) {
-      shm_buffers_.clear();
-      break;
-    }
-
-    shm_buffers_.push_back(std::make_unique<ShmBuffer>(i, std::move(region)));
-  }
-
-  // Feed buffers to the encoder.
-  std::vector<SerializedHandle> handles;
-  for (const auto& buffer : shm_buffers_) {
-    encoder_->UseOutputBitstreamBuffer(buffer->ToBitstreamBuffer());
-    handles.push_back(SerializedHandle(
-        renderer_ppapi_host_->ShareUnsafeSharedMemoryRegionWithRemote(
-            buffer->region)));
-  }
-
-  host()->SendUnsolicitedReplyWithHandles(
-      pp_resource(),
-      PpapiPluginMsg_VideoEncoder_BitstreamBuffers(
-          static_cast<uint32_t>(output_buffer_size)),
-      &handles);
-
-  if (!initialized_) {
-    // Tell the plugin that initialization has been successful if we
-    // haven't already.
-    initialized_ = true;
-    encoder_last_error_ = PP_OK;
-    host()->SendReply(initialize_reply_context_,
-                      PpapiPluginMsg_VideoEncoder_InitializeReply(
-                          frame_count, PP_FromGfxSize(input_coded_size)));
-  }
-
-  if (shm_buffers_.empty()) {
-    NotifyPepperError(PP_ERROR_NOMEMORY);
-    return;
-  }
-
-  // If the plugin already requested video frames, we can now answer
-  // that request.
-  if (get_video_frames_reply_context_.is_valid())
-    AllocateVideoFrames();
-}
-
-void PepperVideoEncoderHost::BitstreamBufferReady(
-    int32_t buffer_id,
-    const media::BitstreamBufferMetadata& metadata) {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK(shm_buffers_[buffer_id]->in_use);
-
-  shm_buffers_[buffer_id]->in_use = false;
-  // TODO: Pass timestamp. Tracked in crbug/613984.
-  host()->SendUnsolicitedReply(
-      pp_resource(),
-      PpapiPluginMsg_VideoEncoder_BitstreamBufferReady(
-          buffer_id, base::checked_cast<uint32_t>(metadata.payload_size_bytes),
-          metadata.key_frame));
-}
-
-void PepperVideoEncoderHost::NotifyErrorStatus(
-    const media::EncoderStatus& status) {
-  DCHECK(RenderThreadImpl::current());
-  CHECK(!status.is_ok());
-  LOG(ERROR) << "NotifyErrorStatus() is called, code="
-             << static_cast<int32_t>(status.code())
-             << ", message=" << status.message();
-  NotifyPepperError(PP_ERROR_RESOURCE_FAILED);
-}
-
-void PepperVideoEncoderHost::GetSupportedProfiles(
-    std::vector<PP_VideoProfileDescription>* pp_profiles) {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK(encoder_);
-
-  const media::VideoEncodeAccelerator::SupportedProfiles media_profiles =
-      encoder_->GetSupportedProfiles();
-  for (const auto& media_profile : media_profiles) {
-    pp_profiles->push_back(
-        PP_FromVideoEncodeAcceleratorSupportedProfile(media_profile));
-  }
-}
-
-void PepperVideoEncoderHost::Close() {
-  DCHECK(RenderThreadImpl::current());
-
-  encoder_ = nullptr;
-  command_buffer_ = nullptr;
-}
-
-void PepperVideoEncoderHost::AllocateVideoFrames() {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK(get_video_frames_reply_context_.is_valid());
-
-  // Frames have already been allocated.
-  if (buffer_manager_.number_of_buffers() > 0) {
-    SendGetFramesErrorReply(PP_ERROR_FAILED);
-    NOTREACHED();
-  }
-
-  base::CheckedNumeric<uint32_t> size =
-      media::VideoFrame::AllocationSize(media_input_format_, input_coded_size_);
-  uint32_t frame_size = size.ValueOrDie();
-  size += sizeof(ppapi::MediaStreamBuffer::Video);
-  uint32_t buffer_size = size.ValueOrDie();
-  // Make each buffer 4 byte aligned.
-  size += (4 - buffer_size % 4);
-  uint32_t buffer_size_aligned = size.ValueOrDie();
-  size *= frame_count_;
-  uint32_t total_size = size.ValueOrDie();
-
-  base::UnsafeSharedMemoryRegion region =
-      base::UnsafeSharedMemoryRegion::Create(total_size);
-  if (!region.IsValid() ||
-      !buffer_manager_.SetBuffers(frame_count_, buffer_size_aligned,
-                                  std::move(region), true)) {
-    SendGetFramesErrorReply(PP_ERROR_NOMEMORY);
-    return;
-  }
-
-  VLOG(4) << " frame_count=" << frame_count_ << " frame_size=" << frame_size
-          << " buffer_size=" << buffer_size_aligned;
-
-  for (int32_t i = 0; i < buffer_manager_.number_of_buffers(); ++i) {
-    ppapi::MediaStreamBuffer::Video* buffer =
-        &(buffer_manager_.GetBufferPointer(i)->video);
-    buffer->header.size = buffer_manager_.buffer_size();
-    buffer->header.type = ppapi::MediaStreamBuffer::TYPE_VIDEO;
-    buffer->format = PP_FromMediaVideoFormat(media_input_format_);
-    buffer->size.width = input_coded_size_.width();
-    buffer->size.height = input_coded_size_.height();
-    buffer->data_size = frame_size;
-  }
-
-  DCHECK(get_video_frames_reply_context_.is_valid());
-  get_video_frames_reply_context_.params.AppendHandle(SerializedHandle(
-      renderer_ppapi_host_->ShareUnsafeSharedMemoryRegionWithRemote(
-          buffer_manager_.region())));
-
-  host()->SendReply(get_video_frames_reply_context_,
-                    PpapiPluginMsg_VideoEncoder_GetVideoFramesReply(
-                        frame_count_, buffer_size_aligned,
-                        PP_FromGfxSize(input_coded_size_)));
-  get_video_frames_reply_context_ = ppapi::host::ReplyMessageContext();
-}
-
-void PepperVideoEncoderHost::SendGetFramesErrorReply(int32_t error) {
-  get_video_frames_reply_context_.params.set_result(error);
-  host()->SendReply(
-      get_video_frames_reply_context_,
-      PpapiPluginMsg_VideoEncoder_GetVideoFramesReply(0, 0, PP_MakeSize(0, 0)));
-  get_video_frames_reply_context_ = ppapi::host::ReplyMessageContext();
-}
-
-scoped_refptr<media::VideoFrame> PepperVideoEncoderHost::CreateVideoFrame(
-    uint32_t frame_id,
-    const ppapi::host::ReplyMessageContext& reply_context) {
-  DCHECK(RenderThreadImpl::current());
-
-  ppapi::MediaStreamBuffer* buffer = buffer_manager_.GetBufferPointer(frame_id);
-  DCHECK(buffer);
-  // The shared memory handle does not need to be given to the video frame as
-  // cross-process calls coordinate shared memory via a buffer index. See
-  // ppapi/shared_impl/media_stream_buffer_manager.h for details.
-  scoped_refptr<media::VideoFrame> frame = media::VideoFrame::WrapExternalData(
-      media_input_format_, input_coded_size_, gfx::Rect(input_coded_size_),
-      input_coded_size_, static_cast<uint8_t*>(buffer->video.data),
-      buffer->video.data_size, base::TimeDelta());
-  if (!frame) {
-    NotifyPepperError(PP_ERROR_FAILED);
-    return frame;
-  }
-  frame->AddDestructionObserver(
-      base::BindOnce(&PepperVideoEncoderHost::FrameReleased,
-                     weak_ptr_factory_.GetWeakPtr(), reply_context, frame_id));
-  return frame;
-}
-
-void PepperVideoEncoderHost::FrameReleased(
-    const ppapi::host::ReplyMessageContext& reply_context,
-    uint32_t frame_id) {
-  DCHECK(RenderThreadImpl::current());
-
-  ppapi::host::ReplyMessageContext context = reply_context;
-  context.params.set_result(encoder_last_error_);
-  host()->SendReply(context, PpapiPluginMsg_VideoEncoder_EncodeReply(frame_id));
-}
-
-void PepperVideoEncoderHost::NotifyPepperError(int32_t error) {
-  DCHECK(RenderThreadImpl::current());
-
-  encoder_last_error_ = error;
-  Close();
-  host()->SendUnsolicitedReply(
-      pp_resource(),
-      PpapiPluginMsg_VideoEncoder_NotifyError(encoder_last_error_));
-}
-
-uint8_t* PepperVideoEncoderHost::ShmHandleToAddress(int32_t buffer_id) {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK_GE(buffer_id, 0);
-  DCHECK_LT(buffer_id, static_cast<int32_t>(shm_buffers_.size()));
-  return shm_buffers_[buffer_id]->mapping.GetMemoryAsSpan<uint8_t>().data();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_video_encoder_host.h b/content/renderer/pepper/pepper_video_encoder_host.h
deleted file mode 100644
index 92bd77a..0000000
--- a/content/renderer/pepper/pepper_video_encoder_host.h
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright 2015 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_ENCODER_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_ENCODER_HOST_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/shared_memory_mapping.h"
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "content/renderer/pepper/video_encoder_shim.h"
-#include "gpu/command_buffer/client/gpu_control_client.h"
-#include "ppapi/c/pp_codecs.h"
-#include "ppapi/c/ppb_video_frame.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/resource_host.h"
-#include "ppapi/proxy/resource_message_params.h"
-#include "ppapi/shared_impl/media_stream_buffer_manager.h"
-
-namespace gpu {
-class CommandBufferProxyImpl;
-}
-
-namespace media {
-struct BitstreamBufferMetadata;
-}  // namespace media
-
-namespace content {
-
-class RendererPpapiHost;
-
-class PepperVideoEncoderHost : public ppapi::host::ResourceHost,
-                               public VideoEncoderShim::Client,
-                               public ppapi::MediaStreamBufferManager::Delegate,
-                               public gpu::GpuControlClient {
- public:
-  PepperVideoEncoderHost(RendererPpapiHost* host,
-                         PP_Instance instance,
-                         PP_Resource resource);
-
-  PepperVideoEncoderHost(const PepperVideoEncoderHost&) = delete;
-  PepperVideoEncoderHost& operator=(const PepperVideoEncoderHost&) = delete;
-
-  ~PepperVideoEncoderHost() override;
-
- private:
-  friend class VideoEncoderShim;
-
-  // Shared memory buffers.
-  struct ShmBuffer {
-    ShmBuffer(uint32_t id, base::UnsafeSharedMemoryRegion shm_region);
-    ~ShmBuffer();
-
-    media::BitstreamBuffer ToBitstreamBuffer();
-
-    // Index of the buffer in the |shm_buffers_|. Buffers have the same id in
-    // the plugin and the host.
-    uint32_t id;
-    base::UnsafeSharedMemoryRegion region;
-    base::WritableSharedMemoryMapping mapping;
-    bool in_use;
-  };
-
-  // VideoEncoderShim implementation.
-  void RequireBitstreamBuffers(unsigned int input_count,
-                               const gfx::Size& input_coded_size,
-                               size_t output_buffer_size) override;
-  void BitstreamBufferReady(
-      int32_t bitstream_buffer_id,
-      const media::BitstreamBufferMetadata& metadata) override;
-  void NotifyErrorStatus(const media::EncoderStatus& status) override;
-
-  // ResourceHost implementation.
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-
-  // GpuControlClient implementation.
-  void OnGpuControlLostContext() final;
-  void OnGpuControlLostContextMaybeReentrant() final;
-  void OnGpuControlErrorMessage(const char* msg, int id) final {}
-  void OnGpuControlReturnData(base::span<const uint8_t> data) final;
-
-  int32_t OnHostMsgGetSupportedProfiles(
-      ppapi::host::HostMessageContext* context);
-  int32_t OnHostMsgInitialize(ppapi::host::HostMessageContext* context,
-                              PP_VideoFrame_Format input_format,
-                              const PP_Size& input_visible_size,
-                              PP_VideoProfile output_profile,
-                              uint32_t initial_bitrate,
-                              PP_HardwareAcceleration acceleration);
-  int32_t OnHostMsgGetVideoFrames(ppapi::host::HostMessageContext* context);
-  int32_t OnHostMsgEncode(ppapi::host::HostMessageContext* context,
-                          uint32_t frame_id,
-                          bool force_keyframe);
-  int32_t OnHostMsgRecycleBitstreamBuffer(
-      ppapi::host::HostMessageContext* context,
-      uint32_t buffer_id);
-  int32_t OnHostMsgRequestEncodingParametersChange(
-      ppapi::host::HostMessageContext* context,
-      uint32_t bitrate,
-      uint32_t framerate);
-  int32_t OnHostMsgClose(ppapi::host::HostMessageContext* context);
-
-  // Internal methods.
-  void GetSupportedProfiles(
-      std::vector<PP_VideoProfileDescription>* pp_profiles);
-  bool IsInitializationValid(const PP_Size& input_size,
-                             PP_VideoProfile ouput_profile,
-                             PP_HardwareAcceleration acceleration);
-  bool EnsureGpuChannel();
-  bool InitializeHardware(media::VideoPixelFormat input_format,
-                          const gfx::Size& input_visible_size,
-                          media::VideoCodecProfile output_profile,
-                          uint32_t initial_bitrate);
-  void Close();
-  void AllocateVideoFrames();
-  void SendGetFramesErrorReply(int32_t error);
-  scoped_refptr<media::VideoFrame> CreateVideoFrame(
-      uint32_t frame_id,
-      const ppapi::host::ReplyMessageContext& reply_context);
-  void FrameReleased(const ppapi::host::ReplyMessageContext& reply_context,
-                     uint32_t frame_id);
-  void NotifyPepperError(int32_t error);
-
-  // Helper method for VideoEncoderShim.
-  uint8_t* ShmHandleToAddress(int32_t buffer_id);
-
-  // Non-owning pointer.
-  raw_ptr<RendererPpapiHost> renderer_ppapi_host_;
-
-  std::vector<std::unique_ptr<ShmBuffer>> shm_buffers_;
-
-  // Buffer manager for shared memory that holds video frames.
-  ppapi::MediaStreamBufferManager buffer_manager_;
-
-  std::unique_ptr<gpu::CommandBufferProxyImpl> command_buffer_;
-
-  std::unique_ptr<VideoEncoderShim> encoder_;
-
-  // Whether the encoder has been successfully initialized.
-  bool initialized_;
-
-  // Saved context to answer an Initialize message from the plugin.
-  ppapi::host::ReplyMessageContext initialize_reply_context_;
-
-  // Saved context to answer a GetVideoFrames message from the plugin.
-  ppapi::host::ReplyMessageContext get_video_frames_reply_context_;
-
-  // This represents the current error state of the encoder, i.e. PP_OK
-  // normally, or a Pepper error code if the encoder is uninitialized,
-  // has been notified of an encoder error, has encountered some
-  // other unrecoverable error, or has been closed by  the plugin.
-  // This field is checked in most message handlers to decide whether
-  // operations should proceed or fail.
-  int32_t encoder_last_error_;
-
-  // Size of the frames allocated for the encoder (matching hardware
-  // constraints).
-  gfx::Size input_coded_size_;
-
-  // Number of frames the encoder needs.
-  uint32_t frame_count_;
-
-  // Format of the frames to give to the encoder.
-  media::VideoPixelFormat media_input_format_;
-
-#if DCHECK_IS_ON()
-  bool lost_context_ = false;
-#endif
-
-  base::WeakPtrFactory<PepperVideoEncoderHost> weak_ptr_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_VIDEO_ENCODER_HOST_H_
diff --git a/content/renderer/pepper/pepper_webplugin_impl.cc b/content/renderer/pepper/pepper_webplugin_impl.cc
deleted file mode 100644
index 9f1efb46..0000000
--- a/content/renderer/pepper/pepper_webplugin_impl.cc
+++ /dev/null
@@ -1,382 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/pepper_webplugin_impl.h"
-
-#include <stddef.h>
-#include <cmath>
-#include <utility>
-
-#include "base/debug/crash_logging.h"
-#include "base/location.h"
-#include "base/memory/raw_ptr.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/task/single_thread_task_runner.h"
-#include "content/public/renderer/content_renderer_client.h"
-#include "content/renderer/pepper/message_channel.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "content/renderer/pepper/v8object_var.h"
-#include "content/renderer/render_frame_impl.h"
-#include "content/renderer/renderer_blink_platform_impl.h"
-#include "ppapi/shared_impl/ppapi_globals.h"
-#include "ppapi/shared_impl/var_tracker.h"
-#include "third_party/blink/public/common/input/web_coalesced_input_event.h"
-#include "third_party/blink/public/common/input/web_input_event.h"
-#include "third_party/blink/public/common/input/web_keyboard_event.h"
-#include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
-#include "third_party/blink/public/mojom/input/focus_type.mojom.h"
-#include "third_party/blink/public/platform/platform.h"
-#include "third_party/blink/public/web/web_associated_url_loader_client.h"
-#include "third_party/blink/public/web/web_document.h"
-#include "third_party/blink/public/web/web_element.h"
-#include "third_party/blink/public/web/web_frame.h"
-#include "third_party/blink/public/web/web_plugin_container.h"
-#include "third_party/blink/public/web/web_plugin_params.h"
-#include "third_party/blink/public/web/web_print_params.h"
-#include "ui/base/cursor/cursor.h"
-#include "ui/events/keycodes/keyboard_codes.h"
-#include "url/gurl.h"
-
-using ppapi::V8ObjectVar;
-using blink::WebPlugin;
-using blink::WebPluginContainer;
-using blink::WebPluginParams;
-using blink::WebPrintParams;
-using blink::WebString;
-using blink::WebURL;
-
-namespace content {
-
-blink::WebTextInputType ConvertTextInputType(ui::TextInputType type) {
-  // Check the type is in the range representable by ui::TextInputType.
-  DCHECK_LE(type, static_cast<int>(ui::TEXT_INPUT_TYPE_MAX))
-      << "blink::WebTextInputType and ui::TextInputType not synchronized";
-  return static_cast<blink::WebTextInputType>(type);
-}
-
-struct PepperWebPluginImpl::InitData {
-  scoped_refptr<PluginModule> module;
-  raw_ptr<RenderFrameImpl> render_frame;
-  std::vector<std::string> arg_names;
-  std::vector<std::string> arg_values;
-  GURL url;
-};
-
-PepperWebPluginImpl::PepperWebPluginImpl(PluginModule* plugin_module,
-                                         const WebPluginParams& params,
-                                         RenderFrameImpl* render_frame)
-    : init_data_(new InitData()),
-      full_frame_(params.load_manually),
-      instance_object_(PP_MakeUndefined()),
-      container_(nullptr) {
-  DCHECK(plugin_module);
-  init_data_->module = plugin_module;
-  init_data_->render_frame = render_frame;
-  for (size_t i = 0; i < params.attribute_names.size(); ++i) {
-    init_data_->arg_names.push_back(params.attribute_names[i].Utf8());
-    init_data_->arg_values.push_back(params.attribute_values[i].Utf8());
-  }
-  init_data_->url = params.url;
-
-  // Set subresource URL for crash reporting.
-  static auto* const subresource_url = base::debug::AllocateCrashKeyString(
-      "subresource_url", base::debug::CrashKeySize::Size256);
-  base::debug::SetCrashKeyString(subresource_url, init_data_->url.possibly_invalid_spec());
-}
-
-PepperWebPluginImpl::~PepperWebPluginImpl() {}
-
-blink::WebPluginContainer* PepperWebPluginImpl::Container() const {
-  return container_;
-}
-
-bool PepperWebPluginImpl::Initialize(WebPluginContainer* container) {
-  DCHECK(container);
-  DCHECK_EQ(this, container->Plugin());
-
-  container_ = container;
-
-  // The plugin delegate may have gone away.
-  instance_ = init_data_->module->CreateInstance(
-      init_data_->render_frame, container, init_data_->url);
-  if (!instance_)
-    return false;
-
-  if (!instance_->Initialize(init_data_->arg_names, init_data_->arg_values,
-                             full_frame_)) {
-    // If |container_| is nullptr, this object has already been synchronously
-    // destroy()-ed during |instance_|'s Initialize call. In that case, we early
-    // exit. We neither create a replacement plugin nor destroy() ourselves.
-    if (!container_)
-      return false;
-
-    DCHECK(instance_);
-    ppapi::PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(instance_object_);
-    instance_object_ = PP_MakeUndefined();
-    instance_->Delete();
-    instance_ = nullptr;
-
-    blink::WebPlugin* replacement_plugin =
-        GetContentClient()->renderer()->CreatePluginReplacement(
-            init_data_->render_frame, init_data_->module->path());
-    if (!replacement_plugin)
-      return false;
-
-    // The replacement plugin, if it exists, must never fail to initialize.
-    container->SetPlugin(replacement_plugin);
-    CHECK(replacement_plugin->Initialize(container));
-
-    DCHECK(container->Plugin() == replacement_plugin);
-    DCHECK(replacement_plugin->Container() == container);
-
-    // Since the container now owns the replacement plugin instead of this
-    // object, we must schedule ourselves for deletion.
-    Destroy();
-
-    return true;
-  }
-
-  init_data_.reset();
-  return true;
-}
-
-void PepperWebPluginImpl::Destroy() {
-  container_ = nullptr;
-
-  if (instance_) {
-    ppapi::PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(instance_object_);
-    instance_object_ = PP_MakeUndefined();
-    instance_->Delete();
-    instance_ = nullptr;
-  }
-
-  base::SingleThreadTaskRunner::GetCurrentDefault()->DeleteSoon(FROM_HERE,
-                                                                this);
-}
-
-v8::Local<v8::Object> PepperWebPluginImpl::V8ScriptableObject(
-    v8::Isolate* isolate) {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See e.g. crbug.com/503401.
-  if (!instance_)
-    return v8::Local<v8::Object>();
-  // Call through the plugin to get its instance object. The plugin should pass
-  // us a reference which we release in destroy().
-  if (instance_object_.type == PP_VARTYPE_UNDEFINED)
-    instance_object_ = instance_->GetInstanceObject(isolate);
-  // GetInstanceObject talked to the plugin which may have removed the instance
-  // from the DOM, in which case instance_ would be nullptr now.
-  if (!instance_)
-    return v8::Local<v8::Object>();
-
-  scoped_refptr<V8ObjectVar> object_var(
-      V8ObjectVar::FromPPVar(instance_object_));
-  // If there's an InstanceObject, tell the Instance's MessageChannel to pass
-  // any non-postMessage calls to it.
-  if (object_var) {
-    MessageChannel* message_channel = instance_->message_channel();
-    if (message_channel)
-      message_channel->SetPassthroughObject(object_var->GetHandle());
-  }
-
-  v8::Local<v8::Object> result = instance_->GetMessageChannelObject();
-  return result;
-}
-
-void PepperWebPluginImpl::Paint(cc::PaintCanvas* canvas,
-                                const gfx::Rect& rect) {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See: crbug.com/715747.
-  if (instance_)
-    instance_->Paint(canvas, plugin_rect_, rect);
-}
-
-void PepperWebPluginImpl::UpdateGeometry(const gfx::Rect& window_rect,
-                                         const gfx::Rect& clip_rect,
-                                         const gfx::Rect& unobscured_rect,
-                                         bool is_visible) {
-  plugin_rect_ = window_rect;
-  if (instance_)
-    instance_->ViewChanged(plugin_rect_, clip_rect, unobscured_rect);
-}
-
-void PepperWebPluginImpl::UpdateFocus(bool focused,
-                                      blink::mojom::FocusType focus_type) {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See: crbug.com/715747.
-  if (instance_) {
-    instance_->SetWebKitFocus(focused);
-  }
-}
-
-void PepperWebPluginImpl::UpdateVisibility(bool visible) {}
-
-blink::WebInputEventResult PepperWebPluginImpl::HandleInputEvent(
-    const blink::WebCoalescedInputEvent& coalesced_event,
-    ui::Cursor* cursor) {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See: crbug.com/715747.
-  if (!instance_)
-    return blink::WebInputEventResult::kNotHandled;
-  return instance_->HandleCoalescedInputEvent(coalesced_event, cursor)
-             ? blink::WebInputEventResult::kHandledApplication
-             : blink::WebInputEventResult::kNotHandled;
-}
-
-void PepperWebPluginImpl::DidReceiveResponse(
-    const blink::WebURLResponse& response) {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See: crbug.com/715747.
-  if (!instance_)
-    return;
-  DCHECK(!instance_->document_loader());
-  instance_->HandleDocumentLoad(response);
-}
-
-void PepperWebPluginImpl::DidReceiveData(base::span<const char> data) {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See: crbug.com/715747.
-  if (!instance_)
-    return;
-  blink::WebAssociatedURLLoaderClient* document_loader =
-      instance_->document_loader();
-  if (document_loader)
-    document_loader->DidReceiveData(data);
-}
-
-void PepperWebPluginImpl::DidFinishLoading() {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See: crbug.com/715747.
-  if (!instance_)
-    return;
-  blink::WebAssociatedURLLoaderClient* document_loader =
-      instance_->document_loader();
-  if (document_loader)
-    document_loader->DidFinishLoading();
-}
-
-void PepperWebPluginImpl::DidFailLoading(const blink::WebURLError& error) {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See: crbug.com/715747.
-  if (!instance_)
-    return;
-  blink::WebAssociatedURLLoaderClient* document_loader =
-      instance_->document_loader();
-  if (document_loader)
-    document_loader->DidFail(error);
-}
-
-bool PepperWebPluginImpl::HasSelection() const {
-  return !SelectionAsText().IsEmpty();
-}
-
-WebString PepperWebPluginImpl::SelectionAsText() const {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See: crbug.com/715747.
-  if (!instance_)
-    return WebString();
-  return WebString::FromUTF16(instance_->GetSelectedText(false));
-}
-
-WebString PepperWebPluginImpl::SelectionAsMarkup() const {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See: crbug.com/715747.
-  if (!instance_)
-    return WebString();
-  return WebString::FromUTF16(instance_->GetSelectedText(true));
-}
-
-bool PepperWebPluginImpl::SupportsPaginatedPrint() {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See: crbug.com/715747.
-  if (!instance_)
-    return false;
-  return instance_->SupportsPrintInterface();
-}
-
-int PepperWebPluginImpl::PrintBegin(const WebPrintParams& print_params) {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See: crbug.com/715747.
-  if (!instance_)
-    return 0;
-  return instance_->PrintBegin(print_params);
-}
-
-void PepperWebPluginImpl::PrintPage(int page_number, cc::PaintCanvas* canvas) {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See: crbug.com/715747.
-  if (instance_)
-    instance_->PrintPage(page_number, canvas);
-}
-
-void PepperWebPluginImpl::PrintEnd() {
-  // Re-entrancy may cause JS to try to execute script on the plugin before it
-  // is fully initialized. See: crbug.com/715747.
-  if (instance_)
-    instance_->PrintEnd();
-}
-
-void PepperWebPluginImpl::DidLoseMouseLock() {
-  if (instance_)
-    instance_->OnMouseLockLost();
-}
-
-void PepperWebPluginImpl::DidReceiveMouseLockResult(bool success) {
-  if (instance_)
-    instance_->OnLockMouseACK(success);
-}
-
-bool PepperWebPluginImpl::CanComposeInline() {
-  if (!instance_)
-    return false;
-  return instance_->IsPluginAcceptingCompositionEvents();
-}
-
-void PepperWebPluginImpl::ImeCommitTextForPlugin(
-    const blink::WebString& text,
-    const std::vector<ui::ImeTextSpan>& ime_text_spans,
-    const gfx::Range& replacement_range,
-    int relative_cursor_pos) {
-  if (!instance_)
-    return;
-  instance_->OnImeCommitText(text.Utf16(), replacement_range,
-                             relative_cursor_pos);
-}
-
-void PepperWebPluginImpl::ImeSetCompositionForPlugin(
-    const blink::WebString& text,
-    const std::vector<ui::ImeTextSpan>& ime_text_spans,
-    const gfx::Range& replacement_range,
-    int selection_start,
-    int selection_end) {
-  if (!instance_)
-    return;
-  instance_->OnImeSetComposition(text.Utf16(), ime_text_spans, selection_start,
-                                 selection_end);
-}
-
-void PepperWebPluginImpl::ImeFinishComposingTextForPlugin(bool keep_selection) {
-  if (!instance_)
-    return;
-  instance_->OnImeFinishComposingText(keep_selection);
-}
-
-bool PepperWebPluginImpl::ShouldDispatchImeEventsToPlugin() {
-  return true;
-}
-
-blink::WebTextInputType PepperWebPluginImpl::GetPluginTextInputType() {
-  if (!instance_)
-    return blink::WebTextInputType::kWebTextInputTypeNone;
-  return ConvertTextInputType(instance_->text_input_type());
-}
-
-gfx::Rect PepperWebPluginImpl::GetPluginCaretBounds() {
-  if (!instance_)
-    return gfx::Rect();
-  return instance_->GetCaretBounds();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_webplugin_impl.h b/content/renderer/pepper/pepper_webplugin_impl.h
deleted file mode 100644
index d65c135b..0000000
--- a/content/renderer/pepper/pepper_webplugin_impl.h
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_WEBPLUGIN_IMPL_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_WEBPLUGIN_IMPL_H_
-
-#include <memory>
-#include <vector>
-
-#include "base/memory/raw_ptr.h"
-#include "base/task/sequenced_task_runner_helpers.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "ppapi/c/pp_var.h"
-#include "third_party/blink/public/mojom/input/focus_type.mojom-forward.h"
-#include "third_party/blink/public/web/web_plugin.h"
-#include "ui/gfx/geometry/rect.h"
-
-namespace blink {
-struct WebPluginParams;
-struct WebPrintParams;
-}
-
-namespace content {
-
-class PepperPluginInstanceImpl;
-class PluginModule;
-class RenderFrameImpl;
-
-class PepperWebPluginImpl : public blink::WebPlugin {
- public:
-  PepperWebPluginImpl(PluginModule* module,
-                      const blink::WebPluginParams& params,
-                      RenderFrameImpl* render_frame);
-
-  PepperWebPluginImpl(const PepperWebPluginImpl&) = delete;
-  PepperWebPluginImpl& operator=(const PepperWebPluginImpl&) = delete;
-
-  PepperPluginInstanceImpl* instance() { return instance_.get(); }
-
-  // blink::WebPlugin implementation.
-  blink::WebPluginContainer* Container() const override;
-  bool Initialize(blink::WebPluginContainer* container) override;
-  void Destroy() override;
-  v8::Local<v8::Object> V8ScriptableObject(v8::Isolate* isolate) override;
-  void UpdateAllLifecyclePhases(blink::DocumentUpdateReason) override {}
-  void Paint(cc::PaintCanvas* canvas, const gfx::Rect& rect) override;
-  void UpdateGeometry(const gfx::Rect& window_rect,
-                      const gfx::Rect& clip_rect,
-                      const gfx::Rect& unobscured_rect,
-                      bool is_visible) override;
-  void UpdateFocus(bool focused, blink::mojom::FocusType focus_type) override;
-  void UpdateVisibility(bool visible) override;
-  blink::WebInputEventResult HandleInputEvent(
-      const blink::WebCoalescedInputEvent& event,
-      ui::Cursor* cursor) override;
-  void DidReceiveResponse(const blink::WebURLResponse& response) override;
-  void DidReceiveData(base::span<const char> data) override;
-  void DidFinishLoading() override;
-  void DidFailLoading(const blink::WebURLError&) override;
-  bool HasSelection() const override;
-  blink::WebString SelectionAsText() const override;
-  blink::WebString SelectionAsMarkup() const override;
-  bool SupportsPaginatedPrint() override;
-
-  int PrintBegin(const blink::WebPrintParams& print_params) override;
-  void PrintPage(int page_number, cc::PaintCanvas* canvas) override;
-  void PrintEnd() override;
-
-  void DidLoseMouseLock() override;
-  void DidReceiveMouseLockResult(bool success) override;
-
-  bool CanComposeInline() override;
-  bool ShouldDispatchImeEventsToPlugin() override;
-  blink::WebTextInputType GetPluginTextInputType() override;
-  gfx::Rect GetPluginCaretBounds() override;
-  void ImeSetCompositionForPlugin(
-      const blink::WebString& text,
-      const std::vector<ui::ImeTextSpan>& ime_text_spans,
-      const gfx::Range& replacement_range,
-      int selection_start,
-      int selection_end) override;
-  void ImeCommitTextForPlugin(
-      const blink::WebString& text,
-      const std::vector<ui::ImeTextSpan>& ime_text_spans,
-      const gfx::Range& replacement_range,
-      int relative_cursor_pos) override;
-  void ImeFinishComposingTextForPlugin(bool keep_selection) override;
-
- private:
-  friend class base::DeleteHelper<PepperWebPluginImpl>;
-
-  ~PepperWebPluginImpl() override;
-
-  // Cleared upon successful initialization.
-  struct InitData;
-  std::unique_ptr<InitData> init_data_;
-
-  // True if the instance represents the entire document in a frame instead of
-  // being an embedded resource.
-  const bool full_frame_;
-
-  scoped_refptr<PepperPluginInstanceImpl> instance_;
-  gfx::Rect plugin_rect_;
-  PP_Var instance_object_;
-  raw_ptr<blink::WebPluginContainer> container_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_WEBPLUGIN_IMPL_H_
diff --git a/content/renderer/pepper/pepper_webplugin_impl_browsertest.cc b/content/renderer/pepper/pepper_webplugin_impl_browsertest.cc
deleted file mode 100644
index f06b549..0000000
--- a/content/renderer/pepper/pepper_webplugin_impl_browsertest.cc
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright 2015 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/pepper_webplugin_impl.h"
-
-#include <stdint.h>
-
-#include "base/command_line.h"
-#include "base/memory/ptr_util.h"
-#include "content/public/common/content_client.h"
-#include "content/public/common/content_constants.h"
-#include "content/public/common/content_plugin_info.h"
-#include "content/public/common/content_switches.h"
-#include "content/public/renderer/content_renderer_client.h"
-#include "content/public/test/render_view_test.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "content/renderer/render_frame_impl.h"
-#include "content/test/test_content_client.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/c/ppb_core.h"
-#include "ppapi/c/ppb_graphics_2d.h"
-#include "ppapi/c/ppb_image_data.h"
-#include "ppapi/c/ppb_instance.h"
-#include "ppapi/c/ppp_instance.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-
-namespace content {
-namespace {
-
-class PepperWebPluginImplBrowserTest : public RenderViewTest {
- public:
-  PepperWebPluginImplBrowserTest()
-      : pp_module_(0), pp_instance_(0), graphics2d_(0) {}
-
-  void SetUp() override {
-    current_test_ = this;
-    RenderViewTest::SetUp();
-  }
-  void TearDown() override {
-    RenderViewTest::TearDown();
-    current_test_ = nullptr;
-  }
-  ContentClient* CreateContentClient() override {
-    return new MockContentClient;
-  }
-  ContentRendererClient* CreateContentRendererClient() override {
-    return new MockContentRendererClient;
-  }
-
- protected:
-  // PPP implementation
-  static const void* GetInterface(const char* name) {
-    static PPP_Instance ppp_instance = {
-        &PepperWebPluginImplBrowserTest::DidCreate,
-        &PepperWebPluginImplBrowserTest::DidDestroy,
-        &PepperWebPluginImplBrowserTest::DidChangeView,
-        &PepperWebPluginImplBrowserTest::DidChangeFocus,
-        &PepperWebPluginImplBrowserTest::HandleDocumentLoad};
-    if (!strcmp(name, PPP_INSTANCE_INTERFACE))
-      return &ppp_instance;
-    return nullptr;
-  }
-  static int InitializeModule(PP_Module module,
-                              PPB_GetInterface get_interface) {
-    EXPECT_EQ(0, current_test_->pp_module_);
-    current_test_->pp_module_ = module;
-    ppb_core_ = static_cast<const PPB_Core*>(get_interface(PPB_CORE_INTERFACE));
-    ppb_graphics2d_ = static_cast<const PPB_Graphics2D*>(
-        get_interface(PPB_GRAPHICS_2D_INTERFACE));
-    ppb_image_data_ = static_cast<const PPB_ImageData*>(
-        get_interface(PPB_IMAGEDATA_INTERFACE));
-    ppb_instance_ =
-        static_cast<const PPB_Instance*>(get_interface(PPB_INSTANCE_INTERFACE));
-    return PP_OK;
-  }
-  static void ShutdownModule() {
-    EXPECT_NE(0, current_test_->pp_module_);
-    current_test_->pp_module_ = 0;
-  }
-
-  static void DummyCallback(void*, int32_t) {}
-
-  void PaintSomething() {
-    PP_Size size = {2, 1};
-    PP_Resource image = ppb_image_data_->Create(
-        pp_instance_, ppb_image_data_->GetNativeImageDataFormat(), &size,
-        PP_TRUE);
-    int32_t* pixels = static_cast<int32_t*>(ppb_image_data_->Map(image));
-    pixels[0] = 0xff000000;
-    pixels[1] = 0xffffffff;
-    ppb_image_data_->Unmap(image);
-    ppb_graphics2d_->ReplaceContents(graphics2d_, image);
-    PP_CompletionCallback callback = {
-        &PepperWebPluginImplBrowserTest::DummyCallback, nullptr, 0};
-    ppb_graphics2d_->Flush(graphics2d_, callback);
-    ppb_core_->ReleaseResource(image);
-  }
-
-  // PPP_Instance implementation
-  static PP_Bool DidCreate(PP_Instance instance,
-                           uint32_t,
-                           const char* [],
-                           const char* []) {
-    EXPECT_EQ(0, current_test_->pp_instance_);
-    current_test_->pp_instance_ = instance;
-    PP_Size size = {2, 1};
-    current_test_->graphics2d_ =
-        ppb_graphics2d_->Create(instance, &size, PP_TRUE);
-    ppb_instance_->BindGraphics(instance, current_test_->graphics2d_);
-    return PP_TRUE;
-  }
-  static void DidDestroy(PP_Instance instance) {
-    EXPECT_NE(0, current_test_->pp_instance_);
-    current_test_->PaintSomething();
-    ppb_core_->ReleaseResource(current_test_->graphics2d_);
-    current_test_->pp_instance_ = 0;
-  }
-  static void DidChangeView(PP_Instance, PP_Resource) {}
-  static void DidChangeFocus(PP_Instance, PP_Bool) {}
-  static PP_Bool HandleDocumentLoad(PP_Instance, PP_Resource) {
-    return PP_FALSE;
-  }
-
-  static ContentPluginInfo GetPluginInfo() {
-    ContentPluginInfo info;
-    info.is_internal = true;
-    info.path = base::FilePath(FILE_PATH_LITERAL("internal-always-throttle"));
-    info.name = "Always Throttle";
-    info.mime_types.push_back(
-        WebPluginMimeType("test/always-throttle", "", ""));
-    info.internal_entry_points.get_interface =
-        &PepperWebPluginImplBrowserTest::GetInterface;
-    info.internal_entry_points.initialize_module =
-        &PepperWebPluginImplBrowserTest::InitializeModule;
-    info.internal_entry_points.shutdown_module =
-        &PepperWebPluginImplBrowserTest::ShutdownModule;
-    return info;
-  }
-
-  class MockContentClient : public TestContentClient {
-   public:
-    void AddPlugins(std::vector<ContentPluginInfo>* plugins) override {
-      plugins->push_back(GetPluginInfo());
-    }
-  };
-  class MockContentRendererClient : public ContentRendererClient {
-   public:
-    bool OverrideCreatePlugin(RenderFrame* render_frame,
-                              const blink::WebPluginParams& params,
-                              blink::WebPlugin** plugin) override {
-      *plugin =
-          render_frame->CreatePlugin(GetPluginInfo().ToWebPluginInfo(), params);
-      return *plugin;
-    }
-
-    bool IsOriginIsolatedPepperPlugin(const base::FilePath& ignored) override {
-      return false;
-    }
-  };
-
-  PP_Module pp_module_;
-  PP_Instance pp_instance_;
-  PP_Resource graphics2d_;
-  static PepperWebPluginImplBrowserTest* current_test_;
-  static const PPB_Core* ppb_core_;
-  static const PPB_Graphics2D* ppb_graphics2d_;
-  static const PPB_ImageData* ppb_image_data_;
-  static const PPB_Instance* ppb_instance_;
-};
-PepperWebPluginImplBrowserTest* PepperWebPluginImplBrowserTest::current_test_;
-const PPB_Core* PepperWebPluginImplBrowserTest::ppb_core_;
-const PPB_Graphics2D* PepperWebPluginImplBrowserTest::ppb_graphics2d_;
-const PPB_ImageData* PepperWebPluginImplBrowserTest::ppb_image_data_;
-const PPB_Instance* PepperWebPluginImplBrowserTest::ppb_instance_;
-
-// This test simulates the behavior of a plugin that emits new frames during
-// destruction. The throttler shouldn't engage and create a placeholder for
-// a to-be destroyed plugin in such case. See crbug.com/483068
-TEST_F(PepperWebPluginImplBrowserTest, NotEngageThrottleDuringDestroy) {
-  LoadHTML("<!DOCTYPE html><object type='test/always-throttle'></object>");
-  EXPECT_NE(0, pp_instance_);
-  LoadHTML("");
-  EXPECT_EQ(0, pp_instance_);
-}
-
-}  // unnamed namespace
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_websocket_host.cc b/content/renderer/pepper/pepper_websocket_host.cc
deleted file mode 100644
index 72f42c50..0000000
--- a/content/renderer/pepper/pepper_websocket_host.cc
+++ /dev/null
@@ -1,324 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/pepper_websocket_host.h"
-
-#include <string>
-
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "net/base/port_util.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/c/ppb_websocket.h"
-#include "ppapi/host/dispatch_host_message.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "third_party/blink/public/platform/web_string.h"
-#include "third_party/blink/public/platform/web_url.h"
-#include "third_party/blink/public/web/web_array_buffer.h"
-#include "third_party/blink/public/web/web_document.h"
-#include "third_party/blink/public/web/web_plugin_container.h"
-
-using blink::WebArrayBuffer;
-using blink::WebDocument;
-using blink::WebString;
-using blink::WebPepperSocket;
-using blink::WebURL;
-
-namespace content {
-
-#define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, np_name)        \
-  static_assert(static_cast<int>(WebPepperSocket::webkit_name) == \
-                    static_cast<int>(np_name),                    \
-                "WebSocket enums must match PPAPI's")
-
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodeNormalClosure,
-                             PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE);
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodeGoingAway,
-                             PP_WEBSOCKETSTATUSCODE_GOING_AWAY);
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodeProtocolError,
-                             PP_WEBSOCKETSTATUSCODE_PROTOCOL_ERROR);
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodeUnsupportedData,
-                             PP_WEBSOCKETSTATUSCODE_UNSUPPORTED_DATA);
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodeNoStatusRcvd,
-                             PP_WEBSOCKETSTATUSCODE_NO_STATUS_RECEIVED);
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodeAbnormalClosure,
-                             PP_WEBSOCKETSTATUSCODE_ABNORMAL_CLOSURE);
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodeInvalidFramePayloadData,
-                             PP_WEBSOCKETSTATUSCODE_INVALID_FRAME_PAYLOAD_DATA);
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodePolicyViolation,
-                             PP_WEBSOCKETSTATUSCODE_POLICY_VIOLATION);
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodeMessageTooBig,
-                             PP_WEBSOCKETSTATUSCODE_MESSAGE_TOO_BIG);
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodeMandatoryExt,
-                             PP_WEBSOCKETSTATUSCODE_MANDATORY_EXTENSION);
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodeInternalError,
-                             PP_WEBSOCKETSTATUSCODE_INTERNAL_SERVER_ERROR);
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodeTLSHandshake,
-                             PP_WEBSOCKETSTATUSCODE_TLS_HANDSHAKE);
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodeMinimumUserDefined,
-                             PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MIN);
-COMPILE_ASSERT_MATCHING_ENUM(kCloseEventCodeMaximumUserDefined,
-                             PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MAX);
-
-PepperWebSocketHost::PepperWebSocketHost(RendererPpapiHost* host,
-                                         PP_Instance instance,
-                                         PP_Resource resource)
-    : ResourceHost(host->GetPpapiHost(), instance, resource),
-      renderer_ppapi_host_(host),
-      connecting_(false),
-      initiating_close_(false),
-      accepting_close_(false),
-      error_was_received_(false) {}
-
-PepperWebSocketHost::~PepperWebSocketHost() {
-  if (websocket_)
-    websocket_->Disconnect();
-}
-
-int32_t PepperWebSocketHost::OnResourceMessageReceived(
-    const IPC::Message& msg,
-    ppapi::host::HostMessageContext* context) {
-  PPAPI_BEGIN_MESSAGE_MAP(PepperWebSocketHost, msg)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_WebSocket_Connect,
-                                      OnHostMsgConnect)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_WebSocket_Close,
-                                      OnHostMsgClose)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_WebSocket_SendText,
-                                      OnHostMsgSendText)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_WebSocket_SendBinary,
-                                      OnHostMsgSendBinary)
-    PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_WebSocket_Fail,
-                                      OnHostMsgFail)
-  PPAPI_END_MESSAGE_MAP()
-  return PP_ERROR_FAILED;
-}
-
-void PepperWebSocketHost::DidConnect() {
-  std::string protocol;
-  if (websocket_)
-    protocol = websocket_->Subprotocol().Utf8();
-  connecting_ = false;
-  connect_reply_.params.set_result(PP_OK);
-  host()->SendReply(connect_reply_,
-                    PpapiPluginMsg_WebSocket_ConnectReply(url_, protocol));
-}
-
-void PepperWebSocketHost::DidReceiveMessage(const blink::WebString& message) {
-  // Dispose packets after receiving an error.
-  if (error_was_received_)
-    return;
-
-  // Send an IPC to transport received data.
-  std::string string_message = message.Utf8();
-  host()->SendUnsolicitedReply(
-      pp_resource(), PpapiPluginMsg_WebSocket_ReceiveTextReply(string_message));
-}
-
-void PepperWebSocketHost::DidReceiveArrayBuffer(
-    const blink::WebArrayBuffer& binaryData) {
-  // Dispose packets after receiving an error.
-  if (error_was_received_)
-    return;
-
-  // Send an IPC to transport received data.
-  uint8_t* data = static_cast<uint8_t*>(binaryData.Data());
-  std::vector<uint8_t> array_message(data, data + binaryData.ByteLength());
-  host()->SendUnsolicitedReply(
-      pp_resource(),
-      PpapiPluginMsg_WebSocket_ReceiveBinaryReply(array_message));
-}
-
-void PepperWebSocketHost::DidReceiveMessageError() {
-  // Records the error, then stops receiving any frames after this error.
-  // The error must be notified after all queued messages are read.
-  error_was_received_ = true;
-
-  // Send an IPC to report the error. After this IPC, ReceiveTextReply and
-  // ReceiveBinaryReply IPC are not sent anymore because |error_was_received_|
-  // blocks.
-  host()->SendUnsolicitedReply(pp_resource(),
-                               PpapiPluginMsg_WebSocket_ErrorReply());
-}
-
-void PepperWebSocketHost::DidUpdateBufferedAmount(uint64_t buffered_amount) {
-  // Send an IPC to update buffered amount.
-  host()->SendUnsolicitedReply(
-      pp_resource(),
-      PpapiPluginMsg_WebSocket_BufferedAmountReply(buffered_amount));
-}
-
-void PepperWebSocketHost::DidStartClosingHandshake() {
-  accepting_close_ = true;
-
-  // Send an IPC to notice that server starts closing handshake.
-  host()->SendUnsolicitedReply(
-      pp_resource(),
-      PpapiPluginMsg_WebSocket_StateReply(PP_WEBSOCKETREADYSTATE_CLOSING));
-}
-
-void PepperWebSocketHost::DidClose(uint64_t unhandled_buffered_amount,
-                                   ClosingHandshakeCompletionStatus status,
-                                   uint16_t code,
-                                   const blink::WebString& reason) {
-  if (connecting_) {
-    connecting_ = false;
-    connect_reply_.params.set_result(PP_ERROR_FAILED);
-    host()->SendReply(
-        connect_reply_,
-        PpapiPluginMsg_WebSocket_ConnectReply(url_, std::string()));
-  }
-
-  // Set close_was_clean_.
-  bool was_clean = (initiating_close_ || accepting_close_) &&
-                   !unhandled_buffered_amount &&
-                   status == WebPepperSocketClient::kClosingHandshakeComplete;
-
-  if (initiating_close_) {
-    initiating_close_ = false;
-    close_reply_.params.set_result(PP_OK);
-    host()->SendReply(close_reply_, PpapiPluginMsg_WebSocket_CloseReply(
-                                        unhandled_buffered_amount, was_clean,
-                                        code, reason.Utf8()));
-  } else {
-    accepting_close_ = false;
-    host()->SendUnsolicitedReply(
-        pp_resource(),
-        PpapiPluginMsg_WebSocket_ClosedReply(unhandled_buffered_amount,
-                                             was_clean, code, reason.Utf8()));
-  }
-
-  // Disconnect.
-  if (websocket_) {
-    websocket_->Disconnect();
-    websocket_.reset();
-  }
-}
-
-int32_t PepperWebSocketHost::OnHostMsgConnect(
-    ppapi::host::HostMessageContext* context,
-    const std::string& url,
-    const std::vector<std::string>& protocols) {
-  // Validate url and convert it to WebURL.
-  GURL gurl(url);
-  url_ = gurl.spec();
-  if (!gurl.is_valid())
-    return PP_ERROR_BADARGUMENT;
-  if (!gurl.SchemeIs("ws") && !gurl.SchemeIs("wss"))
-    return PP_ERROR_BADARGUMENT;
-  if (gurl.has_ref())
-    return PP_ERROR_BADARGUMENT;
-  if (!net::IsPortAllowedForScheme(gurl.EffectiveIntPort(),
-                                   gurl.scheme_piece()))
-    return PP_ERROR_BADARGUMENT;
-  WebURL web_url(gurl);
-
-  // Validate protocols.
-  std::string protocol_string;
-  for (auto vector_it = protocols.begin(); vector_it != protocols.end();
-       ++vector_it) {
-    // Check containing characters.
-    for (std::string::const_iterator string_it = vector_it->begin();
-         string_it != vector_it->end();
-         ++string_it) {
-      uint8_t character = *string_it;
-      // WebSocket specification says "(Subprotocol string must consist of)
-      // characters in the range U+0021 to U+007E not including separator
-      // characters as defined in [RFC2616]."
-      const uint8_t minimumProtocolCharacter = '!';  // U+0021.
-      const uint8_t maximumProtocolCharacter = '~';  // U+007E.
-      if (character < minimumProtocolCharacter ||
-          character > maximumProtocolCharacter || character == '"' ||
-          character == '(' || character == ')' || character == ',' ||
-          character == '/' ||
-          (character >= ':' && character <= '@') ||  // U+003A - U+0040
-          (character >= '[' && character <= ']') ||  // U+005B - u+005D
-          character == '{' ||
-          character == '}')
-        return PP_ERROR_BADARGUMENT;
-    }
-    // Join protocols with the comma separator.
-    if (vector_it != protocols.begin())
-      protocol_string.append(",");
-    protocol_string.append(*vector_it);
-  }
-
-  // Convert protocols to WebString.
-  WebString web_protocols = WebString::FromUTF8(protocol_string);
-
-  // Create blink::WebSocket object and connect.
-  blink::WebPluginContainer* container =
-      renderer_ppapi_host_->GetContainerForInstance(pp_instance());
-  if (!container)
-    return PP_ERROR_BADARGUMENT;
-  websocket_ = WebPepperSocket::Create(container->GetDocument(), this);
-  DCHECK(websocket_.get());
-  if (!websocket_)
-    return PP_ERROR_NOTSUPPORTED;
-
-  websocket_->Connect(web_url, web_protocols);
-
-  connect_reply_ = context->MakeReplyMessageContext();
-  connecting_ = true;
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperWebSocketHost::OnHostMsgClose(
-    ppapi::host::HostMessageContext* context,
-    int32_t code,
-    const std::string& reason) {
-  if (!websocket_)
-    return PP_ERROR_FAILED;
-  close_reply_ = context->MakeReplyMessageContext();
-  initiating_close_ = true;
-
-  blink::WebPepperSocket::CloseEventCode event_code =
-      static_cast<blink::WebPepperSocket::CloseEventCode>(code);
-  if (code == PP_WEBSOCKETSTATUSCODE_NOT_SPECIFIED) {
-    // PP_WEBSOCKETSTATUSCODE_NOT_SPECIFIED and CloseEventCodeNotSpecified are
-    // assigned to different values. A conversion is needed if
-    // PP_WEBSOCKETSTATUSCODE_NOT_SPECIFIED is specified.
-    event_code = blink::WebPepperSocket::kCloseEventCodeNotSpecified;
-  }
-
-  WebString web_reason = WebString::FromUTF8(reason);
-  websocket_->Close(event_code, web_reason);
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PepperWebSocketHost::OnHostMsgSendText(
-    ppapi::host::HostMessageContext* context,
-    const std::string& message) {
-  if (websocket_) {
-    WebString web_message = WebString::FromUTF8(message);
-    websocket_->SendText(web_message);
-  }
-  return PP_OK;
-}
-
-int32_t PepperWebSocketHost::OnHostMsgSendBinary(
-    ppapi::host::HostMessageContext* context,
-    const std::vector<uint8_t>& message) {
-  if (websocket_.get() && !message.empty()) {
-    WebArrayBuffer web_message = WebArrayBuffer::Create(message.size(), 1);
-    memcpy(web_message.Data(), &message.front(), message.size());
-    websocket_->SendArrayBuffer(web_message);
-  }
-  return PP_OK;
-}
-
-int32_t PepperWebSocketHost::OnHostMsgFail(
-    ppapi::host::HostMessageContext* context,
-    const std::string& message) {
-  if (websocket_)
-    websocket_->Fail(WebString::FromUTF8(message));
-  return PP_OK;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/pepper_websocket_host.h b/content/renderer/pepper/pepper_websocket_host.h
deleted file mode 100644
index a3d0a8c..0000000
--- a/content/renderer/pepper/pepper_websocket_host.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PEPPER_WEBSOCKET_HOST_H_
-#define CONTENT_RENDERER_PEPPER_PEPPER_WEBSOCKET_HOST_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/memory/raw_ptr.h"
-#include "ppapi/host/host_message_context.h"
-#include "ppapi/host/resource_host.h"
-#include "ppapi/proxy/resource_message_params.h"
-#include "third_party/blink/public/web/web_pepper_socket.h"
-#include "third_party/blink/public/web/web_pepper_socket_client.h"
-
-namespace content {
-
-class RendererPpapiHost;
-
-class PepperWebSocketHost : public ppapi::host::ResourceHost,
-                            public ::blink::WebPepperSocketClient {
- public:
-  explicit PepperWebSocketHost(RendererPpapiHost* host,
-                               PP_Instance instance,
-                               PP_Resource resource);
-
-  PepperWebSocketHost(const PepperWebSocketHost&) = delete;
-  PepperWebSocketHost& operator=(const PepperWebSocketHost&) = delete;
-
-  ~PepperWebSocketHost() override;
-
-  int32_t OnResourceMessageReceived(
-      const IPC::Message& msg,
-      ppapi::host::HostMessageContext* context) override;
-
-  // WebPepperSocketClient implementation.
-  void DidConnect() override;
-  void DidReceiveMessage(const blink::WebString& message) override;
-  void DidReceiveArrayBuffer(const blink::WebArrayBuffer& binaryData) override;
-  void DidReceiveMessageError() override;
-  void DidUpdateBufferedAmount(uint64_t buffered_amount) override;
-  void DidStartClosingHandshake() override;
-  void DidClose(uint64_t unhandled_buffered_amount,
-                ClosingHandshakeCompletionStatus status,
-                uint16_t code,
-                const blink::WebString& reason) override;
-
- private:
-  // IPC message handlers.
-  int32_t OnHostMsgConnect(ppapi::host::HostMessageContext* context,
-                           const std::string& url,
-                           const std::vector<std::string>& protocols);
-  int32_t OnHostMsgClose(ppapi::host::HostMessageContext* context,
-                         int32_t code,
-                         const std::string& reason);
-  int32_t OnHostMsgSendText(ppapi::host::HostMessageContext* context,
-                            const std::string& message);
-  int32_t OnHostMsgSendBinary(ppapi::host::HostMessageContext* context,
-                              const std::vector<uint8_t>& message);
-  int32_t OnHostMsgFail(ppapi::host::HostMessageContext* context,
-                        const std::string& message);
-
-  // Non-owning pointer.
-  raw_ptr<RendererPpapiHost> renderer_ppapi_host_;
-
-  // IPC reply parameters.
-  ppapi::host::ReplyMessageContext connect_reply_;
-  ppapi::host::ReplyMessageContext close_reply_;
-
-  // The server URL to which this instance connects.
-  std::string url_;
-
-  // A flag to indicate if opening handshake is going on.
-  bool connecting_;
-
-  // A flag to indicate if client initiated closing handshake is performed.
-  bool initiating_close_;
-
-  // A flag to indicate if server initiated closing handshake is performed.
-  bool accepting_close_;
-
-  // Becomes true if any error is detected. Incoming data will be disposed
-  // if this variable is true.
-  bool error_was_received_;
-
-  // Keeps the WebKit side WebSocket object. This is used for calling WebKit
-  // side functions via WebKit API.
-  std::unique_ptr<blink::WebPepperSocket> websocket_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PEPPER_WEBSOCKET_HOST_H_
diff --git a/content/renderer/pepper/plugin_module.cc b/content/renderer/pepper/plugin_module.cc
deleted file mode 100644
index ea7fa6a..0000000
--- a/content/renderer/pepper/plugin_module.cc
+++ /dev/null
@@ -1,732 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/plugin_module.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-
-#include <memory>
-#include <set>
-#include <utility>
-
-#include "base/command_line.h"
-#include "base/functional/bind.h"
-#include "base/logging.h"
-#include "base/no_destructor.h"
-#include "base/run_loop.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/time/time.h"
-#include "build/build_config.h"
-#include "components/nacl/common/buildflags.h"
-#include "content/public/common/content_plugin_info.h"
-#include "content/public/renderer/content_renderer_client.h"
-#include "content/renderer/pepper/host_dispatcher_wrapper.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/pepper_browser_connection.h"
-#include "content/renderer/pepper/pepper_hung_plugin_filter.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/pepper_plugin_registry.h"
-#include "content/renderer/pepper/ppapi_preferences_builder.h"
-#include "content/renderer/pepper/ppb_image_data_impl.h"
-#include "content/renderer/pepper/ppb_proxy_impl.h"
-#include "content/renderer/pepper/ppb_var_deprecated_impl.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "content/renderer/render_frame_impl.h"
-#include "content/renderer/render_thread_impl.h"
-#include "ppapi/c/dev/ppb_audio_input_dev.h"
-#include "ppapi/c/dev/ppb_audio_output_dev.h"
-#include "ppapi/c/dev/ppb_buffer_dev.h"
-#include "ppapi/c/dev/ppb_char_set_dev.h"
-#include "ppapi/c/dev/ppb_crypto_dev.h"
-#include "ppapi/c/dev/ppb_cursor_control_dev.h"
-#include "ppapi/c/dev/ppb_device_ref_dev.h"
-#include "ppapi/c/dev/ppb_file_chooser_dev.h"
-#include "ppapi/c/dev/ppb_gles_chromium_texture_mapping_dev.h"
-#include "ppapi/c/dev/ppb_memory_dev.h"
-#include "ppapi/c/dev/ppb_opengles2ext_dev.h"
-#include "ppapi/c/dev/ppb_printing_dev.h"
-#include "ppapi/c/dev/ppb_text_input_dev.h"
-#include "ppapi/c/dev/ppb_trace_event_dev.h"
-#include "ppapi/c/dev/ppb_url_util_dev.h"
-#include "ppapi/c/dev/ppb_var_deprecated.h"
-#include "ppapi/c/dev/ppb_video_capture_dev.h"
-#include "ppapi/c/dev/ppb_video_decoder_dev.h"
-#include "ppapi/c/dev/ppb_view_dev.h"
-#include "ppapi/c/pp_module.h"
-#include "ppapi/c/pp_resource.h"
-#include "ppapi/c/pp_var.h"
-#include "ppapi/c/ppb_audio.h"
-#include "ppapi/c/ppb_audio_buffer.h"
-#include "ppapi/c/ppb_audio_config.h"
-#include "ppapi/c/ppb_console.h"
-#include "ppapi/c/ppb_core.h"
-#include "ppapi/c/ppb_file_io.h"
-#include "ppapi/c/ppb_file_ref.h"
-#include "ppapi/c/ppb_file_system.h"
-#include "ppapi/c/ppb_fullscreen.h"
-#include "ppapi/c/ppb_graphics_2d.h"
-#include "ppapi/c/ppb_graphics_3d.h"
-#include "ppapi/c/ppb_host_resolver.h"
-#include "ppapi/c/ppb_image_data.h"
-#include "ppapi/c/ppb_instance.h"
-#include "ppapi/c/ppb_media_stream_audio_track.h"
-#include "ppapi/c/ppb_media_stream_video_track.h"
-#include "ppapi/c/ppb_messaging.h"
-#include "ppapi/c/ppb_mouse_cursor.h"
-#include "ppapi/c/ppb_mouse_lock.h"
-#include "ppapi/c/ppb_net_address.h"
-#include "ppapi/c/ppb_network_list.h"
-#include "ppapi/c/ppb_network_monitor.h"
-#include "ppapi/c/ppb_network_proxy.h"
-#include "ppapi/c/ppb_opengles2.h"
-#include "ppapi/c/ppb_tcp_socket.h"
-#include "ppapi/c/ppb_text_input_controller.h"
-#include "ppapi/c/ppb_udp_socket.h"
-#include "ppapi/c/ppb_url_loader.h"
-#include "ppapi/c/ppb_url_request_info.h"
-#include "ppapi/c/ppb_url_response_info.h"
-#include "ppapi/c/ppb_var.h"
-#include "ppapi/c/ppb_var_array.h"
-#include "ppapi/c/ppb_var_array_buffer.h"
-#include "ppapi/c/ppb_var_dictionary.h"
-#include "ppapi/c/ppb_video_decoder.h"
-#include "ppapi/c/ppb_video_encoder.h"
-#include "ppapi/c/ppb_video_frame.h"
-#include "ppapi/c/ppb_view.h"
-#include "ppapi/c/ppb_vpn_provider.h"
-#include "ppapi/c/ppp.h"
-#include "ppapi/c/ppp_instance.h"
-#include "ppapi/c/private/ppb_camera_capabilities_private.h"
-#include "ppapi/c/private/ppb_camera_device_private.h"
-#include "ppapi/c/private/ppb_ext_crx_file_system_private.h"
-#include "ppapi/c/private/ppb_file_io_private.h"
-#include "ppapi/c/private/ppb_file_ref_private.h"
-#include "ppapi/c/private/ppb_host_resolver_private.h"
-#include "ppapi/c/private/ppb_instance_private.h"
-#include "ppapi/c/private/ppb_isolated_file_system_private.h"
-#include "ppapi/c/private/ppb_proxy_private.h"
-#include "ppapi/c/private/ppb_tcp_server_socket_private.h"
-#include "ppapi/c/private/ppb_tcp_socket_private.h"
-#include "ppapi/c/private/ppb_testing_private.h"
-#include "ppapi/c/private/ppb_udp_socket_private.h"
-#include "ppapi/c/private/ppb_uma_private.h"
-#include "ppapi/c/private/ppb_x509_certificate_private.h"
-#include "ppapi/c/trusted/ppb_browser_font_trusted.h"
-#include "ppapi/c/trusted/ppb_char_set_trusted.h"
-#include "ppapi/c/trusted/ppb_file_chooser_trusted.h"
-#include "ppapi/c/trusted/ppb_url_loader_trusted.h"
-#include "ppapi/shared_impl/callback_tracker.h"
-#include "ppapi/shared_impl/dictionary_var.h"
-#include "ppapi/shared_impl/ppapi_preferences.h"
-#include "ppapi/shared_impl/ppapi_switches.h"
-#include "ppapi/shared_impl/ppb_input_event_shared.h"
-#include "ppapi/shared_impl/ppb_opengles2_shared.h"
-#include "ppapi/shared_impl/ppb_var_shared.h"
-#include "ppapi/shared_impl/time_conversion.h"
-#include "ppapi/thunk/enter.h"
-#include "ppapi/thunk/ppb_graphics_2d_api.h"
-#include "ppapi/thunk/thunk.h"
-#include "third_party/blink/public/platform/web_security_origin.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-#include "third_party/blink/public/web/web_view.h"
-
-using ppapi::InputEventData;
-using ppapi::PpapiGlobals;
-using ppapi::TimeTicksToPPTimeTicks;
-using ppapi::TimeToPPTime;
-using ppapi::thunk::EnterResource;
-using ppapi::thunk::PPB_Graphics2D_API;
-using ppapi::thunk::PPB_InputEvent_API;
-
-namespace content {
-
-namespace {
-
-// Global tracking info for PPAPI plugins. This is lazily created before the
-// first plugin is allocated, and leaked on shutdown.
-//
-// Note that we don't want a Singleton here since destroying this object will
-// try to free some stuff that requires WebKit, and Singletons are destroyed
-// after WebKit.
-// TODO(raymes): I'm not sure if it is completely necessary to leak the
-// HostGlobals. Figure out the shutdown sequence and find a way to do this
-// more elegantly.
-HostGlobals* host_globals = nullptr;
-
-// Maintains all currently loaded plugin libs for validating PP_Module
-// identifiers.
-typedef std::set<PluginModule*> PluginModuleSet;
-
-PluginModuleSet* GetLivePluginSet() {
-  static base::NoDestructor<PluginModuleSet> live_plugin_libs;
-  return live_plugin_libs.get();
-}
-
-// PPB_Core --------------------------------------------------------------------
-
-void AddRefResource(PP_Resource resource) {
-  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(resource);
-}
-
-void ReleaseResource(PP_Resource resource) {
-  PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource(resource);
-}
-
-PP_Time GetTime() { return TimeToPPTime(base::Time::Now()); }
-
-PP_TimeTicks GetTickTime() {
-  return TimeTicksToPPTimeTicks(base::TimeTicks::Now());
-}
-
-void CallOnMainThread(int delay_in_msec,
-                      PP_CompletionCallback callback,
-                      int32_t result) {
-  if (callback.func) {
-    PpapiGlobals::Get()->GetMainThreadMessageLoop()->PostDelayedTask(
-        FROM_HERE, base::BindOnce(callback.func, callback.user_data, result),
-        base::Milliseconds(delay_in_msec));
-  }
-}
-
-PP_Bool IsMainThread() {
-  return PP_FromBool(PpapiGlobals::Get()
-                         ->GetMainThreadMessageLoop()
-                         ->BelongsToCurrentThread());
-}
-
-const PPB_Core core_interface = {&AddRefResource,   &ReleaseResource,
-                                 &GetTime,          &GetTickTime,
-                                 &CallOnMainThread, &IsMainThread};
-
-// PPB_Testing -----------------------------------------------------------------
-
-PP_Bool ReadImageData(PP_Resource device_context_2d,
-                      PP_Resource image,
-                      const PP_Point* top_left) {
-  EnterResource<PPB_Graphics2D_API> enter(device_context_2d, true);
-  if (enter.failed())
-    return PP_FALSE;
-  return PP_FromBool(enter.object()->ReadImageData(image, top_left));
-}
-
-void RunMessageLoop(PP_Instance instance) {
-  HostGlobals::Get()->RunMsgLoop();
-}
-
-void QuitMessageLoop(PP_Instance instance) {
-  HostGlobals::Get()->QuitMsgLoop();
-}
-
-uint32_t GetLiveObjectsForInstance(PP_Instance instance_id) {
-  return HostGlobals::Get()->GetResourceTracker()->GetLiveObjectsForInstance(
-      instance_id);
-}
-
-PP_Bool IsOutOfProcess() { return PP_FALSE; }
-
-void SimulateInputEvent(PP_Instance instance, PP_Resource input_event) {
-  PepperPluginInstanceImpl* plugin_instance =
-      host_globals->GetInstance(instance);
-  if (!plugin_instance)
-    return;
-
-  EnterResource<PPB_InputEvent_API> enter(input_event, false);
-  if (enter.failed())
-    return;
-
-  const InputEventData& input_event_data = enter.object()->GetInputEventData();
-  plugin_instance->SimulateInputEvent(input_event_data);
-}
-
-PP_Var GetDocumentURL(PP_Instance instance, PP_URLComponents_Dev* components) {
-  PepperPluginInstanceImpl* plugin_instance =
-      host_globals->GetInstance(instance);
-  if (!plugin_instance)
-    return PP_MakeUndefined();
-  return plugin_instance->GetDocumentURL(instance, components);
-}
-
-uint32_t GetLiveVars(PP_Var live_vars[], uint32_t array_size) {
-  std::vector<PP_Var> vars =
-      PpapiGlobals::Get()->GetVarTracker()->GetLiveVars();
-  for (size_t i = 0u;
-       i < std::min(static_cast<size_t>(array_size), vars.size());
-       ++i)
-    live_vars[i] = vars[i];
-  return vars.size();
-}
-
-void SetMinimumArrayBufferSizeForShmem(PP_Instance /*instance*/,
-                                       uint32_t /*threshold*/) {
-  // Does nothing. Not needed in-process.
-}
-
-void RunV8GC(PP_Instance pp_instance) {
-  PepperPluginInstanceImpl* instance =
-      content::PepperPluginInstanceImpl::GetForTesting(pp_instance);
-  instance->GetIsolate()->RequestGarbageCollectionForTesting(
-      v8::Isolate::kFullGarbageCollection);
-}
-
-const PPB_Testing_Private testing_interface = {
-    &ReadImageData,
-    &RunMessageLoop,
-    &QuitMessageLoop,
-    &GetLiveObjectsForInstance,
-    &IsOutOfProcess,
-    &SimulateInputEvent,
-    &GetDocumentURL,
-    &GetLiveVars,
-    &SetMinimumArrayBufferSizeForShmem,
-    &RunV8GC};
-
-// GetInterface ----------------------------------------------------------------
-
-const void* InternalGetInterface(const char* name) {
-// TODO(brettw) put these in a hash map for better performance.
-#define PROXIED_IFACE(iface_str, iface_struct) \
-  if (strcmp(name, iface_str) == 0)            \
-    return ppapi::thunk::Get##iface_struct##_Thunk();
-
-#include "ppapi/thunk/interfaces_ppb_private.h"
-#include "ppapi/thunk/interfaces_ppb_private_no_permissions.h"
-#include "ppapi/thunk/interfaces_ppb_public_dev.h"
-#include "ppapi/thunk/interfaces_ppb_public_dev_channel.h"
-#include "ppapi/thunk/interfaces_ppb_public_socket.h"
-#include "ppapi/thunk/interfaces_ppb_public_stable.h"
-
-#undef PROXIED_IFACE
-
-#define LEGACY_IFACE(iface_str, function_name) \
-  if (strcmp(name, iface_str) == 0)            \
-    return function_name;
-
-#include "ppapi/thunk/interfaces_legacy.h"
-
-#undef LEGACY_IFACE
-
-  // Only support the testing interface when the command line switch is
-  // specified. This allows us to prevent people from (ab)using this interface
-  // in production code.
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kEnablePepperTesting)) {
-    if (strcmp(name, PPB_TESTING_PRIVATE_INTERFACE) == 0)
-      return &testing_interface;
-  }
-  return nullptr;
-}
-
-const void* GetInterface(const char* name) {
-  // All interfaces should be used on the main thread.
-  CHECK(IsMainThread());
-
-  return InternalGetInterface(name);
-}
-
-// Gets the PPAPI entry points from the given library and places them into the
-// given structure. Returns true on success.
-bool LoadEntryPointsFromLibrary(const base::NativeLibrary& library,
-                                ContentPluginInfo::EntryPoints* entry_points) {
-  entry_points->get_interface =
-      reinterpret_cast<ContentPluginInfo::GetInterfaceFunc>(
-          base::GetFunctionPointerFromNativeLibrary(library,
-                                                    "PPP_GetInterface"));
-  if (!entry_points->get_interface) {
-    LOG(WARNING) << "No PPP_GetInterface in plugin library";
-    return false;
-  }
-
-  entry_points->initialize_module =
-      reinterpret_cast<ContentPluginInfo::PPP_InitializeModuleFunc>(
-          base::GetFunctionPointerFromNativeLibrary(library,
-                                                    "PPP_InitializeModule"));
-  if (!entry_points->initialize_module) {
-    LOG(WARNING) << "No PPP_InitializeModule in plugin library";
-    return false;
-  }
-
-  // It's okay for PPP_ShutdownModule to not be defined and shutdown_module to
-  // be NULL.
-  entry_points->shutdown_module =
-      reinterpret_cast<ContentPluginInfo::PPP_ShutdownModuleFunc>(
-          base::GetFunctionPointerFromNativeLibrary(library,
-                                                    "PPP_ShutdownModule"));
-
-  return true;
-}
-
-void CreateHostForInProcessModule(RenderFrameImpl* render_frame,
-                                  PluginModule* module,
-                                  const WebPluginInfo& webplugin_info) {
-  // First time an in-process plugin was used, make a host for it.
-  const ContentPluginInfo* info =
-      PepperPluginRegistry::GetInstance()->GetInfoForPlugin(webplugin_info);
-  DCHECK(!info->is_out_of_process);
-
-  ppapi::PpapiPermissions perms(PepperPluginRegistry::GetInstance()
-                                    ->GetInfoForPlugin(webplugin_info)
-                                    ->permissions);
-  RendererPpapiHostImpl* host_impl =
-      RendererPpapiHostImpl::CreateOnModuleForInProcess(module, perms);
-  render_frame->PepperPluginCreated(host_impl);
-}
-
-}  // namespace
-
-// PluginModule ----------------------------------------------------------------
-
-PluginModule::PluginModule(const std::string& name,
-                           const std::string& version,
-                           const base::FilePath& path,
-                           const ppapi::PpapiPermissions& perms)
-    : callback_tracker_(new ppapi::CallbackTracker),
-      is_in_destructor_(false),
-      is_crashed_(false),
-      library_(nullptr),
-      name_(name),
-      version_(version),
-      path_(path),
-      permissions_(ppapi::PpapiPermissions::GetForCommandLine(perms.GetBits())),
-      reserve_instance_id_(nullptr) {
-  // Ensure the globals object is created.
-  if (!host_globals)
-    host_globals = new HostGlobals;
-
-  memset(&entry_points_, 0, sizeof(entry_points_));
-  pp_module_ = HostGlobals::Get()->AddModule(this);
-  GetLivePluginSet()->insert(this);
-}
-
-PluginModule::~PluginModule() {
-  // In the past there have been crashes reentering the plugin module
-  // destructor. Catch if that happens again earlier.
-  CHECK(!is_in_destructor_);
-  is_in_destructor_ = true;
-
-  // When the module is being deleted, there should be no more instances still
-  // holding a reference to us.
-  DCHECK(instances_.empty());
-
-  // Some resources and other stuff are hung off of the embedder state, which
-  // should be torn down before the routing stuff below.
-  renderer_ppapi_host_.reset();
-
-  GetLivePluginSet()->erase(this);
-
-  callback_tracker_->AbortAll();
-
-  if (entry_points_.shutdown_module)
-    entry_points_.shutdown_module();
-
-  if (library_)
-    base::UnloadNativeLibrary(library_);
-
-  // Notifications that we've been deleted should be last.
-  HostGlobals::Get()->ModuleDeleted(pp_module_);
-  if (!is_crashed_) {
-    // When the plugin crashes, we immediately tell the lifetime delegate that
-    // we're gone, so we don't want to tell it again.
-    PepperPluginRegistry::GetInstance()->PluginModuleDead(this);
-  }
-
-  // Don't add stuff here, the two notifications that the module object has
-  // been deleted should be last. This allows, for example,
-  // PPB_Proxy.IsInModuleDestructor to map PP_Module to this class during the
-  // previous parts of the destructor.
-}
-
-void PluginModule::SetRendererPpapiHost(
-    std::unique_ptr<RendererPpapiHostImpl> host) {
-  renderer_ppapi_host_ = std::move(host);
-}
-
-bool PluginModule::InitAsInternalPlugin(
-    const ContentPluginInfo::EntryPoints& entry_points) {
-  if (InitializeModule(entry_points)) {
-    entry_points_ = entry_points;
-    return true;
-  }
-  return false;
-}
-
-bool PluginModule::InitAsLibrary(const base::FilePath& path) {
-  base::NativeLibrary library = base::LoadNativeLibrary(path, nullptr);
-  if (!library)
-    return false;
-
-  ContentPluginInfo::EntryPoints entry_points;
-
-  if (!LoadEntryPointsFromLibrary(library, &entry_points) ||
-      !InitializeModule(entry_points)) {
-    base::UnloadNativeLibrary(library);
-    return false;
-  }
-  entry_points_ = entry_points;
-  library_ = library;
-  return true;
-}
-
-void PluginModule::InitAsProxied(
-    HostDispatcherWrapper* host_dispatcher_wrapper) {
-  DCHECK(!host_dispatcher_wrapper_.get());
-  host_dispatcher_wrapper_.reset(host_dispatcher_wrapper);
-}
-
-scoped_refptr<PluginModule>
-PluginModule::CreateModuleForExternalPluginInstance() {
-  // Create a new module, but don't set the lifetime delegate. This isn't a
-  // plugin in the usual sense, so it isn't tracked by the browser.
-  scoped_refptr<PluginModule> external_plugin_module(
-      new PluginModule(name_, version_, path_, permissions_));
-  return external_plugin_module;
-}
-
-PP_ExternalPluginResult PluginModule::InitAsProxiedExternalPlugin(
-    PepperPluginInstanceImpl* instance) {
-  DCHECK(host_dispatcher_wrapper_.get());
-  // InitAsProxied (for the trusted/out-of-process case) initializes only the
-  // module, and one or more instances are added later. In this case, the
-  // PluginInstance was already created as in-process, so we missed the proxy
-  // AddInstance step and must do it now.
-  host_dispatcher_wrapper_->AddInstance(instance->pp_instance());
-  // For external plugins, we need to tell the instance to reset itself as
-  // proxied. This will clear cached interface pointers and send DidCreate (etc)
-  // to the plugin side of the proxy.
-  return instance->ResetAsProxied(this);
-}
-
-bool PluginModule::IsProxied() const { return !!host_dispatcher_wrapper_; }
-
-base::ProcessId PluginModule::GetPeerProcessId() {
-  if (host_dispatcher_wrapper_)
-    return host_dispatcher_wrapper_->peer_pid();
-  return base::kNullProcessId;
-}
-
-int PluginModule::GetPluginChildId() {
-  if (host_dispatcher_wrapper_)
-    return host_dispatcher_wrapper_->plugin_child_id();
-  return 0;
-}
-
-// static
-const PPB_Core* PluginModule::GetCore() { return &core_interface; }
-
-// static
-bool PluginModule::SupportsInterface(const char* name) {
-  return !!InternalGetInterface(name);
-}
-
-PepperPluginInstanceImpl* PluginModule::CreateInstance(
-    RenderFrameImpl* render_frame,
-    blink::WebPluginContainer* container,
-    const GURL& plugin_url) {
-  PepperPluginInstanceImpl* instance = PepperPluginInstanceImpl::Create(
-      render_frame, this, container, plugin_url,
-      render_frame->GetWebFrame()->GetAgentGroupScheduler()->Isolate());
-  if (!instance) {
-    LOG(WARNING) << "Plugin doesn't support instance interface, failing.";
-    return nullptr;
-  }
-  if (host_dispatcher_wrapper_)
-    host_dispatcher_wrapper_->AddInstance(instance->pp_instance());
-  return instance;
-}
-
-PepperPluginInstanceImpl* PluginModule::GetSomeInstance() const {
-  // This will generally crash later if there is not actually any instance to
-  // return, so we force a crash now to make bugs easier to track down.
-  CHECK(!instances_.empty());
-  return *instances_.begin();
-}
-
-const void* PluginModule::GetPluginInterface(const char* name) const {
-  if (host_dispatcher_wrapper_)
-    return host_dispatcher_wrapper_->GetProxiedInterface(name);
-
-  // In-process plugins.
-  if (!entry_points_.get_interface)
-    return nullptr;
-  return entry_points_.get_interface(name);
-}
-
-void PluginModule::InstanceCreated(PepperPluginInstanceImpl* instance) {
-  instances_.insert(instance);
-}
-
-void PluginModule::InstanceDeleted(PepperPluginInstanceImpl* instance) {
-  if (host_dispatcher_wrapper_)
-    host_dispatcher_wrapper_->RemoveInstance(instance->pp_instance());
-  instances_.erase(instance);
-}
-
-scoped_refptr<ppapi::CallbackTracker> PluginModule::GetCallbackTracker() {
-  return callback_tracker_;
-}
-
-void PluginModule::PluginCrashed() {
-  DCHECK(!is_crashed_);  // Should only get one notification.
-  is_crashed_ = true;
-
-  // Notify all instances that they crashed.
-  for (auto i = instances_.begin(); i != instances_.end(); ++i)
-    (*i)->InstanceCrashed();
-
-  PepperPluginRegistry::GetInstance()->PluginModuleDead(this);
-}
-
-void PluginModule::SetReserveInstanceIDCallback(
-    PP_Bool (*reserve)(PP_Module, PP_Instance)) {
-  DCHECK(!reserve_instance_id_) << "Only expect one set.";
-  reserve_instance_id_ = reserve;
-}
-
-bool PluginModule::ReserveInstanceID(PP_Instance instance) {
-  if (reserve_instance_id_)
-    return PP_ToBool(reserve_instance_id_(pp_module_, instance));
-  return true;  // Instance ID is usable.
-}
-
-RendererPpapiHostImpl* PluginModule::CreateOutOfProcessModule(
-    RenderFrameImpl* render_frame,
-    const base::FilePath& path,
-    ppapi::PpapiPermissions permissions,
-    const IPC::ChannelHandle& channel_handle,
-    base::ProcessId peer_pid,
-    int plugin_child_id,
-    bool is_external,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  mojo::PendingRemote<mojom::PepperHungDetectorHost> hung_host;
-  render_frame->GetPepperHost()->BindHungDetectorHost(
-      hung_host.InitWithNewPipeAndPassReceiver(), plugin_child_id, path);
-  scoped_refptr<PepperHungPluginFilter> hung_filter(
-      new PepperHungPluginFilter());
-  hung_filter->BindHungDetectorHost(std::move(hung_host));
-
-  std::unique_ptr<HostDispatcherWrapper> dispatcher(new HostDispatcherWrapper(
-      this, peer_pid, plugin_child_id, permissions, is_external));
-
-  RenderThreadImpl* render_thread = RenderThreadImpl::current();
-  if (!render_thread)
-    return nullptr;
-  scoped_refptr<gpu::GpuChannelHost> channel =
-      render_thread->EstablishGpuChannelSync();
-  // If no channel is established, feature statuses are unknown and disabled.
-  const gpu::GpuFeatureInfo default_gpu_feature_info;
-  const gpu::GpuFeatureInfo& gpu_feature_info =
-      channel ? channel->gpu_feature_info() : default_gpu_feature_info;
-
-  if (!dispatcher->Init(
-          channel_handle, &GetInterface,
-          ppapi::Preferences(PpapiPreferencesBuilder::Build(
-              render_frame->GetWebFrame()->View()->GetWebPreferences(),
-              gpu_feature_info)),
-          hung_filter.get(), task_runner)) {
-    return nullptr;
-  }
-
-  RendererPpapiHostImpl* host_impl =
-      RendererPpapiHostImpl::CreateOnModuleForOutOfProcess(
-          this, dispatcher->dispatcher(), permissions);
-  render_frame->PepperPluginCreated(host_impl);
-
-  InitAsProxied(dispatcher.release());
-  return host_impl;
-}
-
-// static
-void PluginModule::ResetHostGlobalsForTest() {
-  delete host_globals;
-  host_globals = nullptr;
-}
-
-bool PluginModule::InitializeModule(
-    const ContentPluginInfo::EntryPoints& entry_points) {
-  DCHECK(!host_dispatcher_wrapper_.get()) << "Don't call for proxied modules.";
-  DCHECK(entry_points.initialize_module != nullptr);
-  int retval = entry_points.initialize_module(pp_module(), &GetInterface);
-  if (retval != 0) {
-#if BUILDFLAG(ENABLE_NACL)
-    LOG(WARNING) << "PPP_InitializeModule returned failure " << retval;
-#endif  // BUILDFLAG(ENABLE_NACL)
-    return false;
-  }
-  return true;
-}
-
-scoped_refptr<PluginModule> PluginModule::Create(
-    RenderFrameImpl* render_frame,
-    const WebPluginInfo& webplugin_info,
-    const std::optional<url::Origin>& origin_lock,
-    bool* pepper_plugin_was_registered,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  *pepper_plugin_was_registered = true;
-
-  // See if a module has already been loaded for this plugin.
-  base::FilePath path(webplugin_info.path);
-  scoped_refptr<PluginModule> module =
-      PepperPluginRegistry::GetInstance()->GetLiveModule(path, origin_lock);
-  if (module.get()) {
-    if (!module->renderer_ppapi_host()) {
-      // If the module exists and no embedder state was associated with it,
-      // then the module was one of the ones preloaded and is an in-process
-      // plugin. We need to associate our host state with it.
-      CreateHostForInProcessModule(render_frame, module.get(), webplugin_info);
-    }
-    return module;
-  }
-
-  // In-process plugins will have always been created up-front to avoid the
-  // sandbox restrictions. So getting here implies it doesn't exist or should
-  // be out of process.
-  const ContentPluginInfo* info =
-      PepperPluginRegistry::GetInstance()->GetInfoForPlugin(webplugin_info);
-  if (!info) {
-    *pepper_plugin_was_registered = false;
-    return scoped_refptr<PluginModule>();
-  } else if (!info->is_out_of_process) {
-    // In-process plugin not preloaded, it probably couldn't be initialized.
-    return scoped_refptr<PluginModule>();
-  }
-
-  // Out of process: have the browser start the plugin process for us.
-  mojo::ScopedMessagePipeHandle channel_handle;
-  base::ProcessId peer_pid = 0;
-  int plugin_child_id = 0;
-
-  auto* browser_connection = PepperBrowserConnection::Get(render_frame);
-  mojom::PepperHost* host = browser_connection->GetHost();
-  host->OpenChannelToPepperPlugin(
-      render_frame->GetWebFrame()->GetSecurityOrigin(), path, origin_lock,
-      &channel_handle, &peer_pid, &plugin_child_id);
-  if (!channel_handle.is_valid()) {
-    // Couldn't be initialized.
-    return scoped_refptr<PluginModule>();
-  }
-
-  ppapi::PpapiPermissions permissions(info->permissions);
-
-  // AddLiveModule must be called before any early returns since the
-  // module's destructor will remove itself.
-  module = new PluginModule(info->name, info->version, path, permissions);
-  PepperPluginRegistry::GetInstance()->AddLiveModule(path, origin_lock,
-                                                     module.get());
-
-  if (!module->CreateOutOfProcessModule(render_frame, path, permissions,
-                                        channel_handle.release(), peer_pid,
-                                        plugin_child_id, false,
-                                        task_runner))  // is_external = false
-    return scoped_refptr<PluginModule>();
-
-  return module;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/plugin_module.h b/content/renderer/pepper/plugin_module.h
deleted file mode 100644
index 74603e14a..0000000
--- a/content/renderer/pepper/plugin_module.h
+++ /dev/null
@@ -1,276 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PLUGIN_MODULE_H_
-#define CONTENT_RENDERER_PEPPER_PLUGIN_MODULE_H_
-
-#include <map>
-#include <memory>
-#include <optional>
-#include <set>
-#include <string>
-
-#include "base/files/file_path.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "base/native_library.h"
-#include "base/process/process.h"
-#include "base/task/single_thread_task_runner.h"
-#include "content/common/content_export.h"
-#include "content/public/common/content_plugin_info.h"
-#include "ppapi/c/pp_bool.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/c/ppb_core.h"
-#include "ppapi/c/private/ppb_instance_private.h"
-#include "ppapi/shared_impl/ppapi_permissions.h"
-#include "url/origin.h"
-
-typedef void* NPIdentifier;
-
-class GURL;
-
-namespace base {
-class FilePath;
-}
-
-namespace ppapi {
-class CallbackTracker;
-}  // namespace ppapi
-
-namespace IPC {
-struct ChannelHandle;
-}
-
-namespace blink {
-class WebPluginContainer;
-}  // namespace blink
-
-namespace content {
-class HostDispatcherWrapper;
-class PepperPluginInstanceImpl;
-class RendererPpapiHostImpl;
-class RenderFrameImpl;
-struct WebPluginInfo;
-
-// Represents one plugin library loaded into one renderer. This library may
-// have multiple instances.
-//
-// Note: to get from a PP_Instance to a PepperPluginInstance*, use the
-// ResourceTracker.
-class CONTENT_EXPORT PluginModule : public base::RefCounted<PluginModule> {
- public:
-  typedef std::set<raw_ptr<PepperPluginInstanceImpl, SetExperimental>>
-      PluginInstanceSet;
-
-  // You must call one of the Init functions after the constructor to create a
-  // module of the type you desire.
-  //
-  // The module lifetime delegate is a non-owning pointer that must outlive
-  // all plugin modules. In practice it will be a global singleton that
-  // tracks which modules are alive.
-  PluginModule(const std::string& name,
-               const std::string& version,
-               const base::FilePath& path,
-               const ppapi::PpapiPermissions& perms);
-
-  PluginModule(const PluginModule&) = delete;
-  PluginModule& operator=(const PluginModule&) = delete;
-
-  // Sets the given class as being associated with this module. It will be
-  // deleted when the module is destroyed. You can only set it once, subsequent
-  // sets will assert.
-  void SetRendererPpapiHost(std::unique_ptr<RendererPpapiHostImpl> host);
-
-  // Initializes this module as an internal plugin with the given entrypoints.
-  // This is used for "plugins" compiled into Chrome. Returns true on success.
-  // False means that the plugin can not be used.
-  bool InitAsInternalPlugin(const ContentPluginInfo::EntryPoints& entry_points);
-
-  // Initializes this module using the given library path as the plugin.
-  // Returns true on success. False means that the plugin can not be used.
-  bool InitAsLibrary(const base::FilePath& path);
-
-  // Initializes this module for the given out of process proxy. This takes
-  // ownership of the given pointer, even in the failure case.
-  void InitAsProxied(HostDispatcherWrapper* host_dispatcher_wrapper);
-
-  // Creates a new module for an external plugin instance that will be using the
-  // IPC proxy. We can't use the existing module, or new instances of the plugin
-  // can't be created.
-  scoped_refptr<PluginModule> CreateModuleForExternalPluginInstance();
-
-  // Initializes the external plugin module for the out of process proxy.
-  // InitAsProxied must be called before calling InitAsProxiedExternalPlugin.
-  // Returns a result code indicating whether the proxy started successfully or
-  // there was an error.
-  PP_ExternalPluginResult InitAsProxiedExternalPlugin(
-      PepperPluginInstanceImpl* instance);
-
-  bool IsProxied() const;
-
-  // Returns the peer process ID if the plugin is running out of process;
-  // returns |base::kNullProcessId| otherwise.
-  base::ProcessId GetPeerProcessId();
-
-  // Returns the plugin child process ID if the plugin is running out of
-  // process. Returns 0 otherwise. This is the ID that the browser process uses
-  // to idetify the child process for the plugin. This isn't directly useful
-  // from our process (the renderer) except in messages to the browser to
-  // disambiguate plugins.
-  int GetPluginChildId();
-
-  static const PPB_Core* GetCore();
-
-  // Returns whether an interface is supported. This method can be called from
-  // the browser process and used for interface matching before plugin
-  // registration.
-  // NOTE: those custom interfaces provided by ContentRendererClient will not be
-  // considered when called on the browser process.
-  static bool SupportsInterface(const char* name);
-
-  RendererPpapiHostImpl* renderer_ppapi_host() {
-    return renderer_ppapi_host_.get();
-  }
-
-  // Returns the module handle. This may be used before Init() is called (the
-  // proxy needs this information to set itself up properly).
-  PP_Module pp_module() const { return pp_module_; }
-
-  const std::string& name() const { return name_; }
-  const std::string& version() const { return version_; }
-  const base::FilePath& path() const { return path_; }
-  const ppapi::PpapiPermissions& permissions() const { return permissions_; }
-
-  PepperPluginInstanceImpl* CreateInstance(RenderFrameImpl* render_frame,
-                                           blink::WebPluginContainer* container,
-                                           const GURL& plugin_url);
-
-  // Returns "some" plugin instance associated with this module. This is not
-  // guaranteed to be any one in particular. This is normally used to execute
-  // callbacks up to the browser layer that are not inherently per-instance,
-  // but the helper lives only on the plugin instance so we need one of them.
-  PepperPluginInstanceImpl* GetSomeInstance() const;
-
-  const PluginInstanceSet& GetAllInstances() const { return instances_; }
-
-  // Calls the plugin's GetInterface and returns the given interface pointer,
-  // which could be NULL.
-  const void* GetPluginInterface(const char* name) const;
-
-  // This module is associated with a set of instances. The PluginInstance
-  // object declares its association with this module in its destructor and
-  // releases us in its destructor.
-  void InstanceCreated(PepperPluginInstanceImpl* instance);
-  void InstanceDeleted(PepperPluginInstanceImpl* instance);
-
-  scoped_refptr<ppapi::CallbackTracker> GetCallbackTracker();
-
-  // Called when running out of process and the plugin crashed. This will
-  // release relevant resources and update all affected instances.
-  void PluginCrashed();
-
-  bool is_in_destructor() const { return is_in_destructor_; }
-  bool is_crashed() const { return is_crashed_; }
-
-  // Reserves the given instance is unique within the plugin, checking for
-  // collisions. See PPB_Proxy_Private for more information.
-  //
-  // The setter will set the callback which is set up when the proxy
-  // initializes. The Reserve function will call the previously set callback if
-  // it exists to validate the ID. If the callback has not been set (such as
-  // for in-process plugins), the Reserve function will assume that the ID is
-  // usable and will return true.
-  void SetReserveInstanceIDCallback(PP_Bool (*reserve)(PP_Module, PP_Instance));
-  bool ReserveInstanceID(PP_Instance instance);
-
-  // Create a new HostDispatcher for proxying, hook it to the PluginModule,
-  // and perform other common initialization.
-  RendererPpapiHostImpl* CreateOutOfProcessModule(
-      RenderFrameImpl* render_frame,
-      const base::FilePath& path,
-      ppapi::PpapiPermissions permissions,
-      const IPC::ChannelHandle& channel_handle,
-      base::ProcessId plugin_pid,
-      int plugin_child_id,
-      bool is_external,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner);
-
-  // In production we purposely leak the HostGlobals object but in unittest
-  // code, this can interfere with subsequent tests. This deletes the
-  // existing HostGlobals. A new one will be constructed when a PluginModule is
-  // instantiated.
-  static void ResetHostGlobalsForTest();
-
-  // Attempts to create a PPAPI plugin for the given filepath. On success, it
-  // will return the newly-created module.
-  //
-  // There are two reasons for failure. The first is that the plugin isn't
-  // a PPAPI plugin. In this case, |*pepper_plugin_was_registered| will be set
-  // to false and the caller may want to fall back on creating an NPAPI plugin.
-  // the second is that the plugin failed to initialize. In this case,
-  // |*pepper_plugin_was_registered| will be set to true and the caller should
-  // not fall back on any other plugin types.
-  static scoped_refptr<PluginModule> Create(
-      RenderFrameImpl* render_frame,
-      const WebPluginInfo& webplugin_info,
-      const std::optional<url::Origin>& origin_lock,
-      bool* pepper_plugin_was_registered,
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner);
-
- private:
-  friend class base::RefCounted<PluginModule>;
-  ~PluginModule();
-  // Calls the InitializeModule entrypoint. The entrypoint must have been
-  // set and the plugin must not be out of process (we don't maintain
-  // entrypoints in that case).
-  bool InitializeModule(const ContentPluginInfo::EntryPoints& entry_points);
-
-  std::unique_ptr<RendererPpapiHostImpl> renderer_ppapi_host_;
-
-  // Tracker for completion callbacks, used mainly to ensure that all callbacks
-  // are properly aborted on module shutdown.
-  scoped_refptr<ppapi::CallbackTracker> callback_tracker_;
-
-  PP_Module pp_module_;
-
-  // True when we're running in the destructor. This allows us to write some
-  // assertions.
-  bool is_in_destructor_;
-
-  // True if the plugin is running out-of-process and has crashed.
-  bool is_crashed_;
-
-  // Manages the out of process proxy interface. The presence of this
-  // pointer indicates that the plugin is running out of process and that the
-  // entry_points_ aren't valid.
-  std::unique_ptr<HostDispatcherWrapper> host_dispatcher_wrapper_;
-
-  // Holds a reference to the base::NativeLibrary handle if this PluginModule
-  // instance wraps functions loaded from a library.  Can be NULL.  If
-  // |library_| is non-NULL, PluginModule will attempt to unload the library
-  // during destruction.
-  base::NativeLibrary library_;
-
-  // Contains pointers to the entry points of the actual plugin implementation.
-  // These will be NULL for out-of-process plugins, which is indicated by the
-  // presence of the host_dispatcher_wrapper_ value.
-  ContentPluginInfo::EntryPoints entry_points_;
-
-  // The name, version, and file location of the module.
-  const std::string name_;
-  const std::string version_;
-  const base::FilePath path_;
-
-  ppapi::PpapiPermissions permissions_;
-
-  // Non-owning pointers to all instances associated with this module. When
-  // there are no more instances, this object should be deleted.
-  PluginInstanceSet instances_;
-
-  PP_Bool (*reserve_instance_id_)(PP_Module, PP_Instance);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PLUGIN_MODULE_H_
diff --git a/content/renderer/pepper/plugin_object.cc b/content/renderer/pepper/plugin_object.cc
deleted file mode 100644
index 001f7f8..0000000
--- a/content/renderer/pepper/plugin_object.cc
+++ /dev/null
@@ -1,314 +0,0 @@
-// Copyright 2011 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/plugin_object.h"
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/check.h"
-#include "base/functional/bind.h"
-#include "base/memory/ref_counted.h"
-#include "base/notreached.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/pepper_try_catch.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "content/renderer/pepper/v8_var_converter.h"
-#include "gin/arguments.h"
-#include "gin/converter.h"
-#include "gin/function_template.h"
-#include "gin/handle.h"
-#include "gin/interceptor.h"
-#include "gin/object_template_builder.h"
-#include "gin/public/gin_embedders.h"
-#include "ppapi/c/dev/ppb_var_deprecated.h"
-#include "ppapi/c/dev/ppp_class_deprecated.h"
-#include "ppapi/c/pp_resource.h"
-#include "ppapi/c/pp_var.h"
-#include "ppapi/shared_impl/ppapi_globals.h"
-#include "ppapi/shared_impl/resource_tracker.h"
-#include "ppapi/shared_impl/var.h"
-#include "ppapi/shared_impl/var_tracker.h"
-
-using ppapi::PpapiGlobals;
-using ppapi::ScopedPPVar;
-using ppapi::ScopedPPVarArray;
-using ppapi::StringVar;
-using ppapi::Var;
-
-namespace content {
-
-namespace {
-
-const char kInvalidValueException[] = "Error: Invalid value";
-
-}  // namespace
-
-// PluginObject ----------------------------------------------------------------
-
-PluginObject::~PluginObject() {
-  if (instance_) {
-    ppp_class_->Deallocate(ppp_class_data_);
-    instance_->RemovePluginObject(this);
-  }
-}
-
-// static
-gin::WrapperInfo PluginObject::kWrapperInfo = {gin::kEmbedderNativeGin};
-
-// static
-PluginObject* PluginObject::FromV8Object(v8::Isolate* isolate,
-                                         v8::Local<v8::Object> v8_object) {
-  PluginObject* plugin_object;
-  if (!v8_object.IsEmpty() &&
-      gin::ConvertFromV8(isolate, v8_object, &plugin_object)) {
-    return plugin_object;
-  }
-  return nullptr;
-}
-
-// static
-PP_Var PluginObject::Create(PepperPluginInstanceImpl* instance,
-                            const PPP_Class_Deprecated* ppp_class,
-                            void* ppp_class_data) {
-  V8VarConverter var_converter(instance->pp_instance(),
-                               V8VarConverter::kAllowObjectVars);
-  PepperTryCatchVar try_catch(instance, &var_converter, nullptr);
-  // If the V8 context is empty, we may be in the process of tearing down the
-  // frame and may not have a valid isolate (in particular due to re-entrancy).
-  // We shouldn't try to call gin::CreateHandle.
-  if (try_catch.GetContext().IsEmpty()) {
-    ppp_class->Deallocate(ppp_class_data);
-    return PP_MakeUndefined();
-  }
-  gin::Handle<PluginObject> object =
-      gin::CreateHandle(instance->GetIsolate(),
-                        new PluginObject(instance, ppp_class, ppp_class_data));
-  ScopedPPVar result = try_catch.FromV8(object.ToV8());
-  DCHECK(!try_catch.HasException());
-  return result.Release();
-}
-
-v8::Local<v8::Value> PluginObject::GetNamedProperty(
-    v8::Isolate* isolate,
-    const std::string& identifier) {
-  if (!instance_) {
-    std::string error = "Property " + identifier + " does not exist.";
-    isolate->ThrowException(
-        v8::Exception::ReferenceError(gin::StringToV8(isolate, error)));
-    return v8::Local<v8::Value>();
-  }
-  ScopedPPVar identifier_var(ScopedPPVar::PassRef(),
-                             StringVar::StringToPPVar(identifier));
-  return GetPropertyOrMethod(instance_->GetIsolate(), identifier_var.get());
-}
-
-bool PluginObject::SetNamedProperty(v8::Isolate* isolate,
-                                    const std::string& identifier,
-                                    v8::Local<v8::Value> value) {
-  if (!instance_) {
-    std::string error = "Property " + identifier + " does not exist.";
-    isolate->ThrowException(
-        v8::Exception::ReferenceError(gin::StringToV8(isolate, error)));
-    return false;
-  }
-  ScopedPPVar identifier_var(ScopedPPVar::PassRef(),
-                             StringVar::StringToPPVar(identifier));
-  V8VarConverter var_converter(instance_->pp_instance(),
-                               V8VarConverter::kAllowObjectVars);
-  PepperTryCatchV8 try_catch(instance_, &var_converter, isolate);
-
-  bool has_property =
-      ppp_class_->HasProperty(ppp_class_data_, identifier_var.get(),
-                              try_catch.exception());
-  if (try_catch.ThrowException())
-    return false;
-
-  if (!has_property)
-    return false;
-
-  ScopedPPVar var = try_catch.FromV8(value);
-  if (try_catch.ThrowException())
-    return false;
-
-  ppp_class_->SetProperty(ppp_class_data_, identifier_var.get(), var.get(),
-                          try_catch.exception());
-
-  // If the plugin threw an exception, then throw a V8 version of it to
-  // JavaScript. Either way, return true, because we successfully dispatched
-  // the call to the plugin.
-  try_catch.ThrowException();
-  return true;
-}
-
-std::vector<std::string> PluginObject::EnumerateNamedProperties(
-    v8::Isolate* isolate) {
-  std::vector<std::string> result;
-  if (!instance_) {
-    std::string error = "Plugin object deleted";
-    isolate->ThrowException(
-        v8::Exception::ReferenceError(gin::StringToV8(isolate, error)));
-    return result;
-  }
-
-  V8VarConverter var_converter(instance_->pp_instance(),
-                               V8VarConverter::kAllowObjectVars);
-  PepperTryCatchV8 try_catch(instance_, &var_converter, isolate);
-
-  PP_Var* name_vars;
-  uint32_t count = 0;
-  ppp_class_->GetAllPropertyNames(ppp_class_data_, &count, &name_vars,
-                                  try_catch.exception());
-  ScopedPPVarArray scoped_name_vars(
-      ScopedPPVarArray::PassPPBMemoryAllocatedArray(), name_vars, count);
-
-  if (try_catch.ThrowException())
-    return result;
-
-  for (uint32_t i = 0; i < count; ++i) {
-    StringVar* string_var = StringVar::FromPPVar(name_vars[i]);
-    if (string_var) {
-      result.push_back(string_var->value());
-    } else {
-      try_catch.ThrowException(kInvalidValueException);
-      result.clear();
-      return result;
-    }
-  }
-
-  return result;
-}
-
-void PluginObject::InstanceDeleted() {
-  instance_ = nullptr;
-}
-
-PluginObject::PluginObject(PepperPluginInstanceImpl* instance,
-                           const PPP_Class_Deprecated* ppp_class,
-                           void* ppp_class_data)
-    : gin::NamedPropertyInterceptor(instance->GetIsolate(), this),
-      instance_(instance),
-      ppp_class_(ppp_class),
-      ppp_class_data_(ppp_class_data),
-      template_cache_(instance->GetIsolate()) {
-  instance_->AddPluginObject(this);
-}
-
-gin::ObjectTemplateBuilder PluginObject::GetObjectTemplateBuilder(
-    v8::Isolate* isolate) {
-  return Wrappable<PluginObject>::GetObjectTemplateBuilder(isolate)
-      .AddNamedPropertyInterceptor();
-}
-
-v8::Local<v8::Value> PluginObject::GetPropertyOrMethod(v8::Isolate* isolate,
-                                                       PP_Var identifier_var) {
-  if (!instance_)
-    return v8::Local<v8::Value>();
-
-  V8VarConverter var_converter(instance_->pp_instance(),
-                               V8VarConverter::kAllowObjectVars);
-  PepperTryCatchV8 try_catch(instance_, &var_converter, isolate);
-  bool has_property =
-      ppp_class_->HasProperty(ppp_class_data_, identifier_var,
-                              try_catch.exception());
-  if (try_catch.ThrowException())
-    return v8::Local<v8::Value>();
-
-  if (has_property) {
-    ScopedPPVar result_var(ScopedPPVar::PassRef(),
-        ppp_class_->GetProperty(ppp_class_data_, identifier_var,
-                                try_catch.exception()));
-    if (try_catch.ThrowException())
-      return v8::Local<v8::Value>();
-
-    v8::Local<v8::Value> result = try_catch.ToV8(result_var.get());
-    if (try_catch.ThrowException())
-      return v8::Local<v8::Value>();
-
-    return result;
-  }
-
-  bool has_method = identifier_var.type == PP_VARTYPE_STRING &&
-                    ppp_class_->HasMethod(ppp_class_data_, identifier_var,
-                                          try_catch.exception());
-  if (try_catch.ThrowException())
-    return v8::Local<v8::Value>();
-
-  if (has_method) {
-    v8::Local<v8::Context> context = isolate->GetCurrentContext();
-    const std::string& identifier =
-        StringVar::FromPPVar(identifier_var)->value();
-    return GetFunctionTemplate(isolate, identifier)
-        ->GetFunction(context)
-        .ToLocalChecked();
-  }
-
-  return v8::Local<v8::Value>();
-}
-
-void PluginObject::Call(const std::string& identifier,
-                        gin::Arguments* args) {
-  if (!instance_)
-    return;
-
-  V8VarConverter var_converter(instance_->pp_instance(),
-                               V8VarConverter::kAllowObjectVars);
-  PepperTryCatchV8 try_catch(instance_, &var_converter, args->isolate());
-  ScopedPPVar identifier_var(ScopedPPVar::PassRef(),
-                             StringVar::StringToPPVar(identifier));
-  ScopedPPVarArray argument_vars(args->Length());
-
-  for (uint32_t i = 0; i < argument_vars.size(); ++i) {
-    v8::Local<v8::Value> arg;
-    if (!args->GetNext(&arg)) {
-      NOTREACHED();
-    }
-
-    argument_vars.Set(i, try_catch.FromV8(arg));
-    if (try_catch.ThrowException())
-      return;
-  }
-
-  // For the OOP plugin case we need to grab a reference on the plugin module
-  // object to ensure that it is not destroyed courtesy an incoming
-  // ExecuteScript call which destroys the plugin module and in turn the
-  // dispatcher.
-  scoped_refptr<PluginModule> ref(instance_->module());
-
-  ScopedPPVar result_var(ScopedPPVar::PassRef(),
-      ppp_class_->Call(ppp_class_data_, identifier_var.get(),
-                       argument_vars.size(), argument_vars.get(),
-                       try_catch.exception()));
-  if (try_catch.ThrowException())
-    return;
-
-  v8::Local<v8::Value> result = try_catch.ToV8(result_var.get());
-  if (try_catch.ThrowException())
-    return;
-
-  args->Return(result);
-}
-
-v8::Local<v8::FunctionTemplate> PluginObject::GetFunctionTemplate(
-    v8::Isolate* isolate,
-    const std::string& name) {
-  v8::Local<v8::FunctionTemplate> function_template = template_cache_.Get(name);
-  if (!function_template.IsEmpty())
-    return function_template;
-  function_template = gin::CreateFunctionTemplate(
-      isolate, base::BindRepeating(&PluginObject::Call,
-                                   weak_factory_.GetWeakPtr(), name));
-  template_cache_.Set(name, function_template);
-  return function_template;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/plugin_object.h b/content/renderer/pepper/plugin_object.h
deleted file mode 100644
index 5325ea5..0000000
--- a/content/renderer/pepper/plugin_object.h
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2010 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PLUGIN_OBJECT_H_
-#define CONTENT_RENDERER_PEPPER_PLUGIN_OBJECT_H_
-
-#include <string>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "gin/interceptor.h"
-#include "gin/wrappable.h"
-#include "ppapi/c/pp_var.h"
-#include "v8/include/v8-util.h"
-
-struct PPP_Class_Deprecated;
-
-namespace gin {
-  class Arguments;
-}  // namespace gin
-
-namespace content {
-
-class PepperPluginInstanceImpl;
-
-// A PluginObject is a JS-accessible object implemented by the plugin.
-//
-// In contrast, a var of type PP_VARTYPE_OBJECT is a reference to a JS object,
-// which might be implemented by the plugin (here) or by the JS engine.
-class PluginObject : public gin::Wrappable<PluginObject>,
-                     public gin::NamedPropertyInterceptor {
- public:
-  static gin::WrapperInfo kWrapperInfo;
-
-  PluginObject(const PluginObject&) = delete;
-  PluginObject& operator=(const PluginObject&) = delete;
-
-  ~PluginObject() override;
-
-  // Returns the PluginObject which is contained in the given v8 object, or NULL
-  // if the object isn't backed by a PluginObject.
-  static PluginObject* FromV8Object(v8::Isolate* isolate,
-                                    v8::Local<v8::Object> v8_object);
-
-  // Allocates a new PluginObject and returns it as a PP_Var with a
-  // refcount of 1.
-  static PP_Var Create(PepperPluginInstanceImpl* instance,
-                       const PPP_Class_Deprecated* ppp_class,
-                       void* ppp_class_data);
-
-  // gin::NamedPropertyInterceptor
-  v8::Local<v8::Value> GetNamedProperty(v8::Isolate* isolate,
-                                        const std::string& property) override;
-  bool SetNamedProperty(v8::Isolate* isolate,
-                        const std::string& property,
-                        v8::Local<v8::Value> value) override;
-  std::vector<std::string> EnumerateNamedProperties(
-      v8::Isolate* isolate) override;
-
-  const PPP_Class_Deprecated* ppp_class() { return ppp_class_; }
-  void* ppp_class_data() { return ppp_class_data_; }
-
-  // Called when the instance is destroyed.
-  void InstanceDeleted();
-
- private:
-  PluginObject(PepperPluginInstanceImpl* instance,
-               const PPP_Class_Deprecated* ppp_class,
-               void* ppp_class_data);
-
-  // gin::Wrappable
-  gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
-      v8::Isolate* isolate) override;
-
-  // Helper method to get named properties.
-  v8::Local<v8::Value> GetPropertyOrMethod(v8::Isolate* isolate,
-                                           PP_Var identifier_var);
-
-  void Call(const std::string& identifier, gin::Arguments* args);
-
-  v8::Local<v8::FunctionTemplate> GetFunctionTemplate(v8::Isolate* isolate,
-                                                      const std::string& name);
-
-  raw_ptr<PepperPluginInstanceImpl> instance_;
-
-  raw_ptr<const PPP_Class_Deprecated> ppp_class_;
-  raw_ptr<void, DanglingUntriaged> ppp_class_data_;
-
-  v8::StdGlobalValueMap<std::string, v8::FunctionTemplate> template_cache_;
-
-  base::WeakPtrFactory<PluginObject> weak_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PLUGIN_OBJECT_H_
diff --git a/content/renderer/pepper/ppapi_preferences_builder.cc b/content/renderer/pepper/ppapi_preferences_builder.cc
deleted file mode 100644
index cbc8397..0000000
--- a/content/renderer/pepper/ppapi_preferences_builder.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/ppapi_preferences_builder.h"
-
-#include "gpu/config/gpu_feature_info.h"
-#include "ppapi/shared_impl/ppapi_preferences.h"
-#include "third_party/blink/public/common/web_preferences/web_preferences.h"
-
-namespace content {
-
-ppapi::Preferences PpapiPreferencesBuilder::Build(
-    const blink::web_pref::WebPreferences& prefs,
-    const gpu::GpuFeatureInfo& gpu_feature_info) {
-  ppapi::Preferences ppapi_prefs;
-  ppapi_prefs.standard_font_family_map = prefs.standard_font_family_map;
-  ppapi_prefs.fixed_font_family_map = prefs.fixed_font_family_map;
-  ppapi_prefs.serif_font_family_map = prefs.serif_font_family_map;
-  ppapi_prefs.sans_serif_font_family_map = prefs.sans_serif_font_family_map;
-  ppapi_prefs.default_font_size = prefs.default_font_size;
-  ppapi_prefs.default_fixed_font_size = prefs.default_fixed_font_size;
-  ppapi_prefs.number_of_cpu_cores = prefs.number_of_cpu_cores;
-  ppapi_prefs.is_3d_supported = false;
-  ppapi_prefs.is_stage3d_supported = false;
-  ppapi_prefs.is_stage3d_baseline_supported = false;
-  ppapi_prefs.is_accelerated_video_decode_enabled =
-      (prefs.accelerated_video_decode_enabled &&
-       (gpu_feature_info
-            .status_values[gpu::GPU_FEATURE_TYPE_ACCELERATED_VIDEO_DECODE] ==
-        gpu::kGpuFeatureStatusEnabled));
-  return ppapi_prefs;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/ppapi_preferences_builder.h b/content/renderer/pepper/ppapi_preferences_builder.h
deleted file mode 100644
index aad508e6..0000000
--- a/content/renderer/pepper/ppapi_preferences_builder.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PPAPI_PREFERENCES_BUILDER_H_
-#define CONTENT_RENDERER_PEPPER_PPAPI_PREFERENCES_BUILDER_H_
-
-namespace gpu {
-struct GpuFeatureInfo;
-}
-namespace ppapi {
-struct Preferences;
-}
-
-namespace blink {
-namespace web_pref {
-struct WebPreferences;
-}
-}  // namespace blink
-
-namespace content {
-
-class PpapiPreferencesBuilder {
- public:
-  static ppapi::Preferences Build(const blink::web_pref::WebPreferences& prefs,
-                                  const gpu::GpuFeatureInfo& gpu_feature_info);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PPAPI_PREFERENCES_BUILDER_H_
diff --git a/content/renderer/pepper/ppb_audio_impl.cc b/content/renderer/pepper/ppb_audio_impl.cc
deleted file mode 100644
index 76cf4449..0000000
--- a/content/renderer/pepper/ppb_audio_impl.cc
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/ppb_audio_impl.h"
-
-#include "base/check.h"
-#include "content/renderer/pepper/pepper_audio_controller.h"
-#include "content/renderer/pepper/pepper_platform_audio_output.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/render_frame_impl.h"
-#include "ppapi/c/pp_completion_callback.h"
-#include "ppapi/c/ppb_audio.h"
-#include "ppapi/c/ppb_audio_config.h"
-#include "ppapi/shared_impl/resource_tracker.h"
-#include "ppapi/thunk/enter.h"
-#include "ppapi/thunk/ppb_audio_config_api.h"
-#include "ppapi/thunk/thunk.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-
-using ppapi::PpapiGlobals;
-using ppapi::thunk::EnterResourceNoLock;
-using ppapi::thunk::PPB_Audio_API;
-using ppapi::thunk::PPB_AudioConfig_API;
-using ppapi::TrackedCallback;
-
-namespace content {
-
-// PPB_Audio_Impl --------------------------------------------------------------
-
-PPB_Audio_Impl::PPB_Audio_Impl(PP_Instance instance)
-    : Resource(ppapi::OBJECT_IS_IMPL, instance), audio_(nullptr) {}
-
-PPB_Audio_Impl::~PPB_Audio_Impl() {
-  PepperPluginInstanceImpl* instance = static_cast<PepperPluginInstanceImpl*>(
-      PepperPluginInstance::Get(pp_instance()));
-  if (instance) {
-    instance->audio_controller().RemoveInstance(this);
-  }
-
-  // Calling ShutDown() makes sure StreamCreated cannot be called anymore and
-  // releases the audio data associated with the pointer. Note however, that
-  // until ShutDown returns, StreamCreated may still be called. This will be
-  // OK since we'll just immediately clean up the data it stored later in this
-  // destructor.
-  if (audio_) {
-    audio_->ShutDown();
-    audio_ = nullptr;
-  }
-}
-
-PPB_Audio_API* PPB_Audio_Impl::AsPPB_Audio_API() { return this; }
-
-PP_Resource PPB_Audio_Impl::GetCurrentConfig() {
-  // AddRef on behalf of caller, while keeping a ref for ourselves.
-  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(config_);
-  return config_;
-}
-
-PP_Bool PPB_Audio_Impl::StartPlayback() {
-  if (!audio_)
-    return PP_FALSE;
-  if (playing())
-    return PP_TRUE;
-
-  // If plugin is in power saver mode, defer audio IPC communication.
-  PepperPluginInstanceImpl* instance = static_cast<PepperPluginInstanceImpl*>(
-      PepperPluginInstance::Get(pp_instance()));
-
-  if (instance)
-    instance->audio_controller().AddInstance(this);
-
-  SetStartPlaybackState();
-  return PP_FromBool(audio_->StartPlayback());
-}
-
-PP_Bool PPB_Audio_Impl::StopPlayback() {
-  if (!audio_)
-    return PP_FALSE;
-
-  PepperPluginInstanceImpl* instance = static_cast<PepperPluginInstanceImpl*>(
-      PepperPluginInstance::Get(pp_instance()));
-  if (instance)
-    instance->audio_controller().RemoveInstance(this);
-
-  if (!playing())
-    return PP_TRUE;
-  if (!audio_->StopPlayback())
-    return PP_FALSE;
-  SetStopPlaybackState();
-
-  return PP_TRUE;
-}
-
-int32_t PPB_Audio_Impl::Open(PP_Resource config,
-                             scoped_refptr<TrackedCallback> create_callback) {
-  // Validate the config and keep a reference to it.
-  EnterResourceNoLock<PPB_AudioConfig_API> enter(config, true);
-  if (enter.failed())
-    return PP_ERROR_FAILED;
-  config_ = config;
-
-  PepperPluginInstanceImpl* instance = static_cast<PepperPluginInstanceImpl*>(
-      PepperPluginInstance::Get(pp_instance()));
-  if (!instance)
-    return PP_ERROR_FAILED;
-
-  // When the stream is created, we'll get called back on StreamCreated().
-  DCHECK(!audio_);
-  audio_ = PepperPlatformAudioOutput::Create(
-      static_cast<int>(enter.object()->GetSampleRate()),
-      static_cast<int>(enter.object()->GetSampleFrameCount()),
-      instance->render_frame()->GetWebFrame()->GetLocalFrameToken(), this);
-  if (!audio_)
-    return PP_ERROR_FAILED;
-
-  // At this point, we are guaranteeing ownership of the completion
-  // callback.  Audio promises to fire the completion callback
-  // once and only once.
-  SetCreateCallback(create_callback);
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-int32_t PPB_Audio_Impl::GetSyncSocket(int* sync_socket) {
-  return GetSyncSocketImpl(sync_socket);
-}
-
-int32_t PPB_Audio_Impl::GetSharedMemory(base::UnsafeSharedMemoryRegion** shm) {
-  return GetSharedMemoryImpl(shm);
-}
-
-void PPB_Audio_Impl::OnSetStreamInfo(
-    base::UnsafeSharedMemoryRegion shared_memory_region,
-    base::SyncSocket::ScopedHandle socket_handle) {
-  EnterResourceNoLock<PPB_AudioConfig_API> enter(config_, true);
-  SetStreamInfo(pp_instance(), std::move(shared_memory_region),
-                std::move(socket_handle), enter.object()->GetSampleRate(),
-                enter.object()->GetSampleFrameCount());
-}
-
-void PPB_Audio_Impl::SetVolume(double volume) {
-  if (audio_)
-    audio_->SetVolume(volume);
-}
-}  // namespace content
diff --git a/content/renderer/pepper/ppb_audio_impl.h b/content/renderer/pepper/ppb_audio_impl.h
deleted file mode 100644
index 830e87b..0000000
--- a/content/renderer/pepper/ppb_audio_impl.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PPB_AUDIO_IMPL_H_
-#define CONTENT_RENDERER_PEPPER_PPB_AUDIO_IMPL_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "base/sync_socket.h"
-#include "content/renderer/pepper/audio_helper.h"
-#include "ppapi/c/pp_completion_callback.h"
-#include "ppapi/c/ppb_audio.h"
-#include "ppapi/c/ppb_audio_config.h"
-#include "ppapi/shared_impl/ppb_audio_config_shared.h"
-#include "ppapi/shared_impl/ppb_audio_shared.h"
-#include "ppapi/shared_impl/resource.h"
-#include "ppapi/shared_impl/scoped_pp_resource.h"
-
-namespace content {
-class PepperPlatformAudioOutput;
-
-// Some of the backend functionality of this class is implemented by the
-// PPB_Audio_Shared so it can be shared with the proxy.
-//
-// TODO(teravest): PPB_Audio is no longer supported in-process. Clean this up
-// to look more like typical HostResource implementations.
-class PPB_Audio_Impl : public ppapi::Resource,
-                       public ppapi::PPB_Audio_Shared,
-                       public AudioHelper {
- public:
-  explicit PPB_Audio_Impl(PP_Instance instance);
-
-  PPB_Audio_Impl(const PPB_Audio_Impl&) = delete;
-  PPB_Audio_Impl& operator=(const PPB_Audio_Impl&) = delete;
-
-  // Resource overrides.
-  ppapi::thunk::PPB_Audio_API* AsPPB_Audio_API() override;
-
-  // PPB_Audio_API implementation.
-  PP_Resource GetCurrentConfig() override;
-  PP_Bool StartPlayback() override;
-  PP_Bool StopPlayback() override;
-  int32_t Open(PP_Resource config_id,
-               scoped_refptr<ppapi::TrackedCallback> create_callback) override;
-  int32_t GetSyncSocket(int* sync_socket) override;
-  int32_t GetSharedMemory(base::UnsafeSharedMemoryRegion** shm) override;
-
-  void SetVolume(double volume);
-
- private:
-  ~PPB_Audio_Impl() override;
-
-  // AudioHelper implementation.
-  void OnSetStreamInfo(base::UnsafeSharedMemoryRegion shared_memory_region,
-                       base::SyncSocket::ScopedHandle socket) override;
-
-  // AudioConfig used for creating this Audio object. We own a ref.
-  ppapi::ScopedPPResource config_;
-
-  // PluginDelegate audio object that we delegate audio IPC through. We don't
-  // own this pointer but are responsible for calling Shutdown on it.
-  raw_ptr<PepperPlatformAudioOutput> audio_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PPB_AUDIO_IMPL_H_
diff --git a/content/renderer/pepper/ppb_buffer_impl.cc b/content/renderer/pepper/ppb_buffer_impl.cc
deleted file mode 100644
index 2ca6364..0000000
--- a/content/renderer/pepper/ppb_buffer_impl.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/ppb_buffer_impl.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "base/check.h"
-#include "content/common/pepper_file_util.h"
-#include "ppapi/c/dev/ppb_buffer_dev.h"
-#include "ppapi/c/pp_bool.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/c/pp_resource.h"
-
-using ppapi::thunk::PPB_Buffer_API;
-
-namespace content {
-
-PPB_Buffer_Impl::PPB_Buffer_Impl(PP_Instance instance)
-    : Resource(ppapi::OBJECT_IS_IMPL, instance), size_(0), map_count_(0) {}
-
-PPB_Buffer_Impl::~PPB_Buffer_Impl() {}
-
-// static
-PP_Resource PPB_Buffer_Impl::Create(PP_Instance instance, uint32_t size) {
-  scoped_refptr<PPB_Buffer_Impl> new_resource(CreateResource(instance, size));
-  if (new_resource.get())
-    return new_resource->GetReference();
-  return 0;
-}
-
-// static
-scoped_refptr<PPB_Buffer_Impl> PPB_Buffer_Impl::CreateResource(
-    PP_Instance instance,
-    uint32_t size) {
-  scoped_refptr<PPB_Buffer_Impl> buffer(new PPB_Buffer_Impl(instance));
-  if (!buffer->Init(size))
-    return scoped_refptr<PPB_Buffer_Impl>();
-  return buffer;
-}
-
-PPB_Buffer_Impl* PPB_Buffer_Impl::AsPPB_Buffer_Impl() { return this; }
-
-PPB_Buffer_API* PPB_Buffer_Impl::AsPPB_Buffer_API() { return this; }
-
-bool PPB_Buffer_Impl::Init(uint32_t size) {
-  if (size == 0)
-    return false;
-  size_ = size;
-  shared_memory_ = base::UnsafeSharedMemoryRegion::Create(size);
-  return shared_memory_.IsValid();
-}
-
-PP_Bool PPB_Buffer_Impl::Describe(uint32_t* size_in_bytes) {
-  *size_in_bytes = size_;
-  return PP_TRUE;
-}
-
-PP_Bool PPB_Buffer_Impl::IsMapped() {
-  return PP_FromBool(shared_mapping_.IsValid());
-}
-
-void* PPB_Buffer_Impl::Map() {
-  DCHECK(size_);
-  DCHECK(shared_memory_.IsValid());
-  if (map_count_++ == 0) {
-    DCHECK(!shared_mapping_.IsValid());
-    shared_mapping_ = shared_memory_.Map();
-  }
-  return shared_mapping_.data();
-}
-
-void PPB_Buffer_Impl::Unmap() {
-  if (--map_count_ == 0)
-    shared_mapping_ = {};
-}
-
-int32_t PPB_Buffer_Impl::GetSharedMemory(base::UnsafeSharedMemoryRegion** shm) {
-  *shm = &shared_memory_;
-  return PP_OK;
-}
-
-BufferAutoMapper::BufferAutoMapper(PPB_Buffer_API* api) : api_(api) {
-  needs_unmap_ = !PP_ToBool(api->IsMapped());
-  data_ = reinterpret_cast<const uint8_t*>(api->Map());
-  api->Describe(&size_);
-}
-
-BufferAutoMapper::~BufferAutoMapper() {
-  if (needs_unmap_)
-    api_->Unmap();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/ppb_buffer_impl.h b/content/renderer/pepper/ppb_buffer_impl.h
deleted file mode 100644
index c3d1baf..0000000
--- a/content/renderer/pepper/ppb_buffer_impl.h
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2011 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PPB_BUFFER_IMPL_H_
-#define CONTENT_RENDERER_PEPPER_PPB_BUFFER_IMPL_H_
-
-#include <stdint.h>
-
-#include "base/compiler_specific.h"
-#include "base/containers/checked_iterators.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/shared_memory_mapping.h"
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "ppapi/shared_impl/resource.h"
-#include "ppapi/thunk/ppb_buffer_api.h"
-
-namespace content {
-
-class PPB_Buffer_Impl : public ppapi::Resource,
-                        public ppapi::thunk::PPB_Buffer_API {
- public:
-  static PP_Resource Create(PP_Instance instance, uint32_t size);
-  static scoped_refptr<PPB_Buffer_Impl> CreateResource(PP_Instance instance,
-                                                       uint32_t size);
-
-  PPB_Buffer_Impl(const PPB_Buffer_Impl&) = delete;
-  PPB_Buffer_Impl& operator=(const PPB_Buffer_Impl&) = delete;
-
-  virtual PPB_Buffer_Impl* AsPPB_Buffer_Impl();
-
-  const base::UnsafeSharedMemoryRegion& shared_memory() const {
-    return shared_memory_;
-  }
-  uint32_t size() const { return size_; }
-
-  // Resource overrides.
-  ppapi::thunk::PPB_Buffer_API* AsPPB_Buffer_API() override;
-
-  // PPB_Buffer_API implementation.
-  PP_Bool Describe(uint32_t* size_in_bytes) override;
-  PP_Bool IsMapped() override;
-  void* Map() override;
-  void Unmap() override;
-
-  // Trusted.
-  int32_t GetSharedMemory(base::UnsafeSharedMemoryRegion** shm) override;
-
- private:
-  ~PPB_Buffer_Impl() override;
-
-  explicit PPB_Buffer_Impl(PP_Instance instance);
-  bool Init(uint32_t size);
-
-  base::UnsafeSharedMemoryRegion shared_memory_;
-  base::WritableSharedMemoryMapping shared_mapping_;
-  uint32_t size_;
-  int map_count_;
-};
-
-// Ensures that the given buffer is mapped, and returns it to its previous
-// mapped state in the destructor.
-class BufferAutoMapper {
- public:
-  using iterator = base::CheckedContiguousIterator<const uint8_t>;
-
-  explicit BufferAutoMapper(ppapi::thunk::PPB_Buffer_API* api);
-
-  BufferAutoMapper(const BufferAutoMapper&) = delete;
-  BufferAutoMapper& operator=(const BufferAutoMapper&) = delete;
-
-  ~BufferAutoMapper();
-
-  // Will be NULL on failure to map.
-  const uint8_t* data() const { return data_; }
-  size_t size() const { return size_; }
-
-  // Iterate buffer as bytes up to the end of its logical size.
-  iterator begin() const {
-    // SAFETY: The implementer of `PPB_Buffer_API` is responsible for
-    // guaranteeing that when `Map()` returns a non-null pointer, it points to
-    // at least the number of bytes returned in `Describe()`'s outparam. This
-    // memory must also remain valid for the lifetime of this mapper.
-    return UNSAFE_BUFFERS(iterator(data(), data() + size()));
-  }
-  iterator end() const {
-    // SAFETY: As in `begin()` above.
-    return UNSAFE_BUFFERS(iterator(data(), data() + size(), data() + size()));
-  }
-
- private:
-  raw_ptr<ppapi::thunk::PPB_Buffer_API> api_;
-
-  bool needs_unmap_;
-
-  raw_ptr<const uint8_t> data_;
-  uint32_t size_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PPB_BUFFER_IMPL_H_
diff --git a/content/renderer/pepper/ppb_graphics_3d_impl.cc b/content/renderer/pepper/ppb_graphics_3d_impl.cc
deleted file mode 100644
index 5c706a24..0000000
--- a/content/renderer/pepper/ppb_graphics_3d_impl.cc
+++ /dev/null
@@ -1,577 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/ppb_graphics_3d_impl.h"
-
-#include "base/command_line.h"
-#include "base/feature_list.h"
-#include "base/functional/bind.h"
-#include "base/location.h"
-#include "base/memory/raw_ptr.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/notimplemented.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/task/single_thread_task_runner.h"
-#include "build/build_config.h"
-#include "components/viz/common/resources/shared_image_format.h"
-#include "content/public/common/content_features.h"
-#include "content/public/common/content_switches.h"
-#include "content/public/common/gpu_stream_constants.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "content/renderer/render_thread_impl.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/client_shared_image.h"
-#include "gpu/command_buffer/common/context_creation_attribs.h"
-#include "gpu/command_buffer/common/shared_image_usage.h"
-#include "gpu/ipc/client/client_shared_image_interface.h"
-#include "gpu/ipc/client/command_buffer_proxy_impl.h"
-#include "gpu/ipc/client/gpu_channel_host.h"
-#include "ppapi/c/ppp_graphics_3d.h"
-#include "ppapi/thunk/enter.h"
-#include "third_party/blink/public/common/web_preferences/web_preferences.h"
-#include "third_party/blink/public/platform/web_string.h"
-#include "third_party/blink/public/web/web_console_message.h"
-#include "third_party/blink/public/web/web_document.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-#include "third_party/blink/public/web/web_plugin_container.h"
-#include "third_party/khronos/GLES2/gl2.h"
-#include "ui/gfx/switches.h"
-
-using ppapi::thunk::EnterResourceNoLock;
-using ppapi::thunk::PPB_Graphics3D_API;
-using blink::WebConsoleMessage;
-using blink::WebLocalFrame;
-using blink::WebPluginContainer;
-using blink::WebString;
-
-namespace content {
-
-// This class encapsulates ColorBuffer for the plugin. It wraps corresponding
-// SharedImage that we draw to and that we send to display compositor.
-// Can be in one of the 3 states:
-// Detached -- ColorBuffer is initialized and ready to use.
-// Attached -- ColorBuffer is currently attached to the default frame buffer and
-// we're drawing to it. Should be at most one in this state.
-// InCompositor -- SharedImage from the ColorBuffer was sent to display
-// compositor. It's considered busy until display compositor will return the
-// resources.
-
-// ColorBuffers created detached and transitioned to other states in a Detached
-// => Attached => Detached => InCompositor => Detached sequence.
-class PPB_Graphics3D_Impl::ColorBuffer {
- public:
-  ColorBuffer(gpu::SharedImageInterface* sii,
-              gfx::Size size,
-              bool has_alpha,
-              bool is_single_buffered)
-      : sii_(sii), size_(size), is_single_buffered_(is_single_buffered) {
-    gpu::SharedImageUsageSet usage = gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
-                                     gpu::SHARED_IMAGE_USAGE_GLES2_WRITE;
-
-    if (is_single_buffered_)
-      usage |= gpu::SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE;
-
-    // It's possible to create Graphics3D with zero size. To avoid creating
-    // shared image with zero size which will fail, we create 1x1. This matches
-    // legacy behaviour where command decoders would use 1x1 for any empty
-    // `offscreen_framebuffer_size`. Note, that to avoid any size mismatches, we
-    // keep `size_` intact.
-    auto shared_image_size = size.IsEmpty() ? gfx::Size(1, 1) : size;
-
-    // Note, that we intentionally don't handle SCANOUT here. While
-    // kPepper3DImageChromium is enabled on some CrOS devices, SkiaRenderer
-    // don't support overlays for legacy mailboxes. To avoid any problems with
-    // overlays, we don't introduce them here.
-    client_shared_image_ = sii_->CreateSharedImage(
-        {has_alpha ? viz::SinglePlaneFormat::kRGBA_8888
-                   : viz::SinglePlaneFormat::kRGBX_8888,
-         shared_image_size, gfx::ColorSpace::CreateSRGB(),
-         kTopLeft_GrSurfaceOrigin, kUnpremul_SkAlphaType, usage,
-         "PPBGraphics3DImpl"},
-        gpu::SurfaceHandle());
-    CHECK(client_shared_image_);
-
-    sync_token_ = sii_->GenVerifiedSyncToken();
-  }
-
-  ~ColorBuffer() {
-    DCHECK_NE(state, State::kAttached);
-    sii_->DestroySharedImage(destruction_sync_token_,
-                             std::move(client_shared_image_));
-  }
-
-  void Attach(gpu::CommandBufferProxyImpl* command_buffer,
-              bool samples_count,
-              bool preserve,
-              bool needs_depth,
-              bool needs_stencil) {
-    DCHECK_EQ(state, State::kDetached);
-    command_buffer->SetDefaultFramebufferSharedImage(
-        client_shared_image_->mailbox(), sync_token_, samples_count, preserve,
-        needs_depth, needs_stencil);
-    state = State::kAttached;
-    sync_token_.Clear();
-  }
-
-  void Detach(gpu::CommandBufferProxyImpl* command_buffer) {
-    DCHECK_EQ(state, State::kAttached);
-    command_buffer->SetDefaultFramebufferSharedImage(
-        gpu::Mailbox(), gpu::SyncToken(), 0, false, false, false);
-    state = State::kDetached;
-  }
-
-  // Note that the pointer returned from Export() is never null.
-  const scoped_refptr<gpu::ClientSharedImage>& Export() {
-    DCHECK_EQ(state, State::kDetached);
-
-    // In single buffered mode we use same image regardless if it's in
-    // compositor or not, so don't track here.
-    if (!is_single_buffered_)
-      state = State::kInCompositor;
-    return client_shared_image_;
-  }
-
-  void UpdateDestructionSyncToken(const gpu::SyncToken& token) {
-    destruction_sync_token_ = token;
-  }
-
-  void Recycle(const gpu::SyncToken& sync_token) {
-    DCHECK_EQ(state, State::kInCompositor);
-    state = State::kDetached;
-    // Update both `sync_token_` which we supposed to wait on before reattaching
-    // this color buffer and `destruction_sync_token_` which wait on before
-    // destroying the underlying shared image, so we don't destroy it while
-    // display compositor still uses it.
-    sync_token_ = sync_token;
-    destruction_sync_token_ = sync_token;
-  }
-
-  const gfx::Size& size() { return size_; }
-
-  bool IsAttached() { return state == State::kAttached; }
-
- private:
-  enum class State { kDetached, kAttached, kInCompositor };
-
-  State state = State::kDetached;
-  const raw_ptr<gpu::SharedImageInterface> sii_;
-  const gfx::Size size_;
-  scoped_refptr<gpu::ClientSharedImage> client_shared_image_;
-  // SyncToken to wait on before re-using this color buffer.
-  gpu::SyncToken sync_token_;
-  // SyncToken to wait before destroying the underlying shared image.
-  gpu::SyncToken destruction_sync_token_;
-  const bool is_single_buffered_;
-};
-
-PPB_Graphics3D_Impl::PPB_Graphics3D_Impl(PP_Instance instance)
-    : PPB_Graphics3D_Shared(instance),
-      bound_to_instance_(false),
-      commit_pending_(false) {}
-
-PPB_Graphics3D_Impl::~PPB_Graphics3D_Impl() {
-  if (current_color_buffer_ && current_color_buffer_->IsAttached()) {
-    current_color_buffer_->Detach(command_buffer_.get());
-  }
-
-  current_color_buffer_.reset();
-  available_color_buffers_.clear();
-  inflight_color_buffers_.clear();
-
-  // Unset the client before the command_buffer_ is destroyed, similar to how
-  // WeakPtrFactory invalidates before it.
-  if (command_buffer_)
-    command_buffer_->SetGpuControlClient(nullptr);
-}
-
-// static
-PP_Resource PPB_Graphics3D_Impl::CreateRaw(
-    PP_Instance instance,
-    PP_Resource share_context,
-    const ppapi::Graphics3DContextAttribs& context_attribs,
-    gpu::Capabilities* capabilities,
-    gpu::GLCapabilities* gl_capabilities,
-    const base::UnsafeSharedMemoryRegion** shared_state_region,
-    gpu::CommandBufferId* command_buffer_id) {
-  PPB_Graphics3D_API* share_api = nullptr;
-  if (share_context) {
-    EnterResourceNoLock<PPB_Graphics3D_API> enter(share_context, true);
-    if (enter.failed())
-      return 0;
-    share_api = enter.object();
-  }
-  scoped_refptr<PPB_Graphics3D_Impl> graphics_3d(
-      new PPB_Graphics3D_Impl(instance));
-  if (!graphics_3d->InitRaw(share_api, context_attribs, capabilities,
-                            gl_capabilities, shared_state_region,
-                            command_buffer_id)) {
-    return 0;
-  }
-  return graphics_3d->GetReference();
-}
-
-PP_Bool PPB_Graphics3D_Impl::SetGetBuffer(int32_t transfer_buffer_id) {
-  GetCommandBuffer()->SetGetBuffer(transfer_buffer_id);
-  return PP_TRUE;
-}
-
-scoped_refptr<gpu::Buffer> PPB_Graphics3D_Impl::CreateTransferBuffer(
-    uint32_t size,
-    int32_t* id) {
-  return GetCommandBuffer()->CreateTransferBuffer(size, id);
-}
-
-PP_Bool PPB_Graphics3D_Impl::DestroyTransferBuffer(int32_t id) {
-  GetCommandBuffer()->DestroyTransferBuffer(id);
-  return PP_TRUE;
-}
-
-PP_Bool PPB_Graphics3D_Impl::Flush(int32_t put_offset, uint64_t release_count) {
-  command_buffer_->UpdateLastFenceSyncRelease(release_count);
-  GetCommandBuffer()->Flush(put_offset);
-  return PP_TRUE;
-}
-
-gpu::CommandBuffer::State PPB_Graphics3D_Impl::WaitForTokenInRange(
-    int32_t start,
-    int32_t end) {
-  return GetCommandBuffer()->WaitForTokenInRange(start, end);
-}
-
-gpu::CommandBuffer::State PPB_Graphics3D_Impl::WaitForGetOffsetInRange(
-    uint32_t set_get_buffer_count,
-    int32_t start,
-    int32_t end) {
-  return GetCommandBuffer()->WaitForGetOffsetInRange(set_get_buffer_count,
-                                                     start, end);
-}
-
-void PPB_Graphics3D_Impl::EnsureWorkVisible() {
-  command_buffer_->EnsureWorkVisible();
-}
-
-void PPB_Graphics3D_Impl::ReturnFrontBuffer(const gpu::Mailbox& mailbox,
-                                            const gpu::SyncToken& sync_token,
-                                            bool is_lost) {
-  if (is_single_buffered_) {
-    // We don't verify that mailbox is the same we have in the
-    // `current_color_buffer_` because it could have changed do to resize.
-  } else {
-    auto it = inflight_color_buffers_.find(mailbox);
-    CHECK(it != inflight_color_buffers_.end());
-    RecycleColorBuffer(std::move(it->second), sync_token, is_lost);
-    inflight_color_buffers_.erase(it);
-  }
-}
-
-bool PPB_Graphics3D_Impl::BindToInstance(bool bind) {
-  bound_to_instance_ = bind;
-  return true;
-}
-
-bool PPB_Graphics3D_Impl::IsOpaque() { return !has_alpha_; }
-
-void PPB_Graphics3D_Impl::ViewInitiatedPaint() {
-  commit_pending_ = false;
-
-  if (HasPendingSwap())
-    SwapBuffersACK(PP_OK);
-}
-
-gpu::CommandBufferProxyImpl* PPB_Graphics3D_Impl::GetCommandBufferProxy() {
-  DCHECK(command_buffer_);
-  return command_buffer_.get();
-}
-
-gpu::CommandBuffer* PPB_Graphics3D_Impl::GetCommandBuffer() {
-  return command_buffer_.get();
-}
-
-gpu::GpuControl* PPB_Graphics3D_Impl::GetGpuControl() {
-  return command_buffer_.get();
-}
-
-bool PPB_Graphics3D_Impl::InitRaw(
-    PPB_Graphics3D_API* share_context,
-    const ppapi::Graphics3DContextAttribs& requested_attribs,
-    gpu::Capabilities* capabilities,
-    gpu::GLCapabilities* gl_capabilities,
-    const base::UnsafeSharedMemoryRegion** shared_state_region,
-    gpu::CommandBufferId* command_buffer_id) {
-  PepperPluginInstanceImpl* plugin_instance =
-      HostGlobals::Get()->GetInstance(pp_instance());
-  if (!plugin_instance)
-    return false;
-
-  RenderFrame* render_frame = plugin_instance->GetRenderFrame();
-  if (!render_frame)
-    return false;
-
-  const blink::web_pref::WebPreferences& prefs =
-      render_frame->GetBlinkPreferences();
-
-  // 3D access might be disabled.
-  if (!prefs.pepper_3d_enabled)
-    return false;
-
-  RenderThreadImpl* render_thread = RenderThreadImpl::current();
-  if (!render_thread)
-    return false;
-  if (render_thread->IsGpuCompositingDisabled())
-    return false;
-
-  scoped_refptr<gpu::GpuChannelHost> channel =
-      render_thread->EstablishGpuChannelSync();
-  if (!channel)
-    return false;
-  // 3D access might be blocklisted.
-  if (channel->gpu_feature_info()
-          .status_values[gpu::GPU_FEATURE_TYPE_ACCELERATED_WEBGL] ==
-      gpu::kGpuFeatureStatusBlocklisted) {
-    return false;
-  }
-
-  has_alpha_ = requested_attribs.alpha_size > 0;
-
-  is_single_buffered_ = requested_attribs.single_buffer;
-  needs_depth_ = requested_attribs.depth_size > 0;
-  needs_stencil_ = requested_attribs.stencil_size > 0;
-  swapchain_size_ = requested_attribs.offscreen_framebuffer_size;
-
-  // If we're in single buffered mode, we don't need additional buffer to
-  // preserve contents.
-  preserve_ = requested_attribs.buffer_preserved && !is_single_buffered_;
-
-  if (requested_attribs.samples > 0 && requested_attribs.sample_buffers > 0 &&
-      !requested_attribs.single_buffer)
-    samples_count_ = requested_attribs.samples;
-
-  gpu::ContextCreationAttribs attrib_helper;
-  attrib_helper.context_type = gpu::CONTEXT_TYPE_OPENGLES2;
-
-  gpu::CommandBufferProxyImpl* share_buffer = nullptr;
-  if (share_context) {
-    PPB_Graphics3D_Impl* share_graphics =
-        static_cast<PPB_Graphics3D_Impl*>(share_context);
-    share_buffer = share_graphics->GetCommandBufferProxy();
-  }
-
-  shared_image_interface_ = channel->CreateClientSharedImageInterface();
-
-  command_buffer_ = std::make_unique<gpu::CommandBufferProxyImpl>(
-      std::move(channel), kGpuStreamIdDefault,
-      base::SingleThreadTaskRunner::GetCurrentDefault());
-  auto result = command_buffer_->Initialize(
-      share_buffer, kGpuStreamPriorityDefault, attrib_helper, GURL(), "Pepper");
-  if (result != gpu::ContextResult::kSuccess)
-    return false;
-
-  command_buffer_->SetGpuControlClient(this);
-
-  if (shared_state_region)
-    *shared_state_region = &command_buffer_->GetSharedStateRegion();
-  if (capabilities) {
-    *capabilities = command_buffer_->GetCapabilities();
-  }
-  if (gl_capabilities) {
-    *gl_capabilities = command_buffer_->GetGLCapabilities();
-  }
-  if (command_buffer_id)
-    *command_buffer_id = command_buffer_->GetCommandBufferID();
-
-  current_color_buffer_ = GetOrCreateColorBuffer();
-  current_color_buffer_->Attach(command_buffer_.get(), samples_count_,
-                                preserve_, needs_depth_, needs_stencil_);
-
-  return true;
-}
-
-void PPB_Graphics3D_Impl::OnGpuControlErrorMessage(const char* message,
-                                                   int32_t id) {
-  if (!bound_to_instance_)
-    return;
-  WebPluginContainer* container =
-      HostGlobals::Get()->GetInstance(pp_instance())->container();
-  if (!container)
-    return;
-  WebLocalFrame* frame = container->GetDocument().GetFrame();
-  if (!frame)
-    return;
-  WebConsoleMessage console_message = WebConsoleMessage(
-      blink::mojom::ConsoleMessageLevel::kError, WebString::FromUTF8(message));
-  frame->AddMessageToConsole(console_message);
-}
-
-void PPB_Graphics3D_Impl::OnGpuControlLostContext() {
-#if DCHECK_IS_ON()
-  // This should never occur more than once.
-  DCHECK(!lost_context_);
-  lost_context_ = true;
-#endif
-
-  // Don't need to check for null from GetPluginInstance since when we're
-  // bound, we know our instance is valid.
-  if (bound_to_instance_) {
-    HostGlobals::Get()->GetInstance(pp_instance())->BindGraphics(pp_instance(),
-                                                                 0);
-  }
-
-  // Send context lost to plugin. This may have been caused by a PPAPI call, so
-  // avoid re-entering.
-  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-      FROM_HERE, base::BindOnce(&PPB_Graphics3D_Impl::SendContextLost,
-                                weak_ptr_factory_.GetWeakPtr()));
-}
-
-void PPB_Graphics3D_Impl::OnGpuControlLostContextMaybeReentrant() {
-  // No internal state to update on lost context.
-}
-
-void PPB_Graphics3D_Impl::OnGpuControlReturnData(
-    base::span<const uint8_t> data) {
-  NOTIMPLEMENTED();
-}
-
-void PPB_Graphics3D_Impl::OnSwapBuffers() {
-  if (HasPendingSwap()) {
-    // If we're off-screen, no need to trigger and wait for compositing.
-    // Just send the swap-buffers ACK to the plugin immediately.
-    commit_pending_ = false;
-    SwapBuffersACK(PP_OK);
-  }
-}
-
-void PPB_Graphics3D_Impl::SendContextLost() {
-  // By the time we run this, the instance may have been deleted, or in the
-  // process of being deleted. Even in the latter case, we don't want to send a
-  // callback after DidDestroy.
-  PepperPluginInstanceImpl* instance =
-      HostGlobals::Get()->GetInstance(pp_instance());
-  if (!instance || !instance->container())
-    return;
-
-  // This PPB_Graphics3D_Impl could be deleted during the call to
-  // GetPluginInterface (which sends a sync message in some cases). We still
-  // send the Graphics3DContextLost to the plugin; the instance may care about
-  // that event even though this context has been destroyed.
-  PP_Instance this_pp_instance = pp_instance();
-  const PPP_Graphics3D* ppp_graphics_3d = static_cast<const PPP_Graphics3D*>(
-      instance->module()->GetPluginInterface(PPP_GRAPHICS_3D_INTERFACE));
-  // We have to check *again* that the instance exists, because it could have
-  // been deleted during GetPluginInterface(). Even the PluginModule could be
-  // deleted, but in that case, the instance should also be gone, so the
-  // GetInstance check covers both cases.
-  if (ppp_graphics_3d && HostGlobals::Get()->GetInstance(this_pp_instance))
-    ppp_graphics_3d->Graphics3DContextLost(this_pp_instance);
-}
-
-int32_t PPB_Graphics3D_Impl::DoSwapBuffers(const gpu::SyncToken& sync_token,
-                                           const gfx::Size& size) {
-  DCHECK(command_buffer_);
-  DCHECK(current_color_buffer_);
-  DCHECK_EQ(size, current_color_buffer_->size());
-
-  if (current_color_buffer_->IsAttached()) {
-    DLOG(ERROR)
-        << "ResolveAndDetachFramebuffer should be called before DoSwapBuffers";
-    return PP_ERROR_FAILED;
-  }
-
-  current_color_buffer_->UpdateDestructionSyncToken(sync_token);
-
-  if (bound_to_instance_) {
-    // If we are bound to the instance, we need to ask the compositor
-    // to commit our backing texture so that the graphics appears on the page.
-    // When the backing texture will be committed we get notified via
-    // ViewFlushedPaint().
-    //
-    // Don't need to check for NULL from GetPluginInstance since when we're
-    // bound, we know our instance is valid.
-
-    // Note, that we intentionally don't handle SCANOUT here. While
-    // kPepper3DImageChromium is enabled on some CrOS devices, SkiaRenderer
-    // don't support overlays for legacy mailboxes. To avoid any problems with
-    // overlays, we don't introduce them here.
-    constexpr bool is_overlay_candidate = false;
-    constexpr uint32_t target = GL_TEXTURE_2D;
-    const auto& shared_image = current_color_buffer_->Export();
-    viz::TransferableResource resource = viz::TransferableResource::MakeGpu(
-        shared_image, target, sync_token, current_color_buffer_->size(),
-        viz::SinglePlaneFormat::kRGBA_8888, is_overlay_candidate,
-        viz::TransferableResource::ResourceSource::kPPBGraphics3D);
-    HostGlobals::Get()
-        ->GetInstance(pp_instance())
-        ->CommitTransferableResource(resource);
-    commit_pending_ = true;
-
-    if (!is_single_buffered_) {
-      inflight_color_buffers_.emplace(shared_image->mailbox(),
-                                      std::move(current_color_buffer_));
-      current_color_buffer_ = GetOrCreateColorBuffer();
-    }
-  } else {
-    // Wait for the command to complete on the GPU to allow for throttling.
-    command_buffer_->SignalSyncToken(
-        sync_token, base::BindOnce(&PPB_Graphics3D_Impl::OnSwapBuffers,
-                                   weak_ptr_factory_.GetWeakPtr()));
-  }
-
-  current_color_buffer_->Attach(command_buffer_.get(), samples_count_,
-                                preserve_, needs_depth_, needs_stencil_);
-
-  return PP_OK_COMPLETIONPENDING;
-}
-
-void PPB_Graphics3D_Impl::ResolveAndDetachFramebuffer() {
-  DCHECK(current_color_buffer_);
-  current_color_buffer_->Detach(command_buffer_.get());
-}
-
-void PPB_Graphics3D_Impl::DoResize(gfx::Size size) {
-  if (swapchain_size_ == size)
-    return;
-  swapchain_size_ = size;
-
-  // Drop all available buffers as they are wrong size now;
-  available_color_buffers_.clear();
-
-  DCHECK(current_color_buffer_);
-  current_color_buffer_->Detach(command_buffer_.get());
-  current_color_buffer_ = GetOrCreateColorBuffer();
-  current_color_buffer_->Attach(command_buffer_.get(), samples_count_,
-                                preserve_, needs_depth_, needs_stencil_);
-}
-
-std::unique_ptr<PPB_Graphics3D_Impl::ColorBuffer>
-PPB_Graphics3D_Impl::GetOrCreateColorBuffer() {
-  if (!available_color_buffers_.empty()) {
-    auto result = std::move(*available_color_buffers_.begin());
-    available_color_buffers_.erase(available_color_buffers_.begin());
-    return result;
-  }
-
-  return std::make_unique<ColorBuffer>(shared_image_interface_.get(),
-                                       swapchain_size_, has_alpha_,
-                                       is_single_buffered_);
-}
-
-void PPB_Graphics3D_Impl::RecycleColorBuffer(
-    std::unique_ptr<ColorBuffer> buffer,
-    const gpu::SyncToken& sync_token,
-    bool is_lost) {
-  buffer->Recycle(sync_token);
-  if (is_lost || buffer->size() != swapchain_size_)
-    return;
-
-  available_color_buffers_.push_back(std::move(buffer));
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/ppb_graphics_3d_impl.h b/content/renderer/pepper/ppb_graphics_3d_impl.h
deleted file mode 100644
index 4da2f8f..0000000
--- a/content/renderer/pepper/ppb_graphics_3d_impl.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PPB_GRAPHICS_3D_IMPL_H_
-#define CONTENT_RENDERER_PEPPER_PPB_GRAPHICS_3D_IMPL_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/containers/flat_map.h"
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "base/memory/weak_ptr.h"
-#include "gpu/command_buffer/client/gpu_control_client.h"
-#include "gpu/command_buffer/common/command_buffer_id.h"
-#include "gpu/command_buffer/common/mailbox.h"
-#include "gpu/command_buffer/common/sync_token.h"
-#include "ppapi/shared_impl/ppb_graphics_3d_shared.h"
-#include "ppapi/shared_impl/resource.h"
-
-namespace gpu {
-struct Capabilities;
-struct GLCapabilities;
-class CommandBufferProxyImpl;
-class ClientSharedImageInterface;
-}
-
-namespace content {
-
-class PPB_Graphics3D_Impl : public ppapi::PPB_Graphics3D_Shared,
-                            public gpu::GpuControlClient {
- public:
-  static PP_Resource CreateRaw(
-      PP_Instance instance,
-      PP_Resource share_context,
-      const ppapi::Graphics3DContextAttribs& context_attribs,
-      gpu::Capabilities* capabilities,
-      gpu::GLCapabilities* gl_capabilities,
-      const base::UnsafeSharedMemoryRegion** shared_state_region,
-      gpu::CommandBufferId* command_buffer_id);
-
-  PPB_Graphics3D_Impl(const PPB_Graphics3D_Impl&) = delete;
-  PPB_Graphics3D_Impl& operator=(const PPB_Graphics3D_Impl&) = delete;
-
-  // PPB_Graphics3D_API trusted implementation.
-  PP_Bool SetGetBuffer(int32_t transfer_buffer_id) override;
-  scoped_refptr<gpu::Buffer> CreateTransferBuffer(uint32_t size,
-                                                  int32_t* id) override;
-  PP_Bool DestroyTransferBuffer(int32_t id) override;
-  PP_Bool Flush(int32_t put_offset, uint64_t release_count) override;
-  gpu::CommandBuffer::State WaitForTokenInRange(int32_t start,
-                                                int32_t end) override;
-  gpu::CommandBuffer::State WaitForGetOffsetInRange(
-      uint32_t set_get_buffer_count,
-      int32_t start,
-      int32_t end) override;
-  void EnsureWorkVisible() override;
-  void ReturnFrontBuffer(const gpu::Mailbox& mailbox,
-                         const gpu::SyncToken& sync_token,
-                         bool is_lost);
-  void ResolveAndDetachFramebuffer() override;
-  void DoResize(gfx::Size size) override;
-
-  // Binds/unbinds the graphics of this context with the associated instance.
-  // Returns true if binding/unbinding is successful.
-  bool BindToInstance(bool bind);
-
-  // Returns true if the backing texture is always opaque.
-  bool IsOpaque();
-
-  // Notifications about the view's progress painting.  See PluginInstance.
-  // These messages are used to send Flush callbacks to the plugin.
-  void ViewInitiatedPaint();
-
-  gpu::CommandBufferProxyImpl* GetCommandBufferProxy();
-
- protected:
-  ~PPB_Graphics3D_Impl() override;
-  // ppapi::PPB_Graphics3D_Shared overrides.
-  gpu::CommandBuffer* GetCommandBuffer() override;
-  gpu::GpuControl* GetGpuControl() override;
-  int32_t DoSwapBuffers(const gpu::SyncToken& sync_token,
-                        const gfx::Size& size) override;
-
- private:
-  class ColorBuffer;
-
-  explicit PPB_Graphics3D_Impl(PP_Instance instance);
-
-  bool InitRaw(PPB_Graphics3D_API* share_context,
-               const ppapi::Graphics3DContextAttribs& requested_attribs,
-               gpu::Capabilities* capabilities,
-               gpu::GLCapabilities* gl_capabilities,
-               const base::UnsafeSharedMemoryRegion** shared_state_region,
-               gpu::CommandBufferId* command_buffer_id);
-
-  // GpuControlClient implementation.
-  void OnGpuControlLostContext() final;
-  void OnGpuControlLostContextMaybeReentrant() final;
-  void OnGpuControlErrorMessage(const char* msg, int id) final;
-  void OnGpuControlReturnData(base::span<const uint8_t> data) final;
-
-  // Other notifications from the GPU process.
-  void OnSwapBuffers();
-  // Notifications sent to plugin.
-  void SendContextLost();
-
-  // This is called by NaCL process when it wants to present next frame
-  // (SwapBuffers call from the plugin). Note that
-  // `ResolveAndDetachFramebuffer()` must be called before and `sync_token` must
-  // be submitted after that call.
-  int32_t DoPresent(const gpu::SyncToken& sync_token, const gfx::Size& size);
-
-  // Returns ColorBuffer for the next frame. It will try to re-use one of
-  // `available_color_buffers_` first and create new one if there is none.
-  std::unique_ptr<ColorBuffer> GetOrCreateColorBuffer();
-
-  // This returns ColorBuffer from the display compositor. If it's not lost and
-  // have the same size, it will be put in `available_color_buffers_` or
-  // Destroyed otherwise.
-  void RecycleColorBuffer(std::unique_ptr<ColorBuffer> buffer,
-                          const gpu::SyncToken& sync_token,
-                          bool is_lost);
-
-  gfx::Size swapchain_size_;
-  std::vector<std::unique_ptr<ColorBuffer>> available_color_buffers_;
-  std::unique_ptr<ColorBuffer> current_color_buffer_;
-  base::flat_map<gpu::Mailbox, std::unique_ptr<ColorBuffer>>
-      inflight_color_buffers_;
-
-  // True if context is bound to instance.
-  bool bound_to_instance_;
-  // True when waiting for compositor to commit our backing texture.
-  bool commit_pending_;
-
-#if DCHECK_IS_ON()
-  bool lost_context_ = false;
-#endif
-
-  bool has_alpha_ = false;
-  bool is_single_buffered_ = false;
-  int samples_count_ = 0;
-  bool preserve_ = false;
-  bool needs_depth_ = false;
-  bool needs_stencil_ = false;
-
-  std::unique_ptr<gpu::CommandBufferProxyImpl> command_buffer_;
-  scoped_refptr<gpu::ClientSharedImageInterface> shared_image_interface_;
-
-  base::WeakPtrFactory<PPB_Graphics3D_Impl> weak_ptr_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PPB_GRAPHICS_3D_IMPL_H_
diff --git a/content/renderer/pepper/ppb_image_data_impl.cc b/content/renderer/pepper/ppb_image_data_impl.cc
deleted file mode 100644
index dc63edc..0000000
--- a/content/renderer/pepper/ppb_image_data_impl.cc
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/ppb_image_data_impl.h"
-
-#include <algorithm>
-#include <limits>
-#include <memory>
-
-#include "base/check.h"
-#include "base/notreached.h"
-#include "content/common/pepper_file_util.h"
-#include "ppapi/c/pp_errors.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/c/pp_resource.h"
-#include "ppapi/c/ppb_image_data.h"
-#include "ppapi/thunk/thunk.h"
-#include "skia/ext/legacy_display_globals.h"
-#include "skia/ext/platform_canvas.h"
-#include "third_party/skia/include/core/SkCanvas.h"
-#include "third_party/skia/include/core/SkPixmap.h"
-#include "ui/surface/transport_dib.h"
-
-using ppapi::thunk::PPB_ImageData_API;
-
-namespace content {
-
-PPB_ImageData_Impl::PPB_ImageData_Impl(PP_Instance instance,
-                                       PPB_ImageData_Shared::ImageDataType type)
-    : Resource(ppapi::OBJECT_IS_IMPL, instance),
-      format_(PP_IMAGEDATAFORMAT_BGRA_PREMUL),
-      width_(0),
-      height_(0) {
-  switch (type) {
-    case PPB_ImageData_Shared::PLATFORM:
-      backend_ = std::make_unique<ImageDataPlatformBackend>();
-      return;
-    case PPB_ImageData_Shared::SIMPLE:
-      backend_ = std::make_unique<ImageDataSimpleBackend>();
-      return;
-      // No default: so that we get a compiler warning if any types are added.
-  }
-  NOTREACHED();
-}
-
-PPB_ImageData_Impl::PPB_ImageData_Impl(PP_Instance instance, ForTest)
-    : Resource(ppapi::OBJECT_IS_IMPL, instance),
-      format_(PP_IMAGEDATAFORMAT_BGRA_PREMUL),
-      width_(0),
-      height_(0) {
-  backend_ = std::make_unique<ImageDataPlatformBackend>();
-}
-
-PPB_ImageData_Impl::~PPB_ImageData_Impl() {}
-
-bool PPB_ImageData_Impl::Init(PP_ImageDataFormat format,
-                              int width,
-                              int height,
-                              bool init_to_zero) {
-  // TODO(brettw) this should be called only on the main thread!
-  if (!IsImageDataFormatSupported(format))
-    return false;  // Only support this one format for now.
-  if (width <= 0 || height <= 0)
-    return false;
-  if (static_cast<int64_t>(width) * static_cast<int64_t>(height) >=
-      std::numeric_limits<int32_t>::max() / 4)
-    return false;  // Prevent overflow of signed 32-bit ints.
-
-  format_ = format;
-  width_ = width;
-  height_ = height;
-  return backend_->Init(this, format, width, height, init_to_zero);
-}
-
-// static
-PP_Resource PPB_ImageData_Impl::Create(PP_Instance instance,
-                                       PPB_ImageData_Shared::ImageDataType type,
-                                       PP_ImageDataFormat format,
-                                       const PP_Size& size,
-                                       PP_Bool init_to_zero) {
-  scoped_refptr<PPB_ImageData_Impl> data(
-      new PPB_ImageData_Impl(instance, type));
-  if (!data->Init(format, size.width, size.height, !!init_to_zero))
-    return 0;
-  return data->GetReference();
-}
-
-PPB_ImageData_API* PPB_ImageData_Impl::AsPPB_ImageData_API() { return this; }
-
-bool PPB_ImageData_Impl::IsMapped() const { return backend_->IsMapped(); }
-
-TransportDIB* PPB_ImageData_Impl::GetTransportDIB() const {
-  return backend_->GetTransportDIB();
-}
-
-PP_Bool PPB_ImageData_Impl::Describe(PP_ImageDataDesc* desc) {
-  desc->format = format_;
-  desc->size.width = width_;
-  desc->size.height = height_;
-  desc->stride = width_ * 4;
-  return PP_TRUE;
-}
-
-void* PPB_ImageData_Impl::Map() { return backend_->Map(); }
-
-void PPB_ImageData_Impl::Unmap() { backend_->Unmap(); }
-
-int32_t PPB_ImageData_Impl::GetSharedMemoryRegion(
-    base::UnsafeSharedMemoryRegion** region) {
-  return backend_->GetSharedMemoryRegion(region);
-}
-
-SkCanvas* PPB_ImageData_Impl::GetCanvas() { return backend_->GetCanvas(); }
-
-void PPB_ImageData_Impl::SetIsCandidateForReuse() {
-  // Nothing to do since we don't support image data re-use in-process.
-}
-
-SkBitmap PPB_ImageData_Impl::GetMappedBitmap() const {
-  return backend_->GetMappedBitmap();
-}
-
-// ImageDataPlatformBackend ----------------------------------------------------
-
-ImageDataPlatformBackend::ImageDataPlatformBackend() : width_(0), height_(0) {
-}
-
-ImageDataPlatformBackend::~ImageDataPlatformBackend() {
-}
-
-bool ImageDataPlatformBackend::Init(PPB_ImageData_Impl* impl,
-                                    PP_ImageDataFormat format,
-                                    int width,
-                                    int height,
-                                    bool init_to_zero) {
-  // TODO(brettw): use init_to_zero when we implement caching.
-  width_ = width;
-  height_ = height;
-  uint32_t buffer_size = width_ * height_ * 4;
-  base::UnsafeSharedMemoryRegion region =
-      base::UnsafeSharedMemoryRegion::Create(buffer_size);
-  if (!region.IsValid())
-    return false;
-
-  dib_ = TransportDIB::CreateWithHandle(std::move(region));
-  return !!dib_;
-}
-
-bool ImageDataPlatformBackend::IsMapped() const {
-  return !!mapped_canvas_.get();
-}
-
-TransportDIB* ImageDataPlatformBackend::GetTransportDIB() const {
-  return dib_.get();
-}
-
-void* ImageDataPlatformBackend::Map() {
-  if (!mapped_canvas_) {
-    const bool is_opaque = false;
-    mapped_canvas_ = dib_->GetPlatformCanvas(width_, height_, is_opaque);
-    if (!mapped_canvas_)
-      return nullptr;
-  }
-  SkPixmap pixmap;
-  skia::GetWritablePixels(mapped_canvas_.get(), &pixmap);
-  DCHECK(pixmap.addr());
-  // SkPixmap does not manage the lifetime of this pointer, so it remains
-  // valid after the object goes out of scope. It will become invalid if
-  // the canvas' backing is destroyed or a pending saveLayer() is resolved.
-  return pixmap.writable_addr32(0, 0);
-}
-
-void ImageDataPlatformBackend::Unmap() {
-  // This is currently unimplemented, which is OK. The data will just always
-  // be around once it's mapped. Chrome's TransportDIB isn't currently
-  // unmappable without freeing it, but this may be something we want to support
-  // in the future to save some memory.
-}
-
-int32_t ImageDataPlatformBackend::GetSharedMemoryRegion(
-    base::UnsafeSharedMemoryRegion** region) {
-  *region = dib_->shared_memory_region();
-  return PP_OK;
-}
-
-SkCanvas* ImageDataPlatformBackend::GetCanvas() { return mapped_canvas_.get(); }
-
-SkBitmap ImageDataPlatformBackend::GetMappedBitmap() const {
-  SkBitmap bitmap;
-  if (!mapped_canvas_)
-    return bitmap;
-
-  SkPixmap pixmap;
-  skia::GetWritablePixels(mapped_canvas_.get(), &pixmap);
-  // SkPixmap does not manage the lifetime of this pointer, so it remains
-  // valid after the object goes out of scope. It will become invalid if
-  // the canvas' backing is destroyed or a pending saveLayer() is resolved.
-  bitmap.installPixels(pixmap);
-  return bitmap;
-}
-
-// ImageDataSimpleBackend ------------------------------------------------------
-
-ImageDataSimpleBackend::ImageDataSimpleBackend() : map_count_(0) {}
-
-ImageDataSimpleBackend::~ImageDataSimpleBackend() {}
-
-bool ImageDataSimpleBackend::Init(PPB_ImageData_Impl* impl,
-                                  PP_ImageDataFormat format,
-                                  int width,
-                                  int height,
-                                  bool init_to_zero) {
-  skia_bitmap_.setInfo(
-      SkImageInfo::MakeN32Premul(impl->width(), impl->height()));
-  shm_region_ =
-      base::UnsafeSharedMemoryRegion::Create(skia_bitmap_.computeByteSize());
-  return shm_region_.IsValid();
-}
-
-bool ImageDataSimpleBackend::IsMapped() const {
-  return shm_mapping_.IsValid();
-}
-
-TransportDIB* ImageDataSimpleBackend::GetTransportDIB() const {
-  return nullptr;
-}
-
-void* ImageDataSimpleBackend::Map() {
-  DCHECK(shm_region_.IsValid());
-  if (map_count_++ == 0) {
-    shm_mapping_ = shm_region_.Map();
-    if (!shm_mapping_.IsValid())
-      return nullptr;
-
-    base::span<uint8_t> mem(shm_mapping_);
-    CHECK_GE(mem.size(), skia_bitmap_.computeByteSize());
-    skia_bitmap_.setPixels(mem.data());
-    // Our platform bitmaps are set to opaque by default, which we don't want.
-    skia_bitmap_.setAlphaType(kPremul_SkAlphaType);
-    skia_canvas_ = std::make_unique<SkCanvas>(
-        skia_bitmap_, skia::LegacyDisplayGlobals::GetSkSurfaceProps());
-  }
-  return skia_bitmap_.isNull() ? nullptr : skia_bitmap_.getAddr32(0, 0);
-}
-
-void ImageDataSimpleBackend::Unmap() {
-  if (--map_count_ == 0)
-    shm_mapping_ = base::WritableSharedMemoryMapping();
-}
-
-int32_t ImageDataSimpleBackend::GetSharedMemoryRegion(
-    base::UnsafeSharedMemoryRegion** region) {
-  *region = &shm_region_;
-  return PP_OK;
-}
-
-SkCanvas* ImageDataSimpleBackend::GetCanvas() {
-  if (!IsMapped())
-    return nullptr;
-  return skia_canvas_.get();
-}
-
-SkBitmap ImageDataSimpleBackend::GetMappedBitmap() const {
-  if (!IsMapped())
-    return SkBitmap();
-  return skia_bitmap_;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/ppb_image_data_impl.h b/content/renderer/pepper/ppb_image_data_impl.h
deleted file mode 100644
index 0c523ad..0000000
--- a/content/renderer/pepper/ppb_image_data_impl.h
+++ /dev/null
@@ -1,226 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PPB_IMAGE_DATA_IMPL_H_
-#define CONTENT_RENDERER_PEPPER_PPB_IMAGE_DATA_IMPL_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/shared_memory_mapping.h"
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "ppapi/c/ppb_image_data.h"
-#include "ppapi/shared_impl/ppb_image_data_shared.h"
-#include "ppapi/shared_impl/resource.h"
-#include "ppapi/thunk/ppb_image_data_api.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-
-class SkCanvas;
-class TransportDIB;
-
-namespace content {
-
-class PPB_ImageData_Impl : public ppapi::Resource,
-                           public ppapi::PPB_ImageData_Shared,
-                           public ppapi::thunk::PPB_ImageData_API {
- public:
-  // We delegate most of our implementation to a back-end class that either uses
-  // a PlatformCanvas (for most trusted stuff) or bare shared memory (for use by
-  // NaCl, or trusted plugins when the PlatformCanvas isn't needed). This makes
-  // it cheap & easy to implement Swap.
-  class Backend {
-   public:
-    virtual ~Backend() {}
-    virtual bool Init(PPB_ImageData_Impl* impl,
-                      PP_ImageDataFormat format,
-                      int width,
-                      int height,
-                      bool init_to_zero) = 0;
-    virtual bool IsMapped() const = 0;
-    virtual TransportDIB* GetTransportDIB() const = 0;
-    virtual void* Map() = 0;
-    virtual void Unmap() = 0;
-    virtual int32_t GetSharedMemoryRegion(
-        base::UnsafeSharedMemoryRegion** region) = 0;
-    virtual SkCanvas* GetCanvas() = 0;
-    virtual SkBitmap GetMappedBitmap() const = 0;
-  };
-
-  // If you call this constructor, you must also call Init before use. Normally
-  // you should use the static Create function, but this constructor is needed
-  // for some internal uses of ImageData (like Graphics2D).
-  PPB_ImageData_Impl(PP_Instance instance,
-                     PPB_ImageData_Shared::ImageDataType type);
-
-  PPB_ImageData_Impl(const PPB_ImageData_Impl&) = delete;
-  PPB_ImageData_Impl& operator=(const PPB_ImageData_Impl&) = delete;
-
-  // Constructor used for unittests. The ImageData is always allocated locally.
-  struct ForTest {};
-  PPB_ImageData_Impl(PP_Instance instance, ForTest);
-
-  bool Init(PP_ImageDataFormat format,
-            int width,
-            int height,
-            bool init_to_zero);
-
-  static PP_Resource Create(PP_Instance pp_instance,
-                            PPB_ImageData_Shared::ImageDataType type,
-                            PP_ImageDataFormat format,
-                            const PP_Size& size,
-                            PP_Bool init_to_zero);
-
-  int width() const { return width_; }
-  int height() const { return height_; }
-
-  // Returns the image format.
-  PP_ImageDataFormat format() const { return format_; }
-
-  // Returns true if this image is mapped. False means that the image is either
-  // invalid or not mapped. See ImageDataAutoMapper below.
-  bool IsMapped() const;
-  TransportDIB* GetTransportDIB() const;
-
-  // Resource override.
-  ppapi::thunk::PPB_ImageData_API* AsPPB_ImageData_API() override;
-
-  // PPB_ImageData_API implementation.
-  PP_Bool Describe(PP_ImageDataDesc* desc) override;
-  void* Map() override;
-  void Unmap() override;
-  int32_t GetSharedMemoryRegion(
-      base::UnsafeSharedMemoryRegion** region) override;
-  SkCanvas* GetCanvas() override;
-  void SetIsCandidateForReuse() override;
-
-  // Returns an *empty* bitmap on error.
-  // Users must call SkBitmap::lockPixels() before SkBitmap::getPixels();
-  // unlockPixels() will be automatically invoked if necessary when the
-  // bitmap goes out of scope.
-  SkBitmap GetMappedBitmap() const;
-
- private:
-  ~PPB_ImageData_Impl() override;
-
-  PP_ImageDataFormat format_;
-  int width_;
-  int height_;
-  std::unique_ptr<Backend> backend_;
-};
-
-class ImageDataPlatformBackend : public PPB_ImageData_Impl::Backend {
- public:
-  // |is_browser_allocated| indicates whether the backing shared memory should
-  // be allocated by the browser process.
-  ImageDataPlatformBackend();
-
-  ImageDataPlatformBackend(const ImageDataPlatformBackend&) = delete;
-  ImageDataPlatformBackend& operator=(const ImageDataPlatformBackend&) = delete;
-
-  ~ImageDataPlatformBackend() override;
-
-  // PPB_ImageData_Impl::Backend implementation.
-  bool Init(PPB_ImageData_Impl* impl,
-            PP_ImageDataFormat format,
-            int width,
-            int height,
-            bool init_to_zero) override;
-  bool IsMapped() const override;
-  TransportDIB* GetTransportDIB() const override;
-  void* Map() override;
-  void Unmap() override;
-  int32_t GetSharedMemoryRegion(
-      base::UnsafeSharedMemoryRegion** region) override;
-  SkCanvas* GetCanvas() override;
-  SkBitmap GetMappedBitmap() const override;
-
- private:
-  // This will be NULL before initialization, and if this PPB_ImageData_Impl is
-  // swapped with another.
-  int width_;
-  int height_;
-  std::unique_ptr<TransportDIB> dib_;
-
-  // When the device is mapped, this is the image. Null when umapped.
-  std::unique_ptr<SkCanvas> mapped_canvas_;
-};
-
-class ImageDataSimpleBackend : public PPB_ImageData_Impl::Backend {
- public:
-  ImageDataSimpleBackend();
-
-  ImageDataSimpleBackend(const ImageDataSimpleBackend&) = delete;
-  ImageDataSimpleBackend& operator=(const ImageDataSimpleBackend&) = delete;
-
-  ~ImageDataSimpleBackend() override;
-
-  // PPB_ImageData_Impl::Backend implementation.
-  bool Init(PPB_ImageData_Impl* impl,
-            PP_ImageDataFormat format,
-            int width,
-            int height,
-            bool init_to_zero) override;
-  bool IsMapped() const override;
-  TransportDIB* GetTransportDIB() const override;
-  void* Map() override;
-  void Unmap() override;
-  int32_t GetSharedMemoryRegion(
-      base::UnsafeSharedMemoryRegion** region) override;
-  SkCanvas* GetCanvas() override;
-  SkBitmap GetMappedBitmap() const override;
-
- private:
-  base::UnsafeSharedMemoryRegion shm_region_;
-  base::WritableSharedMemoryMapping shm_mapping_;
-  // skia_bitmap_ is backed by shared_memory_.
-  SkBitmap skia_bitmap_;
-  std::unique_ptr<SkCanvas> skia_canvas_;
-  uint32_t map_count_;
-};
-
-// Manages mapping an image resource if necessary. Use this to ensure the
-// image is mapped. The destructor will put the image back into the previous
-// state. You must check is_valid() to make sure the image was successfully
-// mapped before using it.
-//
-// Example:
-//   ImageDataAutoMapper mapper(image_data);
-//   if (!mapper.is_valid())
-//     return utter_failure;
-//   image_data->mapped_canvas()->blah();  // Guaranteed valid.
-class ImageDataAutoMapper {
- public:
-  explicit ImageDataAutoMapper(PPB_ImageData_Impl* image_data)
-      : image_data_(image_data) {
-    if (image_data_->IsMapped()) {
-      is_valid_ = true;
-      needs_unmap_ = false;
-    } else {
-      is_valid_ = needs_unmap_ = !!image_data_->Map();
-    }
-  }
-
-  ImageDataAutoMapper(const ImageDataAutoMapper&) = delete;
-  ImageDataAutoMapper& operator=(const ImageDataAutoMapper&) = delete;
-
-  ~ImageDataAutoMapper() {
-    if (needs_unmap_)
-      image_data_->Unmap();
-  }
-
-  // Check this to see if the image was successfully mapped. If this is false,
-  // the image could not be mapped and is unusable.
-  bool is_valid() const { return is_valid_; }
-
- private:
-  raw_ptr<PPB_ImageData_Impl> image_data_;
-  bool is_valid_;
-  bool needs_unmap_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PPB_IMAGE_DATA_IMPL_H_
diff --git a/content/renderer/pepper/ppb_proxy_impl.cc b/content/renderer/pepper/ppb_proxy_impl.cc
deleted file mode 100644
index 450c1abd..0000000
--- a/content/renderer/pepper/ppb_proxy_impl.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2011 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/ppb_proxy_impl.h"
-
-#include "ppapi/c/private/ppb_proxy_private.h"
-#include "ppapi/thunk/enter.h"
-#include "ppapi/thunk/ppb_image_data_api.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/plugin_module.h"
-
-using ppapi::PpapiGlobals;
-using ppapi::thunk::EnterResource;
-using ppapi::thunk::PPB_URLLoader_API;
-
-namespace content {
-
-namespace {
-
-void PluginCrashed(PP_Module module) {
-  PluginModule* plugin_module = HostGlobals::Get()->GetModule(module);
-  if (plugin_module)
-    plugin_module->PluginCrashed();
-}
-
-PP_Instance GetInstanceForResource(PP_Resource resource) {
-  ppapi::Resource* obj =
-      PpapiGlobals::Get()->GetResourceTracker()->GetResource(resource);
-  if (!obj)
-    return 0;
-  return obj->pp_instance();
-}
-
-void SetReserveInstanceIDCallback(PP_Module module,
-                                  PP_Bool (*reserve)(PP_Module, PP_Instance)) {
-  PluginModule* plugin_module = HostGlobals::Get()->GetModule(module);
-  if (plugin_module)
-    plugin_module->SetReserveInstanceIDCallback(reserve);
-}
-
-void AddRefModule(PP_Module module) {
-  PluginModule* plugin_module = HostGlobals::Get()->GetModule(module);
-  if (plugin_module)
-    plugin_module->AddRef();
-}
-
-void ReleaseModule(PP_Module module) {
-  PluginModule* plugin_module = HostGlobals::Get()->GetModule(module);
-  if (plugin_module)
-    plugin_module->Release();
-}
-
-PP_Bool IsInModuleDestructor(PP_Module module) {
-  PluginModule* plugin_module = HostGlobals::Get()->GetModule(module);
-  if (plugin_module)
-    return PP_FromBool(plugin_module->is_in_destructor());
-  return PP_FALSE;
-}
-
-const PPB_Proxy_Private ppb_proxy = {
-    &PluginCrashed, &GetInstanceForResource, &SetReserveInstanceIDCallback,
-    &AddRefModule,  &ReleaseModule,          &IsInModuleDestructor};
-
-}  // namespace
-
-// static
-const PPB_Proxy_Private* PPB_Proxy_Impl::GetInterface() { return &ppb_proxy; }
-
-}  // namespace content
diff --git a/content/renderer/pepper/ppb_proxy_impl.h b/content/renderer/pepper/ppb_proxy_impl.h
deleted file mode 100644
index 5253183..0000000
--- a/content/renderer/pepper/ppb_proxy_impl.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2011 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PPB_PROXY_IMPL_H_
-#define CONTENT_RENDERER_PEPPER_PPB_PROXY_IMPL_H_
-
-struct PPB_Proxy_Private;
-
-namespace content {
-
-class PPB_Proxy_Impl {
- public:
-  static const PPB_Proxy_Private* GetInterface();
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PPB_PROXY_IMPL_H_
diff --git a/content/renderer/pepper/ppb_var_deprecated_impl.cc b/content/renderer/pepper/ppb_var_deprecated_impl.cc
deleted file mode 100644
index 2273070..0000000
--- a/content/renderer/pepper/ppb_var_deprecated_impl.cc
+++ /dev/null
@@ -1,424 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/ppb_var_deprecated_impl.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-#include <memory>
-
-#include "base/memory/raw_ptr.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/message_channel.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/pepper_try_catch.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "content/renderer/pepper/plugin_object.h"
-#include "content/renderer/pepper/v8object_var.h"
-#include "ppapi/c/dev/ppb_var_deprecated.h"
-#include "ppapi/c/ppb_var.h"
-#include "ppapi/shared_impl/ppb_var_shared.h"
-#include "third_party/blink/public/web/web_document.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-#include "third_party/blink/public/web/web_plugin_container.h"
-#include "third_party/blink/public/web/web_plugin_script_forbidden_scope.h"
-
-using ppapi::V8ObjectVar;
-using ppapi::PpapiGlobals;
-using ppapi::ScopedPPVar;
-using ppapi::ScopedPPVarArray;
-using ppapi::StringVar;
-using ppapi::Var;
-
-namespace content {
-
-namespace {
-
-const char kInvalidIdentifierException[] = "Error: Invalid identifier.";
-const char kInvalidObjectException[] = "Error: Invalid object";
-const char kUnableToCallMethodException[] = "Error: Unable to call method";
-
-class ObjectAccessor {
- public:
-  ObjectAccessor(PP_Var var)
-      : object_var_(V8ObjectVar::FromPPVar(var).get()),
-        instance_(object_var_ ? object_var_->instance() : nullptr) {
-    if (instance_) {
-      converter_ = std::make_unique<V8VarConverter>(
-          instance_->pp_instance(), V8VarConverter::kAllowObjectVars);
-    }
-  }
-
-  // Check if the object is valid. If it isn't, set an exception and return
-  // false.
-  bool IsValid(PP_Var* exception) {
-    // If we already have an exception, then the call is invalid according to
-    // the unittests.
-    if (exception && exception->type != PP_VARTYPE_UNDEFINED)
-      return false;
-    if (instance_)
-      return !instance_->is_deleted() ||
-             !blink::WebPluginScriptForbiddenScope::IsForbidden();
-    if (exception)
-      *exception = ppapi::StringVar::StringToPPVar(kInvalidObjectException);
-    return false;
-  }
-  // Lazily grab the object so that the handle is created in the current handle
-  // scope.
-  v8::Local<v8::Object> GetObject() { return object_var_->GetHandle(); }
-  PepperPluginInstanceImpl* instance() { return instance_; }
-  V8VarConverter* converter() { return converter_.get(); }
-
- private:
-  raw_ptr<V8ObjectVar> object_var_;
-  raw_ptr<PepperPluginInstanceImpl> instance_;
-  std::unique_ptr<V8VarConverter> converter_;
-};
-
-bool IsValidIdentifer(PP_Var identifier, PP_Var* exception) {
-  if (identifier.type == PP_VARTYPE_INT32 ||
-      identifier.type == PP_VARTYPE_STRING) {
-    return true;
-  }
-  if (exception)
-    *exception = ppapi::StringVar::StringToPPVar(kInvalidIdentifierException);
-  return false;
-}
-
-bool HasPropertyDeprecated(PP_Var var, PP_Var name, PP_Var* exception) {
-  ObjectAccessor accessor(var);
-  if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception))
-    return false;
-
-  PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(),
-                              exception);
-  v8::Local<v8::Context> context = try_catch.GetContext();
-  v8::MicrotasksScope microtasks_scope(
-      context, v8::MicrotasksScope::kDoNotRunMicrotasks);
-  v8::Local<v8::Value> v8_name = try_catch.ToV8(name);
-  if (try_catch.HasException())
-    return false;
-
-  bool result = false;
-  if (!accessor.GetObject()->Has(context, v8_name).To(&result)) {
-    try_catch.HasException();
-    return false;
-  }
-
-  return result;
-}
-
-bool HasMethodDeprecated(PP_Var var, PP_Var name, PP_Var* exception) {
-  ObjectAccessor accessor(var);
-  if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception))
-    return false;
-
-  PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(),
-                              exception);
-  v8::Local<v8::Context> context = try_catch.GetContext();
-  v8::MicrotasksScope microtasks_scope(
-      context, v8::MicrotasksScope::kDoNotRunMicrotasks);
-  v8::Local<v8::Value> v8_name = try_catch.ToV8(name);
-  if (try_catch.HasException())
-    return false;
-
-  bool has_name = false;
-  if (!accessor.GetObject()->Has(context, v8_name).To(&has_name)) {
-    try_catch.HasException();
-    return false;
-  }
-
-  if (!has_name)
-    return false;
-
-  v8::Local<v8::Value> function;
-  return accessor.GetObject()->Get(context, v8_name).ToLocal(&function) &&
-         function->IsFunction();
-}
-
-PP_Var GetProperty(PP_Var var, PP_Var name, PP_Var* exception) {
-  ObjectAccessor accessor(var);
-  if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception))
-    return PP_MakeUndefined();
-
-  PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(),
-                              exception);
-  v8::Local<v8::Context> context = try_catch.GetContext();
-  v8::MicrotasksScope microtasks_scope(
-      context, v8::MicrotasksScope::kDoNotRunMicrotasks);
-  v8::Local<v8::Value> v8_name = try_catch.ToV8(name);
-  if (try_catch.HasException())
-    return PP_MakeUndefined();
-
-  ScopedPPVar result_var =
-      try_catch.FromV8Maybe(accessor.GetObject()->Get(context, v8_name));
-  if (try_catch.HasException())
-    return PP_MakeUndefined();
-
-  return result_var.Release();
-}
-
-void EnumerateProperties(PP_Var var,
-                         uint32_t* property_count,
-                         PP_Var** properties,
-                         PP_Var* exception) {
-  ObjectAccessor accessor(var);
-  if (!accessor.IsValid(exception))
-    return;
-
-  PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(),
-                              exception);
-  v8::Local<v8::Context> context = try_catch.GetContext();
-  v8::MicrotasksScope microtasks_scope(
-      context, v8::MicrotasksScope::kDoNotRunMicrotasks);
-
-  *properties = nullptr;
-  *property_count = 0;
-
-  v8::Local<v8::Array> identifiers;
-  if (!accessor.GetObject()->GetPropertyNames(context).ToLocal(&identifiers))
-    return;
-  ScopedPPVarArray identifier_vars(identifiers->Length());
-  for (uint32_t i = 0; i < identifiers->Length(); ++i) {
-    ScopedPPVar identifier =
-        try_catch.FromV8Maybe(identifiers->Get(context, i));
-    if (try_catch.HasException())
-      return;
-    identifier_vars.Set(i, identifier);
-  }
-
-  size_t size = identifier_vars.size();
-  *properties = identifier_vars.Release(
-      ScopedPPVarArray::PassPPBMemoryAllocatedArray());
-  *property_count = size;
-}
-
-void SetPropertyDeprecated(PP_Var var,
-                           PP_Var name,
-                           PP_Var value,
-                           PP_Var* exception) {
-  ObjectAccessor accessor(var);
-  if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception))
-    return;
-
-  PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(),
-                              exception);
-  v8::Local<v8::Context> context = try_catch.GetContext();
-  v8::MicrotasksScope microtasks_scope(
-      context, v8::MicrotasksScope::kDoNotRunMicrotasks);
-  v8::Local<v8::Value> v8_name = try_catch.ToV8(name);
-  v8::Local<v8::Value> v8_value = try_catch.ToV8(value);
-
-  if (try_catch.HasException())
-    return;
-
-  if (accessor.GetObject()
-          ->Set(try_catch.GetContext(), v8_name, v8_value)
-          .IsNothing()) {
-    try_catch.HasException();  // Ensure an exception gets set.
-  }
-}
-
-void DeletePropertyDeprecated(PP_Var var, PP_Var name, PP_Var* exception) {
-  ObjectAccessor accessor(var);
-  if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception))
-    return;
-
-  PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(),
-                              exception);
-  v8::Local<v8::Context> context = try_catch.GetContext();
-  v8::MicrotasksScope microtasks_scope(
-      context, v8::MicrotasksScope::kDoNotRunMicrotasks);
-  v8::Local<v8::Value> v8_name = try_catch.ToV8(name);
-
-  if (try_catch.HasException())
-    return;
-
-  if (accessor.GetObject()->Delete(context, v8_name).IsNothing()) {
-    // Ensure exception object is created if V8 has thrown.
-    try_catch.HasException();
-    return;
-  }
-  return;
-}
-
-PP_Var CallDeprecatedInternal(PP_Var var,
-                              PP_Var method_name,
-                              uint32_t argc,
-                              PP_Var* argv,
-                              PP_Var* exception) {
-  ObjectAccessor accessor(var);
-  if (!accessor.IsValid(exception))
-    return PP_MakeUndefined();
-
-  // If the method name is undefined, set it to the empty string to trigger
-  // calling |var| as a function.
-  ScopedPPVar scoped_name(method_name);
-  if (method_name.type == PP_VARTYPE_UNDEFINED) {
-    scoped_name = ScopedPPVar(ScopedPPVar::PassRef(),
-                                StringVar::StringToPPVar(""));
-  }
-
-  PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(),
-                              exception);
-  v8::Local<v8::Context> context = try_catch.GetContext();
-  v8::MicrotasksScope microtasks_scope(
-      context, v8::MicrotasksScope::kDoNotRunMicrotasks);
-  v8::Local<v8::Value> v8_method_name = try_catch.ToV8(scoped_name.get());
-  if (try_catch.HasException())
-    return PP_MakeUndefined();
-
-  if (!v8_method_name->IsString()) {
-    try_catch.SetException(kUnableToCallMethodException);
-    return PP_MakeUndefined();
-  }
-
-  v8::Local<v8::Object> function = accessor.GetObject();
-  v8::Local<v8::Object> recv = context->Global();
-  if (v8_method_name.As<v8::String>()->Length() != 0) {
-    v8::Local<v8::Value> value;
-    if (!function->Get(context, v8_method_name).ToLocal(&value) ||
-        !value->ToObject(context).ToLocal(&function)) {
-      try_catch.SetException(kUnableToCallMethodException);
-      return PP_MakeUndefined();
-    }
-    recv = accessor.GetObject();
-  }
-
-  if (try_catch.HasException())
-    return PP_MakeUndefined();
-
-  if (!function->IsFunction()) {
-    try_catch.SetException(kUnableToCallMethodException);
-    return PP_MakeUndefined();
-  }
-
-  std::unique_ptr<v8::Local<v8::Value>[]> converted_args(
-      new v8::Local<v8::Value>[argc]);
-  for (uint32_t i = 0; i < argc; ++i) {
-    converted_args[i] = try_catch.ToV8(argv[i]);
-    if (try_catch.HasException())
-      return PP_MakeUndefined();
-  }
-
-  blink::WebPluginContainer* container = accessor.instance()->container();
-  blink::WebLocalFrame* frame = nullptr;
-  if (container)
-    frame = container->GetDocument().GetFrame();
-
-  if (!frame) {
-    try_catch.SetException("No frame to execute script in.");
-    return PP_MakeUndefined();
-  }
-
-  ScopedPPVar result_var;
-  v8::Local<v8::Value> result;
-  if (frame
-          ->CallFunctionEvenIfScriptDisabled(function.As<v8::Function>(), recv,
-                                             argc, converted_args.get())
-          .ToLocal(&result)) {
-    result_var = try_catch.FromV8(result);
-  }
-
-  if (try_catch.HasException())
-    return PP_MakeUndefined();
-
-  return result_var.Release();
-}
-
-PP_Var CallDeprecated(PP_Var var,
-                      PP_Var method_name,
-                      uint32_t argc,
-                      PP_Var* argv,
-                      PP_Var* exception) {
-  ObjectAccessor accessor(var);
-  if (accessor.instance() &&
-      accessor.instance()->HasTransientUserActivation()) {
-    return CallDeprecatedInternal(var, method_name, argc, argv, exception);
-  }
-  return CallDeprecatedInternal(var, method_name, argc, argv, exception);
-}
-
-PP_Var Construct(PP_Var var, uint32_t argc, PP_Var* argv, PP_Var* exception) {
-  // Deprecated.
-  NOTREACHED();
-}
-
-bool IsInstanceOfDeprecated(PP_Var var,
-                            const PPP_Class_Deprecated* ppp_class,
-                            void** ppp_class_data) {
-  scoped_refptr<V8ObjectVar> object(V8ObjectVar::FromPPVar(var));
-  if (!object.get())
-    return false;  // Not an object at all.
-
-  v8::HandleScope handle_scope(object->instance()->GetIsolate());
-  v8::Local<v8::Context> context = object->instance()->GetMainWorldContext();
-  if (context.IsEmpty())
-    return false;
-  v8::Context::Scope context_scope(context);
-  PluginObject* plugin_object = PluginObject::FromV8Object(
-      object->instance()->GetIsolate(), object->GetHandle());
-  if (plugin_object && plugin_object->ppp_class() == ppp_class) {
-    if (ppp_class_data)
-      *ppp_class_data = plugin_object->ppp_class_data();
-    return true;
-  }
-
-  return false;
-}
-
-PP_Var CreateObjectDeprecated(PP_Instance pp_instance,
-                              const PPP_Class_Deprecated* ppp_class,
-                              void* ppp_class_data) {
-  PepperPluginInstanceImpl* instance =
-      HostGlobals::Get()->GetInstance(pp_instance);
-  if (!instance) {
-    DLOG(ERROR) << "Create object passed an invalid instance.";
-    return PP_MakeNull();
-  }
-  return PluginObject::Create(instance, ppp_class, ppp_class_data);
-}
-
-PP_Var CreateObjectWithModuleDeprecated(PP_Module pp_module,
-                                        const PPP_Class_Deprecated* ppp_class,
-                                        void* ppp_class_data) {
-  PluginModule* module = HostGlobals::Get()->GetModule(pp_module);
-  if (!module)
-    return PP_MakeNull();
-  return PluginObject::Create(
-      module->GetSomeInstance(), ppp_class, ppp_class_data);
-}
-
-}  // namespace
-
-// static
-const PPB_Var_Deprecated* PPB_Var_Deprecated_Impl::GetVarDeprecatedInterface() {
-  static const PPB_Var_Deprecated var_deprecated_interface = {
-      ppapi::PPB_Var_Shared::GetVarInterface1_0()->AddRef,
-      ppapi::PPB_Var_Shared::GetVarInterface1_0()->Release,
-      ppapi::PPB_Var_Shared::GetVarInterface1_0()->VarFromUtf8,
-      ppapi::PPB_Var_Shared::GetVarInterface1_0()->VarToUtf8,
-      &HasPropertyDeprecated,
-      &HasMethodDeprecated,
-      &GetProperty,
-      &EnumerateProperties,
-      &SetPropertyDeprecated,
-      &DeletePropertyDeprecated,
-      &CallDeprecated,
-      &Construct,
-      &IsInstanceOfDeprecated,
-      &CreateObjectDeprecated,
-      &CreateObjectWithModuleDeprecated, };
-
-  return &var_deprecated_interface;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/ppb_var_deprecated_impl.h b/content/renderer/pepper/ppb_var_deprecated_impl.h
deleted file mode 100644
index 5b2120d..0000000
--- a/content/renderer/pepper/ppb_var_deprecated_impl.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2011 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_PPB_VAR_DEPRECATED_IMPL_H_
-#define CONTENT_RENDERER_PEPPER_PPB_VAR_DEPRECATED_IMPL_H_
-
-struct PPB_Var_Deprecated;
-
-namespace content {
-
-class PPB_Var_Deprecated_Impl {
- public:
-  static const PPB_Var_Deprecated* GetVarDeprecatedInterface();
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_PPB_VAR_DEPRECATED_IMPL_H_
diff --git a/content/renderer/pepper/renderer_ppapi_host_impl.cc b/content/renderer/pepper/renderer_ppapi_host_impl.cc
deleted file mode 100644
index 9fa640e8..0000000
--- a/content/renderer/pepper/renderer_ppapi_host_impl.cc
+++ /dev/null
@@ -1,290 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-
-#include <memory>
-
-#include "base/check.h"
-#include "base/files/file_path.h"
-#include "base/functional/bind.h"
-#include "base/location.h"
-#include "base/process/process_handle.h"
-#include "base/task/single_thread_task_runner.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/pepper_browser_connection.h"
-#include "content/renderer/pepper/pepper_graphics_2d_host.h"
-#include "content/renderer/pepper/pepper_in_process_resource_creation.h"
-#include "content/renderer/pepper/pepper_in_process_router.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "content/renderer/render_frame_impl.h"
-#include "ipc/ipc_message.h"
-#include "ipc/ipc_platform_file.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/proxy/host_dispatcher.h"
-#include "services/network/public/cpp/is_potentially_trustworthy.h"
-#include "third_party/blink/public/web/web_document.h"
-#include "third_party/blink/public/web/web_element.h"
-#include "third_party/blink/public/web/web_plugin_container.h"
-#include "ui/gfx/geometry/point.h"
-
-namespace content {
-
-// static
-RendererPpapiHost* RendererPpapiHost::GetForPPInstance(PP_Instance instance) {
-  return RendererPpapiHostImpl::GetForPPInstance(instance);
-}
-
-// Out-of-process constructor.
-RendererPpapiHostImpl::RendererPpapiHostImpl(
-    PluginModule* module,
-    ppapi::proxy::HostDispatcher* dispatcher,
-    const ppapi::PpapiPermissions& permissions)
-    : module_(module),
-      dispatcher_(dispatcher),
-      is_external_plugin_host_(false) {
-  // Hook the PpapiHost up to the dispatcher for out-of-process communication.
-  ppapi_host_ =
-      std::make_unique<ppapi::host::PpapiHost>(dispatcher, permissions);
-  ppapi_host_->AddHostFactoryFilter(std::unique_ptr<ppapi::host::HostFactory>(
-      new ContentRendererPepperHostFactory(this)));
-  dispatcher->AddFilter(ppapi_host_.get());
-  is_running_in_process_ = false;
-}
-
-// In-process constructor.
-RendererPpapiHostImpl::RendererPpapiHostImpl(
-    PluginModule* module,
-    const ppapi::PpapiPermissions& permissions)
-    : module_(module), dispatcher_(nullptr), is_external_plugin_host_(false) {
-  // Hook the host up to the in-process router.
-  in_process_router_ = std::make_unique<PepperInProcessRouter>(this);
-  ppapi_host_ = std::make_unique<ppapi::host::PpapiHost>(
-      in_process_router_->GetRendererToPluginSender(), permissions);
-  ppapi_host_->AddHostFactoryFilter(std::unique_ptr<ppapi::host::HostFactory>(
-      new ContentRendererPepperHostFactory(this)));
-  is_running_in_process_ = true;
-}
-
-RendererPpapiHostImpl::~RendererPpapiHostImpl() {
-  // Delete the host explicitly first. This shutdown will destroy the
-  // resources, which may want to do cleanup in their destructors and expect
-  // their pointers to us to be valid.
-  ppapi_host_.reset();
-}
-
-// static
-RendererPpapiHostImpl* RendererPpapiHostImpl::CreateOnModuleForOutOfProcess(
-    PluginModule* module,
-    ppapi::proxy::HostDispatcher* dispatcher,
-    const ppapi::PpapiPermissions& permissions) {
-  DCHECK(!module->renderer_ppapi_host());
-  RendererPpapiHostImpl* result =
-      new RendererPpapiHostImpl(module, dispatcher, permissions);
-
-  // Takes ownership of pointer.
-  module->SetRendererPpapiHost(std::unique_ptr<RendererPpapiHostImpl>(result));
-
-  return result;
-}
-
-// static
-RendererPpapiHostImpl* RendererPpapiHostImpl::CreateOnModuleForInProcess(
-    PluginModule* module,
-    const ppapi::PpapiPermissions& permissions) {
-  DCHECK(!module->renderer_ppapi_host());
-  RendererPpapiHostImpl* result =
-      new RendererPpapiHostImpl(module, permissions);
-
-  // Takes ownership of pointer.
-  module->SetRendererPpapiHost(std::unique_ptr<RendererPpapiHostImpl>(result));
-
-  return result;
-}
-
-// static
-RendererPpapiHostImpl* RendererPpapiHostImpl::GetForPPInstance(
-    PP_Instance pp_instance) {
-  PepperPluginInstanceImpl* instance =
-      HostGlobals::Get()->GetInstance(pp_instance);
-  if (!instance)
-    return nullptr;
-
-  // All modules created by content will have their embedder state be the
-  // host impl.
-  return instance->module()->renderer_ppapi_host();
-}
-
-std::unique_ptr<ppapi::thunk::ResourceCreationAPI>
-RendererPpapiHostImpl::CreateInProcessResourceCreationAPI(
-    PepperPluginInstanceImpl* instance) {
-  return std::unique_ptr<ppapi::thunk::ResourceCreationAPI>(
-      new PepperInProcessResourceCreation(this, instance));
-}
-
-PepperPluginInstanceImpl* RendererPpapiHostImpl::GetPluginInstanceImpl(
-    PP_Instance instance) const {
-  return GetAndValidateInstance(instance);
-}
-
-bool RendererPpapiHostImpl::IsExternalPluginHost() const {
-  return is_external_plugin_host_;
-}
-
-ppapi::host::PpapiHost* RendererPpapiHostImpl::GetPpapiHost() {
-  return ppapi_host_.get();
-}
-
-RenderFrame* RendererPpapiHostImpl::GetRenderFrameForInstance(
-    PP_Instance instance) {
-  PepperPluginInstanceImpl* instance_object = GetAndValidateInstance(instance);
-  if (!instance_object)
-    return nullptr;
-
-  // Since we're the embedder, we can make assumptions about the helper on
-  // the instance and get back to our RenderFrame.
-  return instance_object->render_frame();
-}
-
-bool RendererPpapiHostImpl::IsValidInstance(PP_Instance instance) {
-  return !!GetAndValidateInstance(instance);
-}
-
-PepperPluginInstance* RendererPpapiHostImpl::GetPluginInstance(
-    PP_Instance instance) {
-  return GetAndValidateInstance(instance);
-}
-
-blink::WebPluginContainer* RendererPpapiHostImpl::GetContainerForInstance(
-    PP_Instance instance) {
-  PepperPluginInstanceImpl* instance_object = GetAndValidateInstance(instance);
-  if (!instance_object)
-    return nullptr;
-  return instance_object->container();
-}
-
-bool RendererPpapiHostImpl::HasUserGesture(PP_Instance instance) {
-  PepperPluginInstanceImpl* instance_object = GetAndValidateInstance(instance);
-  if (!instance_object)
-    return false;
-
-  if (instance_object->module()->permissions().HasPermission(
-          ppapi::PERMISSION_BYPASS_USER_GESTURE))
-    return true;
-  return instance_object->HasTransientUserActivation();
-}
-
-int RendererPpapiHostImpl::GetRoutingIDForFrame(PP_Instance instance) {
-  PepperPluginInstanceImpl* plugin_instance = GetAndValidateInstance(instance);
-  if (!plugin_instance)
-    return 0;
-  return GetRenderFrameForInstance(instance)->GetRoutingID();
-}
-
-gfx::Point RendererPpapiHostImpl::PluginPointToRenderFrame(
-    PP_Instance instance,
-    const gfx::Point& pt) {
-  PepperPluginInstanceImpl* plugin_instance = GetAndValidateInstance(instance);
-  if (!plugin_instance)
-    return pt;
-  return gfx::Point((pt.x() + plugin_instance->view_data().rect.point.x) /
-                        viewport_to_dip_scale_,
-                    (pt.y() + plugin_instance->view_data().rect.point.y) /
-                        viewport_to_dip_scale_);
-}
-
-IPC::PlatformFileForTransit RendererPpapiHostImpl::ShareHandleWithRemote(
-    base::PlatformFile handle,
-    bool should_close_source) {
-  if (!dispatcher_) {
-    DCHECK(is_running_in_process_);
-    // Duplicate the file handle for in process mode so this function
-    // has the same semantics for both in process mode and out of
-    // process mode (i.e., the remote side must cloes the handle).
-    return IPC::GetPlatformFileForTransit(handle, should_close_source);
-  }
-  return dispatcher_->ShareHandleWithRemote(handle, should_close_source);
-}
-
-base::UnsafeSharedMemoryRegion
-RendererPpapiHostImpl::ShareUnsafeSharedMemoryRegionWithRemote(
-    const base::UnsafeSharedMemoryRegion& region) {
-  if (!dispatcher_) {
-    DCHECK(is_running_in_process_);
-    return region.Duplicate();
-  }
-  return dispatcher_->ShareUnsafeSharedMemoryRegionWithRemote(region);
-}
-
-base::ReadOnlySharedMemoryRegion
-RendererPpapiHostImpl::ShareReadOnlySharedMemoryRegionWithRemote(
-    const base::ReadOnlySharedMemoryRegion& region) {
-  if (!dispatcher_) {
-    DCHECK(is_running_in_process_);
-    return region.Duplicate();
-  }
-  return dispatcher_->ShareReadOnlySharedMemoryRegionWithRemote(region);
-}
-
-bool RendererPpapiHostImpl::IsRunningInProcess() {
-  return is_running_in_process_;
-}
-
-std::string RendererPpapiHostImpl::GetPluginName() {
-  return module_->name();
-}
-
-void RendererPpapiHostImpl::SetToExternalPluginHost() {
-  is_external_plugin_host_ = true;
-}
-
-void RendererPpapiHostImpl::CreateBrowserResourceHosts(
-    PP_Instance instance,
-    const std::vector<IPC::Message>& nested_msgs,
-    base::OnceCallback<void(const std::vector<int>&)> callback) {
-  RenderFrame* render_frame = GetRenderFrameForInstance(instance);
-  PepperBrowserConnection* browser_connection =
-      PepperBrowserConnection::Get(render_frame);
-  if (!browser_connection) {
-    base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE, base::BindOnce(std::move(callback),
-                                  std::vector<int>(nested_msgs.size(), 0)));
-  } else {
-    browser_connection->SendBrowserCreate(module_->GetPluginChildId(), instance,
-                                          nested_msgs, std::move(callback));
-  }
-}
-
-GURL RendererPpapiHostImpl::GetDocumentURL(PP_Instance pp_instance) {
-  PepperPluginInstanceImpl* instance = GetAndValidateInstance(pp_instance);
-  if (!instance)
-    return GURL();
-  return instance->document_url();
-}
-
-bool RendererPpapiHostImpl::IsSecureContext(PP_Instance pp_instance) const {
-  PepperPluginInstanceImpl* instance = GetAndValidateInstance(pp_instance);
-  if (!instance)
-    return false;
-  return instance->GetContainer()->GetDocument().IsSecureContext() &&
-         network::IsUrlPotentiallyTrustworthy(instance->GetPluginURL());
-}
-
-int RendererPpapiHostImpl::GetPluginChildId() const {
-  return module_->GetPluginChildId();
-}
-
-PepperPluginInstanceImpl* RendererPpapiHostImpl::GetAndValidateInstance(
-    PP_Instance pp_instance) const {
-  PepperPluginInstanceImpl* instance =
-      HostGlobals::Get()->GetInstance(pp_instance);
-  if (!instance)
-    return nullptr;
-  if (!instance->IsValidInstanceOf(module_))
-    return nullptr;
-  return instance;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/renderer_ppapi_host_impl.h b/content/renderer/pepper/renderer_ppapi_host_impl.h
deleted file mode 100644
index 7df92780..0000000
--- a/content/renderer/pepper/renderer_ppapi_host_impl.h
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_RENDERER_PPAPI_HOST_IMPL_H_
-#define CONTENT_RENDERER_PEPPER_RENDERER_PPAPI_HOST_IMPL_H_
-
-#include <memory>
-
-#include "base/memory/raw_ptr.h"
-#include "content/common/content_export.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/content_renderer_pepper_host_factory.h"
-#include "ppapi/host/ppapi_host.h"
-
-namespace ppapi {
-
-namespace proxy {
-class HostDispatcher;
-}
-
-namespace thunk {
-class ResourceCreationAPI;
-}
-
-}  // namespace ppapi
-
-namespace content {
-
-class PepperInProcessRouter;
-class PepperPluginInstanceImpl;
-class PluginModule;
-
-// This class is attached to a PluginModule which manages our lifetime.
-class RendererPpapiHostImpl : public RendererPpapiHost {
- public:
-  RendererPpapiHostImpl(const RendererPpapiHostImpl&) = delete;
-  RendererPpapiHostImpl& operator=(const RendererPpapiHostImpl&) = delete;
-
-  ~RendererPpapiHostImpl() override;
-
-  // Factory functions to create in process or out-of-process host impls. The
-  // host will be created and associated with the given module, which must not
-  // already have embedder state on it.
-  //
-  // The module will take ownership of the new host impl. The returned value
-  // does not pass ownership, it's just for the information of the caller.
-  static RendererPpapiHostImpl* CreateOnModuleForOutOfProcess(
-      PluginModule* module,
-      ppapi::proxy::HostDispatcher* dispatcher,
-      const ppapi::PpapiPermissions& permissions);
-  CONTENT_EXPORT static RendererPpapiHostImpl* CreateOnModuleForInProcess(
-      PluginModule* module,
-      const ppapi::PpapiPermissions& permissions);
-
-  // Returns the RendererPpapiHostImpl associated with the given PP_Instance,
-  // or NULL if the instance is invalid.
-  static RendererPpapiHostImpl* GetForPPInstance(PP_Instance pp_instance);
-
-  // Returns the router that we use for in-process IPC emulation (see the
-  // pepper_in_process_router.h for more). This will be NULL when the plugin
-  // is running out-of-process.
-  PepperInProcessRouter* in_process_router() {
-    return in_process_router_.get();
-  }
-
-  // Creates the in-process resource creation API wrapper for the given
-  // plugin instance. This object will reference the host impl, so the
-  // host impl should outlive the returned pointer. Since the resource
-  // creation object is associated with the instance, this will generally
-  // happen automatically.
-  std::unique_ptr<ppapi::thunk::ResourceCreationAPI>
-  CreateInProcessResourceCreationAPI(PepperPluginInstanceImpl* instance);
-
-  PepperPluginInstanceImpl* GetPluginInstanceImpl(PP_Instance instance) const;
-
-  bool IsExternalPluginHost() const;
-
-  // RendererPpapiHost implementation.
-  ppapi::host::PpapiHost* GetPpapiHost() override;
-  bool IsValidInstance(PP_Instance instance) override;
-  PepperPluginInstance* GetPluginInstance(PP_Instance instance) override;
-  RenderFrame* GetRenderFrameForInstance(PP_Instance instance) override;
-  blink::WebPluginContainer* GetContainerForInstance(
-      PP_Instance instance) override;
-  bool HasUserGesture(PP_Instance instance) override;
-  int GetRoutingIDForFrame(PP_Instance instance) override;
-  gfx::Point PluginPointToRenderFrame(PP_Instance instance,
-                                      const gfx::Point& pt) override;
-  IPC::PlatformFileForTransit ShareHandleWithRemote(
-      base::PlatformFile handle,
-      bool should_close_source) override;
-  base::UnsafeSharedMemoryRegion ShareUnsafeSharedMemoryRegionWithRemote(
-      const base::UnsafeSharedMemoryRegion& region) override;
-  base::ReadOnlySharedMemoryRegion ShareReadOnlySharedMemoryRegionWithRemote(
-      const base::ReadOnlySharedMemoryRegion& region) override;
-  bool IsRunningInProcess() override;
-  std::string GetPluginName() override;
-  void SetToExternalPluginHost() override;
-  void CreateBrowserResourceHosts(
-      PP_Instance instance,
-      const std::vector<IPC::Message>& nested_msgs,
-      base::OnceCallback<void(const std::vector<int>&)> callback) override;
-  GURL GetDocumentURL(PP_Instance pp_instance) override;
-
-  // Returns whether the plugin is running in a secure context.
-  bool IsSecureContext(PP_Instance pp_instance) const;
-
-  // Returns the plugin child process ID if the plugin is running out of
-  // process. Returns -1 otherwise. This is the ID that the browser process uses
-  // to idetify the child process for the plugin. This isn't directly useful
-  // from our process (the renderer) except in messages to the browser to
-  // disambiguate plugins.
-  int GetPluginChildId() const;
-
-  void set_viewport_to_dip_scale(float viewport_to_dip_scale) {
-    DCHECK_LT(0, viewport_to_dip_scale_);
-    viewport_to_dip_scale_ = viewport_to_dip_scale;
-  }
-
- private:
-  RendererPpapiHostImpl(PluginModule* module,
-                        ppapi::proxy::HostDispatcher* dispatcher,
-                        const ppapi::PpapiPermissions& permissions);
-  RendererPpapiHostImpl(PluginModule* module,
-                        const ppapi::PpapiPermissions& permissions);
-
-  // Retrieves the plugin instance object associated with the given PP_Instance
-  // and validates that it is one of the instances associated with our module.
-  // Returns NULL on failure.
-  //
-  // We use this to security check the PP_Instance values sent from a plugin to
-  // make sure it's not trying to spoof another instance.
-  PepperPluginInstanceImpl* GetAndValidateInstance(PP_Instance instance) const;
-
-  raw_ptr<PluginModule> module_;  // Non-owning pointer.
-
-  // The dispatcher we use to send messagse when the plugin is out-of-process.
-  // Will be null when running in-process. Non-owning pointer.
-  raw_ptr<ppapi::proxy::HostDispatcher> dispatcher_;
-
-  std::unique_ptr<ppapi::host::PpapiHost> ppapi_host_;
-
-  // Null when running out-of-process.
-  std::unique_ptr<PepperInProcessRouter> in_process_router_;
-
-  // Whether the plugin is running in process.
-  bool is_running_in_process_;
-
-  // Whether this is a host for external plugins.
-  bool is_external_plugin_host_;
-
-  // The scale between the viewport and dip.
-  float viewport_to_dip_scale_ = 1.0f;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_RENDERER_PPAPI_HOST_IMPL_H_
diff --git a/content/renderer/pepper/renderer_restrict_dispatch_group.h b/content/renderer/pepper/renderer_restrict_dispatch_group.h
deleted file mode 100644
index fd56e847..0000000
--- a/content/renderer/pepper/renderer_restrict_dispatch_group.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_RENDERER_RESTRICT_DISPATCH_GROUP_H_
-#define CONTENT_RENDERER_PEPPER_RENDERER_RESTRICT_DISPATCH_GROUP_H_
-
-#include "ipc/ipc_sync_channel.h"
-
-namespace content {
-
-// This represents all dispatch groups used in the renderer. Dispatch groups
-// allow channels to restrict in which case incoming messages can re-enter while
-// a synchronous message is sent on another channel. See
-// IPC::SyncChannel::SetRestrictDispatchChannelGroup.
-enum RendererRestrictDispatchGroup {
-  kRendererRestrictDispatchGroup_None =
-      IPC::SyncChannel::kRestrictDispatchGroup_None,
-  kRendererRestrictDispatchGroup_Pepper,
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_RENDERER_RESTRICT_DISPATCH_GROUP_H_
diff --git a/content/renderer/pepper/resource_converter.cc b/content/renderer/pepper/resource_converter.cc
deleted file mode 100644
index 83176aa..0000000
--- a/content/renderer/pepper/resource_converter.cc
+++ /dev/null
@@ -1,350 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/resource_converter.h"
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "base/functional/bind.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/pepper_file_system_host.h"
-#include "content/renderer/pepper/pepper_media_stream_audio_track_host.h"
-#include "content/renderer/pepper/pepper_media_stream_video_track_host.h"
-#include "ipc/ipc_message.h"
-#include "media/media_buildflags.h"
-#include "ppapi/host/ppapi_host.h"
-#include "ppapi/host/resource_host.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/shared_impl/resource_var.h"
-#include "ppapi/shared_impl/scoped_pp_var.h"
-#include "storage/common/file_system/file_system_util.h"
-#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_source.h"
-#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_track.h"
-#include "third_party/blink/public/platform/web_file_system_type.h"
-#include "third_party/blink/public/web/web_dom_file_system.h"
-#include "third_party/blink/public/web/web_dom_media_stream_track.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-#include "v8/include/v8-context.h"
-#include "v8/include/v8-object.h"
-
-using ppapi::ResourceVar;
-
-namespace content {
-namespace {
-
-void FlushComplete(
-    base::OnceCallback<void(bool)> callback,
-    const std::vector<scoped_refptr<content::HostResourceVar>>& browser_vars,
-    const std::vector<int>& pending_host_ids) {
-  CHECK(browser_vars.size() == pending_host_ids.size());
-  for (size_t i = 0; i < browser_vars.size(); ++i) {
-    browser_vars[i]->set_pending_browser_host_id(pending_host_ids[i]);
-  }
-  std::move(callback).Run(true);
-}
-
-PP_FileSystemType WebFileSystemTypeToPPAPI(blink::WebFileSystemType type) {
-  switch (type) {
-    case blink::WebFileSystemType::kWebFileSystemTypeTemporary:
-      return PP_FILESYSTEMTYPE_LOCALTEMPORARY;
-    case blink::WebFileSystemType::kWebFileSystemTypePersistent:
-      return PP_FILESYSTEMTYPE_LOCALPERSISTENT;
-    case blink::WebFileSystemType::kWebFileSystemTypeIsolated:
-      return PP_FILESYSTEMTYPE_ISOLATED;
-    case blink::WebFileSystemType::kWebFileSystemTypeExternal:
-      return PP_FILESYSTEMTYPE_EXTERNAL;
-    default:
-      NOTREACHED();
-  }
-}
-
-// Converts a storage::FileSystemType to a blink::WebFileSystemType.
-// Returns true on success, false if |type| does not correspond to a
-// WebFileSystemType.
-bool FileApiFileSystemTypeToWebFileSystemType(
-    storage::FileSystemType type,
-    blink::WebFileSystemType* result_type) {
-  switch (type) {
-    case storage::kFileSystemTypeTemporary:
-      *result_type = blink::kWebFileSystemTypeTemporary;
-      return true;
-    case storage::kFileSystemTypePersistent:
-      *result_type = blink::kWebFileSystemTypePersistent;
-      return true;
-    case storage::kFileSystemTypeIsolated:
-      *result_type = blink::kWebFileSystemTypeIsolated;
-      return true;
-    case storage::kFileSystemTypeExternal:
-      *result_type = blink::kWebFileSystemTypeExternal;
-      return true;
-    default:
-      return false;
-  }
-}
-
-// Given a V8 value containing a DOMFileSystem, creates a resource host and
-// returns the resource information for serialization.
-// On error, false.
-bool DOMFileSystemToResource(
-    PP_Instance instance,
-    RendererPpapiHost* host,
-    const blink::WebDOMFileSystem& dom_file_system,
-    int* pending_renderer_id,
-    std::unique_ptr<IPC::Message>* create_message,
-    std::unique_ptr<IPC::Message>* browser_host_create_message) {
-  DCHECK(!dom_file_system.IsNull());
-
-  PP_FileSystemType file_system_type =
-      WebFileSystemTypeToPPAPI(dom_file_system.GetType());
-  GURL root_url = dom_file_system.RootURL();
-
-  // Raw external file system access is not allowed, but external file system
-  // access through fileapi is allowed. (Without this check, there would be a
-  // CHECK failure in FileRefResource.)
-  if ((file_system_type == PP_FILESYSTEMTYPE_EXTERNAL) &&
-      (!root_url.is_valid())) {
-    return false;
-  }
-
-  *pending_renderer_id = host->GetPpapiHost()->AddPendingResourceHost(
-      std::unique_ptr<ppapi::host::ResourceHost>(new PepperFileSystemHost(
-          host, instance, 0, root_url, file_system_type)));
-  if (*pending_renderer_id == 0)
-    return false;
-
-  *create_message =
-      std::make_unique<PpapiPluginMsg_FileSystem_CreateFromPendingHost>(
-          file_system_type);
-
-  *browser_host_create_message =
-      std::make_unique<PpapiHostMsg_FileSystem_CreateFromRenderer>(
-          root_url.spec(), file_system_type);
-  return true;
-}
-
-bool ResourceHostToDOMFileSystem(
-    content::PepperFileSystemHost* file_system_host,
-    v8::Local<v8::Context> context,
-    v8::Local<v8::Value>* dom_file_system) {
-  GURL root_url = file_system_host->GetRootUrl();
-  GURL origin;
-  storage::FileSystemType type;
-  base::FilePath virtual_path;
-  storage::ParseFileSystemSchemeURL(root_url, &origin, &type, &virtual_path);
-
-  std::string name = storage::GetFileSystemName(origin, type);
-  blink::WebFileSystemType blink_type;
-  if (!FileApiFileSystemTypeToWebFileSystemType(type, &blink_type))
-    return false;
-  blink::WebLocalFrame* frame = blink::WebLocalFrame::FrameForContext(context);
-  blink::WebDOMFileSystem web_dom_file_system = blink::WebDOMFileSystem::Create(
-      frame, blink_type, blink::WebString::FromUTF8(name), root_url,
-      blink::WebDOMFileSystem::kSerializableTypeSerializable);
-  *dom_file_system = web_dom_file_system.ToV8Value(context->GetIsolate());
-  return true;
-}
-
-bool ResourceHostToDOMMediaStreamVideoTrack(
-    content::PepperMediaStreamVideoTrackHost* host,
-    v8::Local<v8::Context> context,
-    v8::Local<v8::Value>* dom_video_track) {
-  // TODO(ronghuawu): Implement this once crbug/352219 is resolved.
-  // blink::WebMediaStreamTrack track = host->track();
-  // *dom_video_track = track.toV8Value();
-  return false;
-}
-
-bool DOMMediaStreamTrackToResource(
-    PP_Instance instance,
-    RendererPpapiHost* host,
-    const blink::WebDOMMediaStreamTrack& dom_media_stream_track,
-    int* pending_renderer_id,
-    std::unique_ptr<IPC::Message>* create_message) {
-  DCHECK(!dom_media_stream_track.IsNull());
-  *pending_renderer_id = 0;
-  const blink::WebMediaStreamTrack track = dom_media_stream_track.Component();
-  const std::string id = track.Source().Id().Utf8();
-
-  if (track.Source().GetType() == blink::WebMediaStreamSource::kTypeVideo) {
-    *pending_renderer_id = host->GetPpapiHost()->AddPendingResourceHost(
-        std::unique_ptr<ppapi::host::ResourceHost>(
-            new PepperMediaStreamVideoTrackHost(host, instance, 0, track)));
-    if (*pending_renderer_id == 0)
-      return false;
-
-    *create_message = std::make_unique<
-        PpapiPluginMsg_MediaStreamVideoTrack_CreateFromPendingHost>(id);
-    return true;
-  } else if (track.Source().GetType() ==
-             blink::WebMediaStreamSource::kTypeAudio) {
-    *pending_renderer_id = host->GetPpapiHost()->AddPendingResourceHost(
-        std::unique_ptr<ppapi::host::ResourceHost>(
-            new PepperMediaStreamAudioTrackHost(host, instance, 0, track)));
-    if (*pending_renderer_id == 0)
-      return false;
-
-    *create_message = std::make_unique<
-        PpapiPluginMsg_MediaStreamAudioTrack_CreateFromPendingHost>(id);
-    return true;
-  }
-  return false;
-}
-
-}  // namespace
-
-ResourceConverter::~ResourceConverter() {}
-
-ResourceConverterImpl::ResourceConverterImpl(PP_Instance instance)
-    : instance_(instance) {}
-
-ResourceConverterImpl::~ResourceConverterImpl() {
-  // Verify Flush() was called.
-  DCHECK(browser_host_create_messages_.empty());
-  DCHECK(browser_vars_.empty());
-}
-
-bool ResourceConverterImpl::FromV8Value(v8::Local<v8::Object> val,
-                                        v8::Local<v8::Context> context,
-                                        PP_Var* result,
-                                        bool* was_resource) {
-  v8::Context::Scope context_scope(context);
-  v8::HandleScope handle_scope(context->GetIsolate());
-  RendererPpapiHost* host = RendererPpapiHost::GetForPPInstance(instance_);
-
-  *was_resource = false;
-
-  blink::WebDOMFileSystem dom_file_system =
-      blink::WebDOMFileSystem::FromV8Value(context->GetIsolate(), val);
-  if (!dom_file_system.IsNull()) {
-    int pending_renderer_id;
-    std::unique_ptr<IPC::Message> create_message;
-    std::unique_ptr<IPC::Message> browser_host_create_message;
-    if (!DOMFileSystemToResource(instance_,
-                                 host,
-                                 dom_file_system,
-                                 &pending_renderer_id,
-                                 &create_message,
-                                 &browser_host_create_message)) {
-      return false;
-    }
-    DCHECK(create_message);
-    DCHECK(browser_host_create_message);
-    scoped_refptr<HostResourceVar> result_var =
-        CreateResourceVarWithBrowserHost(
-            pending_renderer_id, *create_message, *browser_host_create_message);
-    *result = result_var->GetPPVar();
-    *was_resource = true;
-    return true;
-  }
-
-  blink::WebDOMMediaStreamTrack dom_media_stream_track =
-      blink::WebDOMMediaStreamTrack::FromV8Value(context->GetIsolate(), val);
-  if (!dom_media_stream_track.IsNull()) {
-    int pending_renderer_id;
-    std::unique_ptr<IPC::Message> create_message;
-    if (!DOMMediaStreamTrackToResource(instance_,
-                                       host,
-                                       dom_media_stream_track,
-                                       &pending_renderer_id,
-                                       &create_message)) {
-      return false;
-    }
-    DCHECK(create_message);
-    scoped_refptr<HostResourceVar> result_var =
-        CreateResourceVar(pending_renderer_id, *create_message);
-    *result = result_var->GetPPVar();
-    *was_resource = true;
-    return true;
-  }
-
-  // The value was not convertible to a resource. Return true with
-  // |was_resource| set to false. As per the interface of FromV8Value, |result|
-  // may be left unmodified in this case.
-  return true;
-}
-
-void ResourceConverterImpl::Reset() {
-  browser_host_create_messages_.clear();
-  browser_vars_.clear();
-}
-
-bool ResourceConverterImpl::NeedsFlush() {
-  return !browser_host_create_messages_.empty();
-}
-
-void ResourceConverterImpl::Flush(base::OnceCallback<void(bool)> callback) {
-  RendererPpapiHost::GetForPPInstance(instance_)->CreateBrowserResourceHosts(
-      instance_, browser_host_create_messages_,
-      base::BindOnce(&FlushComplete, std::move(callback), browser_vars_));
-  browser_host_create_messages_.clear();
-  browser_vars_.clear();
-}
-
-bool ResourceConverterImpl::ToV8Value(const PP_Var& var,
-                                      v8::Local<v8::Context> context,
-                                      v8::Local<v8::Value>* result) {
-  DCHECK(var.type == PP_VARTYPE_RESOURCE);
-
-  ResourceVar* resource = ResourceVar::FromPPVar(var);
-  if (!resource) {
-    NOTREACHED();
-  }
-  PP_Resource resource_id = resource->GetPPResource();
-
-  // Get the renderer-side resource host for this resource.
-  content::RendererPpapiHost* renderer_ppapi_host =
-      content::RendererPpapiHost::GetForPPInstance(instance_);
-  if (!renderer_ppapi_host) {
-    // This should never happen: the RendererPpapiHost is owned by the module
-    // and should outlive instances associated with it. However, if it doesn't
-    // for some reason, we do not want to crash.
-    NOTREACHED();
-  }
-  ::ppapi::host::PpapiHost* ppapi_host = renderer_ppapi_host->GetPpapiHost();
-  ::ppapi::host::ResourceHost* resource_host =
-      ppapi_host->GetResourceHost(resource_id);
-  if (resource_host == nullptr) {
-    LOG(ERROR) << "No resource host for resource #" << resource_id;
-    return false;
-  }
-
-  // Convert to the appropriate type of resource host.
-  if (resource_host->IsFileSystemHost()) {
-    return ResourceHostToDOMFileSystem(
-        static_cast<content::PepperFileSystemHost*>(resource_host),
-        context,
-        result);
-  } else if (resource_host->IsMediaStreamVideoTrackHost()) {
-    return ResourceHostToDOMMediaStreamVideoTrack(
-        static_cast<content::PepperMediaStreamVideoTrackHost*>(resource_host),
-        context,
-        result);
-  } else {
-    LOG(ERROR) << "The type of resource #" << resource_id
-               << " cannot be converted to a JavaScript object.";
-    return false;
-  }
-}
-
-scoped_refptr<HostResourceVar> ResourceConverterImpl::CreateResourceVar(
-    int pending_renderer_id,
-    const IPC::Message& create_message) {
-  return new HostResourceVar(pending_renderer_id, create_message);
-}
-
-scoped_refptr<HostResourceVar>
-ResourceConverterImpl::CreateResourceVarWithBrowserHost(
-    int pending_renderer_id,
-    const IPC::Message& create_message,
-    const IPC::Message& browser_host_create_message) {
-  scoped_refptr<HostResourceVar> result =
-      CreateResourceVar(pending_renderer_id, create_message);
-  browser_host_create_messages_.push_back(browser_host_create_message);
-  browser_vars_.push_back(result);
-  return result;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/resource_converter.h b/content/renderer/pepper/resource_converter.h
deleted file mode 100644
index 01d2cde7..0000000
--- a/content/renderer/pepper/resource_converter.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_RESOURCE_CONVERTER_H_
-#define CONTENT_RENDERER_PEPPER_RESOURCE_CONVERTER_H_
-
-#include <vector>
-
-#include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
-#include "content/common/content_export.h"
-#include "content/renderer/pepper/host_resource_var.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/c/pp_var.h"
-#include "v8/include/v8-forward.h"
-
-namespace IPC {
-class Message;
-}
-
-namespace content {
-
-// This class is responsible for converting V8 vars to Pepper resources.
-class CONTENT_EXPORT ResourceConverter {
- public:
-  virtual ~ResourceConverter();
-
-  // Reset the state of the resource converter.
-  virtual void Reset() = 0;
-
-  // Returns true if Flush() needs to be called before using any vars created
-  // by the resource converter.
-  virtual bool NeedsFlush() = 0;
-
-  // If NeedsFlush() is true then Flush() must be called before any vars created
-  // by the ResourceConverter are valid. It handles creating any resource hosts
-  // that need to be created. |callback| will always be called asynchronously.
-  virtual void Flush(base::OnceCallback<void(bool)> callback) = 0;
-
-  // Attempts to convert a V8 object to a PP_Var with type PP_VARTYPE_RESOURCE.
-  // On success, writes the resulting var to |result|, sets |was_resource| to
-  // true and returns true. If |val| is not a resource, sets |was_resource| to
-  // false and returns true. If an error occurs, returns false.
-  virtual bool FromV8Value(v8::Local<v8::Object> val,
-                           v8::Local<v8::Context> context,
-                           PP_Var* result,
-                           bool* was_resource) = 0;
-
-  // Attempts to convert a PP_Var to a V8 object. |var| must have type
-  // PP_VARTYPE_RESOURCE. On success, writes the resulting value to |result| and
-  // returns true. If an error occurs, returns false.
-  virtual bool ToV8Value(const PP_Var& var,
-                         v8::Local<v8::Context> context,
-                         v8::Local<v8::Value>* result) = 0;
-};
-
-class ResourceConverterImpl : public ResourceConverter {
- public:
-  explicit ResourceConverterImpl(PP_Instance instance);
-
-  ResourceConverterImpl(const ResourceConverterImpl&) = delete;
-  ResourceConverterImpl& operator=(const ResourceConverterImpl&) = delete;
-
-  ~ResourceConverterImpl() override;
-
-  // ResourceConverter overrides.
-  void Reset() override;
-  bool NeedsFlush() override;
-  void Flush(base::OnceCallback<void(bool)> callback) override;
-  bool FromV8Value(v8::Local<v8::Object> val,
-                   v8::Local<v8::Context> context,
-                   PP_Var* result,
-                   bool* was_resource) override;
-  bool ToV8Value(const PP_Var& var,
-                 v8::Local<v8::Context> context,
-                 v8::Local<v8::Value>* result) override;
-
- private:
-  // Creates a resource var with the given |pending_renderer_id| and
-  // |create_message| to be sent to the plugin.
-  scoped_refptr<HostResourceVar> CreateResourceVar(
-      int pending_renderer_id,
-      const IPC::Message& create_message);
-  // Creates a resource var with the given |pending_renderer_id| and
-  // |create_message| to be sent to the plugin. Also sends
-  // |browser_host_create_message| to the browser, and asynchronously stores the
-  // resulting browser host ID in the newly created var.
-  scoped_refptr<HostResourceVar> CreateResourceVarWithBrowserHost(
-      int pending_renderer_id,
-      const IPC::Message& create_message,
-      const IPC::Message& browser_host_create_message);
-
-  // The instance this ResourceConverter is associated with.
-  PP_Instance instance_;
-
-  // A list of the messages to create the browser hosts. This is a parallel
-  // array to |browser_vars|. It is kept as a parallel array so that it can be
-  // conveniently passed to |CreateBrowserResourceHosts|.
-  std::vector<IPC::Message> browser_host_create_messages_;
-  // A list of the resource vars associated with browser hosts.
-  std::vector<scoped_refptr<HostResourceVar> > browser_vars_;
-};
-
-}  // namespace content
-#endif  // CONTENT_RENDERER_PEPPER_RESOURCE_CONVERTER_H_
diff --git a/content/renderer/pepper/resource_creation_impl.cc b/content/renderer/pepper/resource_creation_impl.cc
deleted file mode 100644
index 7ec35f4..0000000
--- a/content/renderer/pepper/resource_creation_impl.cc
+++ /dev/null
@@ -1,324 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/resource_creation_impl.h"
-
-#include "base/metrics/histogram_functions.h"
-#include "build/build_config.h"
-#include "content/renderer/pepper/ppb_audio_impl.h"
-#include "content/renderer/pepper/ppb_buffer_impl.h"
-#include "content/renderer/pepper/ppb_graphics_3d_impl.h"
-#include "content/renderer/pepper/ppb_image_data_impl.h"
-#include "ppapi/c/pp_bool.h"
-#include "ppapi/c/pp_size.h"
-#include "ppapi/c/pp_var.h"
-#include "ppapi/shared_impl/ppb_audio_config_shared.h"
-#include "ppapi/shared_impl/ppb_audio_shared.h"
-#include "ppapi/shared_impl/ppb_image_data_shared.h"
-#include "ppapi/shared_impl/ppb_input_event_shared.h"
-#include "ppapi/shared_impl/var.h"
-
-#if BUILDFLAG(IS_WIN)
-#include "base/command_line.h"
-#endif
-
-using ppapi::InputEventData;
-using ppapi::PPB_InputEvent_Shared;
-using ppapi::StringVar;
-
-namespace content {
-
-ResourceCreationImpl::ResourceCreationImpl(PepperPluginInstanceImpl* instance) {
-}
-
-ResourceCreationImpl::~ResourceCreationImpl() {}
-
-PP_Resource ResourceCreationImpl::CreateAudio1_0(
-    PP_Instance instance,
-    PP_Resource config_id,
-    PPB_Audio_Callback_1_0 audio_callback,
-    void* user_data) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateAudio(PP_Instance instance,
-                                              PP_Resource config_id,
-                                              PPB_Audio_Callback audio_callback,
-                                              void* user_data) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateAudioConfig(
-    PP_Instance instance,
-    PP_AudioSampleRate sample_rate,
-    uint32_t sample_frame_count) {
-  return ppapi::PPB_AudioConfig_Shared::Create(
-      ppapi::OBJECT_IS_IMPL, instance, sample_rate, sample_frame_count);
-}
-
-PP_Resource ResourceCreationImpl::CreateAudioTrusted(PP_Instance instance) {
-  return (new PPB_Audio_Impl(instance))->GetReference();
-}
-
-PP_Resource ResourceCreationImpl::CreateAudioInput(PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateAudioOutput(PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateBuffer(PP_Instance instance,
-                                               uint32_t size) {
-  return PPB_Buffer_Impl::Create(instance, size);
-}
-
-PP_Resource ResourceCreationImpl::CreateCameraDevicePrivate(
-    PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateGraphics3D(PP_Instance instance,
-                                                   PP_Resource share_context,
-                                                   const int32_t* attrib_list) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateGraphics3DRaw(
-    PP_Instance instance,
-    PP_Resource share_context,
-    const ppapi::Graphics3DContextAttribs& context_attribs,
-    gpu::Capabilities* capabilities,
-    gpu::GLCapabilities* gl_capabilities,
-    const base::UnsafeSharedMemoryRegion** shared_state,
-    gpu::CommandBufferId* command_buffer_id) {
-  return PPB_Graphics3D_Impl::CreateRaw(
-      instance, share_context, context_attribs, capabilities, gl_capabilities,
-      shared_state, command_buffer_id);
-}
-
-PP_Resource ResourceCreationImpl::CreateHostResolver(PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateHostResolverPrivate(
-    PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateImageData(PP_Instance instance,
-                                                  PP_ImageDataFormat format,
-                                                  const PP_Size* size,
-                                                  PP_Bool init_to_zero) {
-#if BUILDFLAG(IS_WIN)
-  // We use the SIMPLE image data type as the PLATFORM image data type
-  // calls GDI functions to create DIB sections etc which fail in Win32K
-  // lockdown mode.
-  return CreateImageDataSimple(instance, format, size, init_to_zero);
-#else
-  return PPB_ImageData_Impl::Create(instance,
-                                    ppapi::PPB_ImageData_Shared::PLATFORM,
-                                    format,
-                                    *size,
-                                    init_to_zero);
-#endif
-}
-
-PP_Resource ResourceCreationImpl::CreateImageDataSimple(
-    PP_Instance instance,
-    PP_ImageDataFormat format,
-    const PP_Size* size,
-    PP_Bool init_to_zero) {
-  return PPB_ImageData_Impl::Create(instance,
-                                    ppapi::PPB_ImageData_Shared::SIMPLE,
-                                    format,
-                                    *size,
-                                    init_to_zero);
-}
-
-PP_Resource ResourceCreationImpl::CreateIMEInputEvent(
-    PP_Instance instance,
-    PP_InputEvent_Type type,
-    PP_TimeTicks time_stamp,
-    struct PP_Var text,
-    uint32_t segment_number,
-    const uint32_t* segment_offsets,
-    int32_t target_segment,
-    uint32_t selection_start,
-    uint32_t selection_end) {
-  return PPB_InputEvent_Shared::CreateIMEInputEvent(ppapi::OBJECT_IS_IMPL,
-                                                    instance,
-                                                    type,
-                                                    time_stamp,
-                                                    text,
-                                                    segment_number,
-                                                    segment_offsets,
-                                                    target_segment,
-                                                    selection_start,
-                                                    selection_end);
-}
-
-PP_Resource ResourceCreationImpl::CreateKeyboardInputEvent_1_0(
-    PP_Instance instance,
-    PP_InputEvent_Type type,
-    PP_TimeTicks time_stamp,
-    uint32_t modifiers,
-    uint32_t key_code,
-    struct PP_Var character_text) {
-  PP_Var code = StringVar::StringToPPVar("");
-  return PPB_InputEvent_Shared::CreateKeyboardInputEvent(ppapi::OBJECT_IS_IMPL,
-                                                         instance,
-                                                         type,
-                                                         time_stamp,
-                                                         modifiers,
-                                                         key_code,
-                                                         character_text,
-                                                         code);
-}
-
-PP_Resource ResourceCreationImpl::CreateKeyboardInputEvent_1_2(
-    PP_Instance instance,
-    PP_InputEvent_Type type,
-    PP_TimeTicks time_stamp,
-    uint32_t modifiers,
-    uint32_t key_code,
-    struct PP_Var character_text,
-    struct PP_Var code) {
-  return PPB_InputEvent_Shared::CreateKeyboardInputEvent(ppapi::OBJECT_IS_IMPL,
-                                                         instance,
-                                                         type,
-                                                         time_stamp,
-                                                         modifiers,
-                                                         key_code,
-                                                         character_text,
-                                                         code);
-}
-
-PP_Resource ResourceCreationImpl::CreateMediaStreamVideoTrack(
-    PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateMouseInputEvent(
-    PP_Instance instance,
-    PP_InputEvent_Type type,
-    PP_TimeTicks time_stamp,
-    uint32_t modifiers,
-    PP_InputEvent_MouseButton mouse_button,
-    const PP_Point* mouse_position,
-    int32_t click_count,
-    const PP_Point* mouse_movement) {
-  return PPB_InputEvent_Shared::CreateMouseInputEvent(ppapi::OBJECT_IS_IMPL,
-                                                      instance,
-                                                      type,
-                                                      time_stamp,
-                                                      modifiers,
-                                                      mouse_button,
-                                                      mouse_position,
-                                                      click_count,
-                                                      mouse_movement);
-}
-
-PP_Resource ResourceCreationImpl::CreateNetAddressFromIPv4Address(
-    PP_Instance instance,
-    const PP_NetAddress_IPv4* ipv4_addr) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateNetAddressFromIPv6Address(
-    PP_Instance instance,
-    const PP_NetAddress_IPv6* ipv6_addr) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateNetAddressFromNetAddressPrivate(
-    PP_Instance instance,
-    const PP_NetAddress_Private& private_addr) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateNetworkMonitor(PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateTCPServerSocketPrivate(
-    PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateTCPSocket1_0(PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateTCPSocket(PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateTCPSocketPrivate(PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateTouchInputEvent(PP_Instance instance,
-                                                        PP_InputEvent_Type type,
-                                                        PP_TimeTicks time_stamp,
-                                                        uint32_t modifiers) {
-  return PPB_InputEvent_Shared::CreateTouchInputEvent(
-      ppapi::OBJECT_IS_IMPL, instance, type, time_stamp, modifiers);
-}
-
-PP_Resource ResourceCreationImpl::CreateUDPSocket(PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateUDPSocketPrivate(PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateVideoCapture(PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateVideoDecoder(PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateVideoDecoderDev(
-    PP_Instance instance,
-    PP_Resource graphics3d_id,
-    PP_VideoDecoder_Profile profile) {
-  // This API is no longer supported: See crbug.com/1382469 for details and
-  // history.
-  return 0;
-}
-
-PP_Resource ResourceCreationImpl::CreateVideoEncoder(PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateVpnProvider(PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-PP_Resource ResourceCreationImpl::CreateWheelInputEvent(
-    PP_Instance instance,
-    PP_TimeTicks time_stamp,
-    uint32_t modifiers,
-    const PP_FloatPoint* wheel_delta,
-    const PP_FloatPoint* wheel_ticks,
-    PP_Bool scroll_by_page) {
-  return PPB_InputEvent_Shared::CreateWheelInputEvent(ppapi::OBJECT_IS_IMPL,
-                                                      instance,
-                                                      time_stamp,
-                                                      modifiers,
-                                                      wheel_delta,
-                                                      wheel_ticks,
-                                                      scroll_by_page);
-}
-
-PP_Resource ResourceCreationImpl::CreateX509CertificatePrivate(
-    PP_Instance instance) {
-  return 0;  // Not supported in-process.
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/resource_creation_impl.h b/content/renderer/pepper/resource_creation_impl.h
deleted file mode 100644
index 4cef8a5c..0000000
--- a/content/renderer/pepper/resource_creation_impl.h
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_RESOURCE_CREATION_IMPL_H_
-#define CONTENT_RENDERER_PEPPER_RESOURCE_CREATION_IMPL_H_
-
-#include <stdint.h>
-
-#include "base/functional/callback.h"
-#include "content/common/content_export.h"
-#include "ppapi/thunk/resource_creation_api.h"
-
-namespace content {
-
-class PepperPluginInstanceImpl;
-
-// This is an abstract class.  ResourceCreationAPI functions that implement
-// "old-style" resources are handled here. See
-// content/renderer/pepper/pepper_in_process_resource_creation.h for functions
-// that implement "new-style" resources.
-class CONTENT_EXPORT ResourceCreationImpl
-    : public ppapi::thunk::ResourceCreationAPI {
- public:
-  explicit ResourceCreationImpl(PepperPluginInstanceImpl* instance);
-
-  ResourceCreationImpl(const ResourceCreationImpl&) = delete;
-  ResourceCreationImpl& operator=(const ResourceCreationImpl&) = delete;
-
-  ~ResourceCreationImpl() override;
-
-  // ResourceCreationAPI implementation.
-  PP_Resource CreateAudio1_0(PP_Instance instance,
-                             PP_Resource config_id,
-                             PPB_Audio_Callback_1_0 audio_callback,
-                             void* user_data) override;
-  PP_Resource CreateAudio(PP_Instance instance,
-                          PP_Resource config_id,
-                          PPB_Audio_Callback audio_callback,
-                          void* user_data) override;
-  PP_Resource CreateAudioTrusted(PP_Instance instance) override;
-  PP_Resource CreateAudioConfig(PP_Instance instance,
-                                PP_AudioSampleRate sample_rate,
-                                uint32_t sample_frame_count) override;
-  PP_Resource CreateAudioInput(PP_Instance instance) override;
-  PP_Resource CreateAudioOutput(PP_Instance instance) override;
-  PP_Resource CreateBuffer(PP_Instance instance, uint32_t size) override;
-  PP_Resource CreateCameraDevicePrivate(PP_Instance instance) override;
-  PP_Resource CreateGraphics3D(PP_Instance instance,
-                               PP_Resource share_context,
-                               const int32_t* attrib_list) override;
-  PP_Resource CreateGraphics3DRaw(
-      PP_Instance instance,
-      PP_Resource share_context,
-      const ppapi::Graphics3DContextAttribs& context_attribs,
-      gpu::Capabilities* capabilities,
-      gpu::GLCapabilities* gl_capabilities,
-      const base::UnsafeSharedMemoryRegion** shared_state,
-      gpu::CommandBufferId* command_buffer_id) override;
-  PP_Resource CreateHostResolver(PP_Instance instance) override;
-  PP_Resource CreateHostResolverPrivate(PP_Instance instance) override;
-  PP_Resource CreateImageData(PP_Instance instance,
-                              PP_ImageDataFormat format,
-                              const PP_Size* size,
-                              PP_Bool init_to_zero) override;
-  PP_Resource CreateImageDataSimple(PP_Instance instance,
-                                    PP_ImageDataFormat format,
-                                    const PP_Size* size,
-                                    PP_Bool init_to_zero) override;
-  PP_Resource CreateIMEInputEvent(PP_Instance instance,
-                                  PP_InputEvent_Type type,
-                                  PP_TimeTicks time_stamp,
-                                  struct PP_Var text,
-                                  uint32_t segment_number,
-                                  const uint32_t* segment_offsets,
-                                  int32_t target_segment,
-                                  uint32_t selection_start,
-                                  uint32_t selection_end) override;
-  PP_Resource CreateKeyboardInputEvent_1_0(PP_Instance instance,
-                                           PP_InputEvent_Type type,
-                                           PP_TimeTicks time_stamp,
-                                           uint32_t modifiers,
-                                           uint32_t key_code,
-                                           PP_Var character_text) override;
-  PP_Resource CreateKeyboardInputEvent_1_2(PP_Instance instance,
-                                           PP_InputEvent_Type type,
-                                           PP_TimeTicks time_stamp,
-                                           uint32_t modifiers,
-                                           uint32_t key_code,
-                                           PP_Var character_text,
-                                           PP_Var code) override;
-  PP_Resource CreateMediaStreamVideoTrack(PP_Instance instance) override;
-  PP_Resource CreateMouseInputEvent(PP_Instance instance,
-                                    PP_InputEvent_Type type,
-                                    PP_TimeTicks time_stamp,
-                                    uint32_t modifiers,
-                                    PP_InputEvent_MouseButton mouse_button,
-                                    const PP_Point* mouse_position,
-                                    int32_t click_count,
-                                    const PP_Point* mouse_movement) override;
-  PP_Resource CreateNetAddressFromIPv4Address(
-      PP_Instance instance,
-      const PP_NetAddress_IPv4* ipv4_addr) override;
-  PP_Resource CreateNetAddressFromIPv6Address(
-      PP_Instance instance,
-      const PP_NetAddress_IPv6* ipv6_addr) override;
-  PP_Resource CreateNetAddressFromNetAddressPrivate(
-      PP_Instance instance,
-      const PP_NetAddress_Private& private_addr) override;
-  PP_Resource CreateNetworkMonitor(PP_Instance instance) override;
-  PP_Resource CreateTCPServerSocketPrivate(PP_Instance instance) override;
-  PP_Resource CreateTCPSocket1_0(PP_Instance instance) override;
-  PP_Resource CreateTCPSocket(PP_Instance instance) override;
-  PP_Resource CreateTCPSocketPrivate(PP_Instance instance) override;
-  PP_Resource CreateTouchInputEvent(PP_Instance instance,
-                                    PP_InputEvent_Type type,
-                                    PP_TimeTicks time_stamp,
-                                    uint32_t modifiers) override;
-  PP_Resource CreateUDPSocket(PP_Instance instance) override;
-  PP_Resource CreateUDPSocketPrivate(PP_Instance instance) override;
-  PP_Resource CreateVideoCapture(PP_Instance instance) override;
-  PP_Resource CreateVideoDecoder(PP_Instance instance) override;
-  PP_Resource CreateVideoDecoderDev(PP_Instance instance,
-                                    PP_Resource graphics3d_id,
-                                    PP_VideoDecoder_Profile profile) override;
-  PP_Resource CreateVideoEncoder(PP_Instance instance) override;
-  PP_Resource CreateVpnProvider(PP_Instance instance) override;
-  PP_Resource CreateWheelInputEvent(PP_Instance instance,
-                                    PP_TimeTicks time_stamp,
-                                    uint32_t modifiers,
-                                    const PP_FloatPoint* wheel_delta,
-                                    const PP_FloatPoint* wheel_ticks,
-                                    PP_Bool scroll_by_page) override;
-  PP_Resource CreateX509CertificatePrivate(PP_Instance instance) override;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_RESOURCE_CREATION_IMPL_H_
diff --git a/content/renderer/pepper/url_request_info_util.cc b/content/renderer/pepper/url_request_info_util.cc
deleted file mode 100644
index 5b4fb38..0000000
--- a/content/renderer/pepper/url_request_info_util.cc
+++ /dev/null
@@ -1,284 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/url_request_info_util.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/check.h"
-#include "base/containers/span.h"
-#include "base/notreached.h"
-#include "base/strings/string_util.h"
-#include "base/time/time.h"
-#include "content/public/renderer/render_frame.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/pepper_file_ref_renderer_host.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "content/renderer/pepper/plugin_module.h"
-#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "net/http/http_util.h"
-#include "ppapi/c/pp_bool.h"
-#include "ppapi/c/pp_var.h"
-#include "ppapi/proxy/ppapi_messages.h"
-#include "ppapi/shared_impl/url_request_info_data.h"
-#include "ppapi/shared_impl/var.h"
-#include "ppapi/thunk/enter.h"
-#include "third_party/blink/public/mojom/filesystem/file_system.mojom.h"
-#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h"
-#include "third_party/blink/public/platform/browser_interface_broker_proxy.h"
-#include "third_party/blink/public/platform/file_path_conversion.h"
-#include "third_party/blink/public/platform/web_data.h"
-#include "third_party/blink/public/platform/web_http_body.h"
-#include "third_party/blink/public/platform/web_url.h"
-#include "third_party/blink/public/platform/web_url_request.h"
-#include "third_party/blink/public/platform/web_url_request_extra_data.h"
-#include "third_party/blink/public/web/web_document.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-#include "url/gurl.h"
-#include "url/url_util.h"
-
-using ppapi::Resource;
-using ppapi::URLRequestInfoData;
-using ppapi::thunk::EnterResourceNoLock;
-using blink::WebData;
-using blink::WebHTTPBody;
-using blink::WebString;
-using blink::WebLocalFrame;
-using blink::WebURL;
-using blink::WebURLRequest;
-
-namespace content {
-
-namespace {
-
-mojo::Remote<blink::mojom::FileSystemManager> GetFileSystemManager(
-    RendererPpapiHost* renderer_ppapi_host,
-    PP_Instance instance) {
-  mojo::Remote<blink::mojom::FileSystemManager> file_system_manager;
-  RenderFrame* frame = renderer_ppapi_host->GetRenderFrameForInstance(instance);
-  if (frame)
-    frame->GetBrowserInterfaceBroker().GetInterface(
-        file_system_manager.BindNewPipeAndPassReceiver());
-  return file_system_manager;
-}
-
-// Appends the file ref given the Resource pointer associated with it to the
-// given HTTP body, returning true on success.
-bool AppendFileRefToBody(PP_Instance instance,
-                         PP_Resource resource,
-                         int64_t start_offset,
-                         int64_t number_of_bytes,
-                         PP_Time expected_last_modified_time,
-                         WebHTTPBody* http_body) {
-  base::FilePath platform_path;
-  PepperPluginInstanceImpl* instance_impl =
-      HostGlobals::Get()->GetInstance(instance);
-  if (!instance_impl)
-    return false;
-
-  RendererPpapiHost* renderer_ppapi_host =
-      instance_impl->module()->renderer_ppapi_host();
-  if (!renderer_ppapi_host)
-    return false;
-  ppapi::host::ResourceHost* resource_host =
-      renderer_ppapi_host->GetPpapiHost()->GetResourceHost(resource);
-  if (!resource_host || !resource_host->IsFileRefHost())
-    return false;
-
-  mojo::Remote<blink::mojom::FileSystemManager> file_system_manager =
-      GetFileSystemManager(renderer_ppapi_host, instance);
-  CHECK(file_system_manager)
-      << "No FileSystemManager exists for this PepperPluginInstance";
-
-  PepperFileRefRendererHost* file_ref_host =
-      static_cast<PepperFileRefRendererHost*>(resource_host);
-  switch (file_ref_host->GetFileSystemType()) {
-    case PP_FILESYSTEMTYPE_LOCALTEMPORARY:
-    case PP_FILESYSTEMTYPE_LOCALPERSISTENT:
-      // TODO(kinuko): remove this sync IPC when we fully support
-      // AppendURLRange for FileSystem URL.
-      file_system_manager->GetPlatformPath(file_ref_host->GetFileSystemURL(),
-                                           &platform_path);
-      break;
-    case PP_FILESYSTEMTYPE_EXTERNAL:
-      platform_path = file_ref_host->GetExternalFilePath();
-      break;
-    default:
-      NOTREACHED();
-  }
-  std::optional<base::Time> optional_modified_time;
-  if (expected_last_modified_time != 0)
-    optional_modified_time =
-        base::Time::FromSecondsSinceUnixEpoch(expected_last_modified_time);
-  http_body->AppendFileRange(blink::FilePathToWebString(platform_path),
-                             start_offset, number_of_bytes,
-                             optional_modified_time);
-  return true;
-}
-
-// Checks that the request data is valid. Returns false on failure. Note that
-// method and header validation is done by the URL loader when the request is
-// opened, and any access errors are returned asynchronously.
-bool ValidateURLRequestData(const URLRequestInfoData& data) {
-  if (data.prefetch_buffer_lower_threshold < 0 ||
-      data.prefetch_buffer_upper_threshold < 0 ||
-      data.prefetch_buffer_upper_threshold <=
-          data.prefetch_buffer_lower_threshold) {
-    return false;
-  }
-  return true;
-}
-
-std::string FilterStringForXRequestedWithValue(const std::string& s) {
-  std::string rv;
-  rv.reserve(s.length());
-  for (size_t i = 0; i < s.length(); i++) {
-    char c = s[i];
-    // Allow ASCII digits, letters, periods, commas, and underscores. (Ignore
-    // all other characters.)
-    if (base::IsAsciiDigit(c) || base::IsAsciiAlpha(c) || (c == '.') ||
-        (c == ',') || (c == '_'))
-      rv.push_back(c);
-  }
-  return rv;
-}
-
-// Returns an appropriate value for the X-Requested-With header for plugins that
-// present an X-Requested-With header. Returns a blank string for other plugins.
-// We produce a user-agent-like string (eating spaces and other undesired
-// characters) like "ShockwaveFlash/11.5.31.135" from the plugin name and
-// version.
-std::string MakeXRequestedWithValue(const std::string& name,
-                                    const std::string& version) {
-  std::string rv = FilterStringForXRequestedWithValue(name);
-  if (rv.empty())
-    return std::string();
-
-  // Apply to test plugins only.
-  if (rv != "PPAPITests")
-    return std::string();
-
-  std::string filtered_version = FilterStringForXRequestedWithValue(version);
-  if (!filtered_version.empty())
-    rv += "/" + filtered_version;
-
-  return rv;
-}
-
-}  // namespace
-
-bool CreateWebURLRequest(PP_Instance instance,
-                         URLRequestInfoData* data,
-                         WebLocalFrame* frame,
-                         WebURLRequest* dest) {
-  // In the out-of-process case, we've received the URLRequestInfoData
-  // from the untrusted plugin and done no validation on it. We need to be
-  // sure it's not being malicious by checking everything for consistency.
-  if (!ValidateURLRequestData(*data))
-    return false;
-
-  std::string name_version;
-
-  // Allow instance to be 0 or -1 for testing purposes.
-  if (instance && instance != -1) {
-    PepperPluginInstanceImpl* instance_impl =
-        HostGlobals::Get()->GetInstance(instance);
-    if (instance_impl) {
-      name_version = MakeXRequestedWithValue(
-          instance_impl->module()->name(), instance_impl->module()->version());
-    }
-  } else {
-    name_version = "internal_testing_only";
-  }
-
-  dest->SetUrl(
-      frame->GetDocument().CompleteURL(WebString::FromUTF8(data->url)));
-  dest->SetReportUploadProgress(data->record_upload_progress);
-
-  if (!data->method.empty())
-    dest->SetHttpMethod(WebString::FromUTF8(data->method));
-
-  dest->SetSiteForCookies(frame->GetDocument().SiteForCookies());
-
-  // Plug-ins should not load via service workers as plug-ins may have their own
-  // origin checking logic that may get confused if service workers respond with
-  // resources from another origin.
-  // https://w3c.github.io/ServiceWorker/#implementer-concerns
-  dest->SetSkipServiceWorker(true);
-
-  const std::string& headers = data->headers;
-  if (!headers.empty()) {
-    net::HttpUtil::HeadersIterator it(headers, "\n\r");
-    while (it.GetNext()) {
-      dest->AddHttpHeaderField(WebString::FromUTF8(it.name()),
-                               WebString::FromUTF8(it.values()));
-    }
-  }
-
-  // Append the upload data.
-  if (!data->body.empty()) {
-    WebHTTPBody http_body;
-    http_body.Initialize();
-    for (size_t i = 0; i < data->body.size(); ++i) {
-      const URLRequestInfoData::BodyItem& item = data->body[i];
-      if (item.is_file) {
-        if (!AppendFileRefToBody(instance,
-                                 item.file_ref_pp_resource,
-                                 item.start_offset,
-                                 item.number_of_bytes,
-                                 item.expected_last_modified_time,
-                                 &http_body))
-          return false;
-      } else {
-        DCHECK(!item.data.empty());
-        http_body.AppendData(WebData(base::as_byte_span(item.data)));
-      }
-    }
-    dest->SetHttpBody(http_body);
-  }
-
-  // Add the "Referer" header if there is a custom referrer. Such requests
-  // require universal access. For all other requests, "Referer" will be set
-  // after header security checks are done in AssociatedURLLoader.
-  if (data->has_custom_referrer_url && !data->custom_referrer_url.empty())
-    frame->SetReferrerForRequest(*dest, GURL(data->custom_referrer_url));
-
-  if (data->has_custom_content_transfer_encoding &&
-      !data->custom_content_transfer_encoding.empty()) {
-    dest->AddHttpHeaderField(
-        WebString::FromUTF8("Content-Transfer-Encoding"),
-        WebString::FromUTF8(data->custom_content_transfer_encoding));
-  }
-
-  if (!name_version.empty())
-    dest->SetRequestedWithHeader(WebString::FromUTF8(name_version));
-
-  if (data->has_custom_user_agent) {
-    auto url_request_extra_data =
-        base::MakeRefCounted<blink::WebURLRequestExtraData>();
-    url_request_extra_data->set_custom_user_agent(
-        WebString::FromUTF8(data->custom_user_agent));
-    dest->SetURLRequestExtraData(std::move(url_request_extra_data));
-  }
-
-  dest->SetRequestContext(blink::mojom::RequestContextType::PLUGIN);
-  // TODO(lyf): We don't currently distinguish between plugin content loaded
-  // via `<embed>` or `<object>` as https://github.com/whatwg/fetch/pull/948
-  // asks us to do. See `content::PepperURLLoaderHost::InternalOnHostMsgOpen`
-  // for details.
-  dest->SetRequestDestination(network::mojom::RequestDestination::kEmbed);
-
-  return true;
-}
-
-bool URLRequestRequiresUniversalAccess(const URLRequestInfoData& data) {
-  return data.has_custom_referrer_url ||
-         data.has_custom_content_transfer_encoding ||
-         data.has_custom_user_agent ||
-         url::FindAndCompareScheme(data.url, url::kJavaScriptScheme, nullptr);
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/url_request_info_util.h b/content/renderer/pepper/url_request_info_util.h
deleted file mode 100644
index 2c66a0f0..0000000
--- a/content/renderer/pepper/url_request_info_util.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2011 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_URL_REQUEST_INFO_UTIL_H_
-#define CONTENT_RENDERER_PEPPER_URL_REQUEST_INFO_UTIL_H_
-
-#include "content/common/content_export.h"
-#include "ppapi/c/pp_instance.h"
-
-namespace ppapi {
-struct URLRequestInfoData;
-}
-
-namespace blink {
-class WebLocalFrame;
-class WebURLRequest;
-}
-
-namespace content {
-
-// Creates the WebKit URL request from the current request info. Returns true
-// on success, false if the request is invalid (in which case *dest may be
-// partially initialized). Any upload files with only resource IDs (no file ref
-// pointers) will be populated by this function on success.
-CONTENT_EXPORT bool CreateWebURLRequest(PP_Instance instance,
-                                        ppapi::URLRequestInfoData* data,
-                                        blink::WebLocalFrame* frame,
-                                        blink::WebURLRequest* dest);
-
-// Returns true if universal access is required to use the given request.
-CONTENT_EXPORT bool URLRequestRequiresUniversalAccess(
-    const ppapi::URLRequestInfoData& data);
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_URL_REQUEST_INFO_UTIL_H_
diff --git a/content/renderer/pepper/url_response_info_util.cc b/content/renderer/pepper/url_response_info_util.cc
deleted file mode 100644
index be81007f..0000000
--- a/content/renderer/pepper/url_response_info_util.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/url_response_info_util.h"
-
-#include <stdint.h>
-
-#include "ppapi/shared_impl/url_response_info_data.h"
-#include "third_party/blink/public/platform/web_http_header_visitor.h"
-#include "third_party/blink/public/platform/web_string.h"
-#include "third_party/blink/public/platform/web_url.h"
-#include "third_party/blink/public/platform/web_url_response.h"
-
-using blink::WebHTTPHeaderVisitor;
-using blink::WebString;
-using blink::WebURLResponse;
-
-namespace content {
-
-namespace {
-
-class HeadersToString : public WebHTTPHeaderVisitor {
- public:
-  HeadersToString() {}
-  ~HeadersToString() override {}
-
-  const std::string& buffer() const { return buffer_; }
-
-  void VisitHeader(const WebString& name, const WebString& value) override {
-    if (!buffer_.empty())
-      buffer_.append("\n");
-    buffer_.append(name.Utf8());
-    buffer_.append(": ");
-    buffer_.append(value.Utf8());
-  }
-
- private:
-  std::string buffer_;
-};
-
-bool IsRedirect(int32_t status) { return status >= 300 && status <= 399; }
-
-}  // namespace
-
-ppapi::URLResponseInfoData DataFromWebURLResponse(
-    const WebURLResponse& response) {
-  ppapi::URLResponseInfoData data;
-  data.url = response.CurrentRequestUrl().GetString().Utf8();
-  data.status_code = response.HttpStatusCode();
-  data.status_text = response.HttpStatusText().Utf8();
-  if (IsRedirect(data.status_code)) {
-    data.redirect_url =
-        response.HttpHeaderField(WebString::FromUTF8("Location")).Utf8();
-  }
-
-  HeadersToString headers_to_string;
-  response.VisitHttpHeaderFields(&headers_to_string);
-  data.headers = headers_to_string.buffer();
-  return data;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/url_response_info_util.h b/content/renderer/pepper/url_response_info_util.h
deleted file mode 100644
index 9948a1bf..0000000
--- a/content/renderer/pepper/url_response_info_util.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_URL_RESPONSE_INFO_UTIL_H_
-#define CONTENT_RENDERER_PEPPER_URL_RESPONSE_INFO_UTIL_H_
-
-#include "ppapi/shared_impl/url_response_info_data.h"
-
-namespace blink {
-class WebURLResponse;
-}
-
-namespace content {
-
-ppapi::URLResponseInfoData DataFromWebURLResponse(
-    const blink::WebURLResponse& response);
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_URL_RESPONSE_INFO_UTIL_H_
diff --git a/content/renderer/pepper/v8_var_converter.cc b/content/renderer/pepper/v8_var_converter.cc
deleted file mode 100644
index 3bb1400..0000000
--- a/content/renderer/pepper/v8_var_converter.cc
+++ /dev/null
@@ -1,621 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/v8_var_converter.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <functional>
-#include <map>
-#include <memory>
-#include <string>
-#include <unordered_map>
-#include <unordered_set>
-
-#include "base/containers/circular_deque.h"
-#include "base/containers/stack.h"
-#include "base/functional/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "content/public/renderer/renderer_ppapi_host.h"
-#include "content/renderer/pepper/host_array_buffer_var.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/resource_converter.h"
-#include "content/renderer/pepper/v8object_var.h"
-#include "ppapi/shared_impl/array_var.h"
-#include "ppapi/shared_impl/dictionary_var.h"
-#include "ppapi/shared_impl/var.h"
-#include "ppapi/shared_impl/var_tracker.h"
-#include "third_party/blink/public/web/web_array_buffer.h"
-#include "third_party/blink/public/web/web_array_buffer_converter.h"
-#include "v8/include/v8-container.h"
-#include "v8/include/v8-context.h"
-#include "v8/include/v8-local-handle.h"
-#include "v8/include/v8-microtask-queue.h"
-#include "v8/include/v8-object.h"
-#include "v8/include/v8-primitive.h"
-
-using ppapi::ArrayBufferVar;
-using ppapi::ArrayVar;
-using ppapi::DictionaryVar;
-using ppapi::ScopedPPVar;
-using ppapi::StringVar;
-using ppapi::V8ObjectVar;
-using std::make_pair;
-
-namespace {
-
-template <class T>
-struct StackEntry {
-  StackEntry(T v) : val(v), sentinel(false) {}
-  T val;
-  // Used to track parent nodes on the stack while traversing the graph.
-  bool sentinel;
-};
-
-struct HashedHandle {
-  HashedHandle(v8::Local<v8::Object> h) : handle(h) {}
-  size_t hash() const { return handle->GetIdentityHash(); }
-  bool operator==(const HashedHandle& h) const { return handle == h.handle; }
-  v8::Local<v8::Object> handle;
-};
-
-}  // namespace
-
-namespace std {
-template <>
-struct hash<HashedHandle> {
-  size_t operator()(const HashedHandle& handle) const { return handle.hash(); }
-};
-}  // namespace std
-
-namespace content {
-
-namespace {
-
-// Maps PP_Var IDs to the V8 value handle they correspond to.
-
-typedef std::unordered_map<int64_t, v8::Local<v8::Value>> VarHandleMap;
-typedef std::unordered_set<int64_t> ParentVarSet;
-
-// Maps V8 value handles to the PP_Var they correspond to.
-typedef std::unordered_map<HashedHandle, ScopedPPVar> HandleVarMap;
-typedef std::unordered_set<HashedHandle> ParentHandleSet;
-
-// Returns a V8 value which corresponds to a given PP_Var. If |var| is a
-// reference counted PP_Var type, and it exists in |visited_ids|, the V8 value
-// associated with it in the map will be returned, otherwise a new V8 value will
-// be created and added to the map. |did_create| indicates whether a new v8
-// value was created as a result of calling the function.
-bool GetOrCreateV8Value(v8::Local<v8::Context> context,
-                        const PP_Var& var,
-                        V8VarConverter::AllowObjectVars object_vars_allowed,
-                        v8::Local<v8::Value>* result,
-                        bool* did_create,
-                        VarHandleMap* visited_ids,
-                        ParentVarSet* parent_ids,
-                        ResourceConverter* resource_converter) {
-  v8::Isolate* isolate = context->GetIsolate();
-  *did_create = false;
-
-  if (ppapi::VarTracker::IsVarTypeRefcounted(var.type)) {
-    if (parent_ids->count(var.value.as_id) != 0)
-      return false;
-    auto it = visited_ids->find(var.value.as_id);
-    if (it != visited_ids->end()) {
-      *result = it->second;
-      return true;
-    }
-  }
-
-  switch (var.type) {
-    case PP_VARTYPE_UNDEFINED:
-      *result = v8::Undefined(isolate);
-      break;
-    case PP_VARTYPE_NULL:
-      *result = v8::Null(isolate);
-      break;
-    case PP_VARTYPE_BOOL:
-      *result = (var.value.as_bool == PP_TRUE) ? v8::True(isolate)
-                                               : v8::False(isolate);
-      break;
-    case PP_VARTYPE_INT32:
-      *result = v8::Integer::New(isolate, var.value.as_int);
-      break;
-    case PP_VARTYPE_DOUBLE:
-      *result = v8::Number::New(isolate, var.value.as_double);
-      break;
-    case PP_VARTYPE_STRING: {
-      StringVar* string = StringVar::FromPPVar(var);
-      if (!string) {
-        NOTREACHED();
-      }
-      const std::string& value = string->value();
-      // Create a string primitive rather than a string object. This is lossy
-      // in the sense that string primitives in JavaScript can't be referenced
-      // in the same way that string vars can in pepper. But that information
-      // isn't very useful and primitive strings are a more expected form in JS.
-      *result =
-          v8::String::NewFromUtf8(isolate, value.c_str(),
-                                  v8::NewStringType::kNormal, value.size())
-              .ToLocalChecked();
-      break;
-    }
-    case PP_VARTYPE_ARRAY_BUFFER: {
-      ArrayBufferVar* buffer = ArrayBufferVar::FromPPVar(var);
-      if (!buffer) {
-        NOTREACHED();
-      }
-      HostArrayBufferVar* host_buffer =
-          static_cast<HostArrayBufferVar*>(buffer);
-      *result = blink::WebArrayBufferConverter::ToV8Value(
-          &host_buffer->webkit_buffer(), isolate);
-      break;
-    }
-    case PP_VARTYPE_ARRAY:
-      *result = v8::Array::New(isolate);
-      break;
-    case PP_VARTYPE_DICTIONARY:
-      *result = v8::Object::New(isolate);
-      break;
-    case PP_VARTYPE_OBJECT: {
-      // If object vars are disallowed, we should never be passed an object var
-      // to convert. Also, we should never expect to convert an object var which
-      // is nested inside an array or dictionary.
-      if (object_vars_allowed == V8VarConverter::kDisallowObjectVars ||
-          visited_ids->size() != 0) {
-        NOTREACHED();
-      }
-      scoped_refptr<V8ObjectVar> v8_object_var = V8ObjectVar::FromPPVar(var);
-      if (!v8_object_var.get()) {
-        NOTREACHED();
-      }
-      *result = v8_object_var->GetHandle();
-      break;
-    }
-    case PP_VARTYPE_RESOURCE:
-      if (!resource_converter->ToV8Value(var, context, result)) {
-        result->Clear();
-        return false;
-      }
-      break;
-  }
-
-  *did_create = true;
-  if (ppapi::VarTracker::IsVarTypeRefcounted(var.type))
-    (*visited_ids)[var.value.as_id] = *result;
-  return true;
-}
-
-// For a given V8 value handle, this returns a PP_Var which corresponds to it.
-// If the handle already exists in |visited_handles|, the PP_Var associated with
-// it will be returned, otherwise a new V8 value will be created and added to
-// the map. |did_create| indicates if a new PP_Var was created as a result of
-// calling the function.
-bool GetOrCreateVar(v8::Local<v8::Value> val,
-                    v8::Local<v8::Context> context,
-                    PP_Instance instance,
-                    V8VarConverter::AllowObjectVars object_vars_allowed,
-                    PP_Var* result,
-                    bool* did_create,
-                    HandleVarMap* visited_handles,
-                    ParentHandleSet* parent_handles,
-                    ResourceConverter* resource_converter) {
-  CHECK(!val.IsEmpty());
-  *did_create = false;
-
-  v8::Isolate* isolate = context->GetIsolate();
-  // Even though every v8 string primitive encountered will be a unique object,
-  // we still add them to |visited_handles| so that the corresponding string
-  // PP_Var created will be properly refcounted.
-  if (val->IsObject() || val->IsString()) {
-    if (parent_handles->count(
-            HashedHandle(val->ToObject(context).ToLocalChecked())) != 0)
-      return false;
-
-    HandleVarMap::const_iterator it = visited_handles->find(
-        HashedHandle(val->ToObject(context).ToLocalChecked()));
-    if (it != visited_handles->end()) {
-      *result = it->second.get();
-      return true;
-    }
-  }
-
-  if (val->IsUndefined()) {
-    *result = PP_MakeUndefined();
-  } else if (val->IsNull()) {
-    *result = PP_MakeNull();
-  } else if (val->IsBoolean() || val->IsBooleanObject()) {
-    *result = PP_MakeBool(PP_FromBool(val->ToBoolean(isolate)->Value()));
-  } else if (val->IsInt32()) {
-    *result = PP_MakeInt32(val.As<v8::Int32>()->Value());
-  } else if (val->IsNumber() || val->IsNumberObject()) {
-    *result = PP_MakeDouble(val->NumberValue(context).ToChecked());
-  } else if (val->IsString() || val->IsStringObject()) {
-    v8::String::Utf8Value utf8(isolate,
-                               val->ToString(context).ToLocalChecked());
-    *result = StringVar::StringToPPVar(std::string(*utf8, utf8.length()));
-  } else if (val->IsObject()) {
-    // For any other v8 objects, the conversion happens as follows:
-    // 1) If the object is an array buffer, return an ArrayBufferVar.
-    // 2) If object vars are allowed, return the object wrapped as a
-    //    V8ObjectVar. This is to maintain backward compatibility with
-    //    synchronous scripting in Flash.
-    // 3) If the object is an array, return an ArrayVar.
-    // 4) If the object can be converted to a resource, return the ResourceVar.
-    // 5) Otherwise return a DictionaryVar.
-    std::unique_ptr<blink::WebArrayBuffer> web_array_buffer(
-        blink::WebArrayBufferConverter::CreateFromV8Value(val, isolate));
-    if (web_array_buffer.get()) {
-      scoped_refptr<HostArrayBufferVar> buffer_var(
-          new HostArrayBufferVar(*web_array_buffer));
-      *result = buffer_var->GetPPVar();
-    } else if (object_vars_allowed == V8VarConverter::kAllowObjectVars) {
-      v8::Local<v8::Object> object = val.As<v8::Object>();
-      *result = content::HostGlobals::Get()->
-          host_var_tracker()->V8ObjectVarForV8Object(instance, object);
-    } else if (val->IsArray()) {
-      *result = (new ArrayVar())->GetPPVar();
-    } else {
-      bool was_resource;
-      if (!resource_converter->FromV8Value(val.As<v8::Object>(), context,
-                                           result, &was_resource))
-        return false;
-      if (!was_resource) {
-        *result = (new DictionaryVar())->GetPPVar();
-      }
-    }
-  } else {
-    // Silently ignore the case where we can't convert to a Var as we may
-    // be trying to convert a type that doesn't have a corresponding
-    // PP_Var type.
-    return true;
-  }
-
-  *did_create = true;
-  if (val->IsObject() || val->IsString()) {
-    visited_handles->insert(
-        make_pair(HashedHandle(val->ToObject(context).ToLocalChecked()),
-                  ScopedPPVar(ScopedPPVar::PassRef(), *result)));
-  }
-  return true;
-}
-
-bool CanHaveChildren(PP_Var var) {
-  return var.type == PP_VARTYPE_ARRAY || var.type == PP_VARTYPE_DICTIONARY;
-}
-
-}  // namespace
-
-V8VarConverter::V8VarConverter(PP_Instance instance,
-                               AllowObjectVars object_vars_allowed)
-    : instance_(instance),
-      object_vars_allowed_(object_vars_allowed) {
-  resource_converter_ = std::make_unique<ResourceConverterImpl>(instance);
-}
-
-V8VarConverter::V8VarConverter(
-    PP_Instance instance,
-    std::unique_ptr<ResourceConverter> resource_converter)
-    : instance_(instance),
-      object_vars_allowed_(kDisallowObjectVars),
-      resource_converter_(resource_converter.release()) {}
-
-V8VarConverter::~V8VarConverter() {}
-
-// To/FromV8Value use a stack-based DFS search to traverse V8/Var graph. Each
-// iteration, the top node on the stack examined. If the node has not been
-// visited yet (i.e. sentinel == false) then it is added to the list of parents
-// which contains all of the nodes on the path from the start node to the
-// current node. Each of the current nodes children are examined. If they appear
-// in the list of parents it means we have a cycle and we return NULL.
-// Otherwise, if they can have children, we add them to the stack. If the
-// node at the top of the stack has already been visited, then we pop it off the
-// stack and erase it from the list of parents.
-// static
-bool V8VarConverter::ToV8Value(const PP_Var& var,
-                               v8::Local<v8::Context> context,
-                               v8::Local<v8::Value>* result) {
-  v8::Context::Scope context_scope(context);
-  v8::Isolate* isolate = context->GetIsolate();
-  v8::EscapableHandleScope handle_scope(isolate);
-  v8::MicrotasksScope microtasks_scope(
-      isolate, context->GetMicrotaskQueue(),
-      v8::MicrotasksScope::kDoNotRunMicrotasks);
-
-  VarHandleMap visited_ids;
-  ParentVarSet parent_ids;
-
-  // The code below needs to reference stack nodes across updates. base::stack
-  // is not stable, so we use a circular_deque indexed by integer indices. The
-  // back of the deque is the top of the stack.
-  base::circular_deque<StackEntry<PP_Var>> stack;
-  stack.push_back(StackEntry<PP_Var>(var));
-  v8::Local<v8::Value> root;
-  bool is_root = true;
-
-  while (!stack.empty()) {
-    // This index is stable across updates at the back.
-    size_t current_var_index = stack.size() - 1;
-    v8::Local<v8::Value> current_v8;
-
-    if (stack.back().sentinel) {
-      if (CanHaveChildren(stack[current_var_index].val))
-        parent_ids.erase(stack[current_var_index].val.value.as_id);
-      stack.pop_back();
-      continue;
-    } else {
-      stack.back().sentinel = true;
-    }
-
-    bool did_create = false;
-    if (!GetOrCreateV8Value(context, stack[current_var_index].val,
-                            object_vars_allowed_, &current_v8, &did_create,
-                            &visited_ids, &parent_ids,
-                            resource_converter_.get())) {
-      return false;
-    }
-
-    if (is_root) {
-      is_root = false;
-      root = current_v8;
-    }
-
-    // Add child nodes to the stack.
-    if (stack[current_var_index].val.type == PP_VARTYPE_ARRAY) {
-      parent_ids.insert(stack[current_var_index].val.value.as_id);
-      ArrayVar* array_var = ArrayVar::FromPPVar(stack[current_var_index].val);
-      if (!array_var) {
-        NOTREACHED();
-      }
-      DCHECK(current_v8->IsArray());
-      v8::Local<v8::Array> v8_array = current_v8.As<v8::Array>();
-
-      for (size_t i = 0; i < array_var->elements().size(); ++i) {
-        const PP_Var& child_var = array_var->elements()[i].get();
-        v8::Local<v8::Value> child_v8;
-        if (!GetOrCreateV8Value(context,
-                                child_var,
-                                object_vars_allowed_,
-                                &child_v8,
-                                &did_create,
-                                &visited_ids,
-                                &parent_ids,
-                                resource_converter_.get())) {
-          return false;
-        }
-        if (did_create && CanHaveChildren(child_var))
-          stack.push_back(child_var);
-        if (v8_array->Set(context, static_cast<uint32_t>(i), child_v8)
-                .IsNothing()) {
-          LOG(ERROR) << "Setter for index " << i << " threw an exception.";
-          return false;
-        }
-      }
-    } else if (stack[current_var_index].val.type == PP_VARTYPE_DICTIONARY) {
-      parent_ids.insert(stack[current_var_index].val.value.as_id);
-      DictionaryVar* dict_var =
-          DictionaryVar::FromPPVar(stack[current_var_index].val);
-      if (!dict_var) {
-        NOTREACHED();
-      }
-      DCHECK(current_v8->IsObject());
-      v8::Local<v8::Object> v8_object = current_v8.As<v8::Object>();
-
-      for (auto iter = dict_var->key_value_map().begin();
-           iter != dict_var->key_value_map().end(); ++iter) {
-        const std::string& key = iter->first;
-        const PP_Var& child_var = iter->second.get();
-        v8::Local<v8::Value> child_v8;
-        if (!GetOrCreateV8Value(context,
-                                child_var,
-                                object_vars_allowed_,
-                                &child_v8,
-                                &did_create,
-                                &visited_ids,
-                                &parent_ids,
-                                resource_converter_.get())) {
-          return false;
-        }
-        if (did_create && CanHaveChildren(child_var))
-          stack.push_back(child_var);
-
-        if (v8_object
-                ->Set(context,
-                      v8::String::NewFromUtf8(isolate, key.c_str(),
-                                              v8::NewStringType::kInternalized,
-                                              key.length())
-                          .ToLocalChecked(),
-                      child_v8)
-                .IsNothing()) {
-          LOG(ERROR) << "Setter for property " << key.c_str() << " threw an "
-                     << "exception.";
-          return false;
-        }
-      }
-    }
-  }
-
-  *result = handle_scope.Escape(root);
-  return true;
-}
-
-V8VarConverter::VarResult V8VarConverter::FromV8Value(
-    v8::Local<v8::Value> val,
-    v8::Local<v8::Context> context,
-    base::OnceCallback<void(const ScopedPPVar&, bool)> callback) {
-  VarResult result;
-  result.success = FromV8ValueInternal(val, context, &result.var);
-  if (!result.success)
-    resource_converter_->Reset();
-  result.completed_synchronously = !resource_converter_->NeedsFlush();
-  if (!result.completed_synchronously)
-    resource_converter_->Flush(base::BindOnce(std::move(callback), result.var));
-
-  return result;
-}
-
-bool V8VarConverter::FromV8ValueSync(
-    v8::Local<v8::Value> val,
-    v8::Local<v8::Context> context,
-    ppapi::ScopedPPVar* result_var) {
-  bool success = FromV8ValueInternal(val, context, result_var);
-  if (!success || resource_converter_->NeedsFlush()) {
-    resource_converter_->Reset();
-    return false;
-  }
-  return true;
-}
-
-bool V8VarConverter::FromV8ValueInternal(
-    v8::Local<v8::Value> val,
-    v8::Local<v8::Context> context,
-    ppapi::ScopedPPVar* result_var) {
-  v8::Context::Scope context_scope(context);
-  v8::Isolate* isolate = context->GetIsolate();
-  v8::HandleScope handle_scope(isolate);
-  v8::MicrotasksScope microtasks_scope(
-      isolate, context->GetMicrotaskQueue(),
-      v8::MicrotasksScope::kDoNotRunMicrotasks);
-
-  HandleVarMap visited_handles;
-  ParentHandleSet parent_handles;
-
-  base::stack<StackEntry<v8::Local<v8::Value>>> stack;
-  stack.push(StackEntry<v8::Local<v8::Value> >(val));
-  ScopedPPVar root;
-  *result_var = PP_MakeUndefined();
-  bool is_root = true;
-
-  while (!stack.empty()) {
-    v8::Local<v8::Value> current_v8 = stack.top().val;
-    PP_Var current_var;
-
-    if (stack.top().sentinel) {
-      stack.pop();
-      if (current_v8->IsObject())
-        parent_handles.erase(HashedHandle(current_v8.As<v8::Object>()));
-      continue;
-    } else {
-      stack.top().sentinel = true;
-    }
-
-    bool did_create = false;
-    if (!GetOrCreateVar(current_v8,
-                        context,
-                        instance_,
-                        object_vars_allowed_,
-                        &current_var,
-                        &did_create,
-                        &visited_handles,
-                        &parent_handles,
-                        resource_converter_.get())) {
-      return false;
-    }
-
-    if (is_root) {
-      is_root = false;
-      root = current_var;
-    }
-
-    // Add child nodes to the stack.
-    if (current_var.type == PP_VARTYPE_ARRAY) {
-      DCHECK(current_v8->IsArray());
-      v8::Local<v8::Array> v8_array = current_v8.As<v8::Array>();
-      parent_handles.insert(HashedHandle(v8_array));
-
-      ArrayVar* array_var = ArrayVar::FromPPVar(current_var);
-      if (!array_var) {
-        NOTREACHED();
-      }
-
-      for (uint32_t i = 0; i < v8_array->Length(); ++i) {
-        v8::Local<v8::Value> child_v8;
-        if (!v8_array->Get(context, i).ToLocal(&child_v8))
-          return false;
-
-        if (!v8_array->HasRealIndexedProperty(context, i).FromMaybe(false))
-          continue;
-
-        PP_Var child_var;
-        if (!GetOrCreateVar(child_v8,
-                            context,
-                            instance_,
-                            object_vars_allowed_,
-                            &child_var,
-                            &did_create,
-                            &visited_handles,
-                            &parent_handles,
-                            resource_converter_.get())) {
-          return false;
-        }
-        if (did_create && child_v8->IsObject())
-          stack.push(child_v8);
-
-        array_var->Set(i, child_var);
-      }
-    } else if (current_var.type == PP_VARTYPE_DICTIONARY) {
-      DCHECK(current_v8->IsObject());
-      v8::Local<v8::Object> v8_object = current_v8.As<v8::Object>();
-      parent_handles.insert(HashedHandle(v8_object));
-
-      DictionaryVar* dict_var = DictionaryVar::FromPPVar(current_var);
-      if (!dict_var) {
-        NOTREACHED();
-      }
-
-      v8::Local<v8::Array> property_names(
-          v8_object->GetOwnPropertyNames(context).ToLocalChecked());
-      for (uint32_t i = 0; i < property_names->Length(); ++i) {
-        v8::Local<v8::Value> key(
-            property_names->Get(context, i).ToLocalChecked());
-
-        // Extend this test to cover more types as necessary and if sensible.
-        if (!key->IsString() && !key->IsNumber()) {
-          NOTREACHED() << "Key \"" << *v8::String::Utf8Value(isolate, key)
-                       << "\" "
-                          "is neither a string nor a number";
-        }
-
-        v8::Local<v8::String> key_string =
-            key->ToString(context).ToLocalChecked();
-        // Skip all callbacks: crbug.com/139933
-        if (v8_object->HasRealNamedCallbackProperty(context, key_string)
-                .ToChecked()) {
-          continue;
-        }
-
-        v8::String::Utf8Value name_utf8(isolate, key_string);
-
-        v8::Local<v8::Value> child_v8;
-        if (!v8_object->Get(context, key).ToLocal(&child_v8))
-          return false;
-
-        PP_Var child_var;
-        if (!GetOrCreateVar(child_v8,
-                            context,
-                            instance_,
-                            object_vars_allowed_,
-                            &child_var,
-                            &did_create,
-                            &visited_handles,
-                            &parent_handles,
-                            resource_converter_.get())) {
-          return false;
-        }
-        if (did_create && child_v8->IsObject())
-          stack.push(child_v8);
-
-        bool success = dict_var->SetWithStringKey(
-            std::string(*name_utf8, name_utf8.length()), child_var);
-        DCHECK(success);
-      }
-    }
-  }
-  *result_var = root;
-  return true;
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/v8_var_converter.h b/content/renderer/pepper/v8_var_converter.h
deleted file mode 100644
index b197c91..0000000
--- a/content/renderer/pepper/v8_var_converter.h
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2013 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_V8_VAR_CONVERTER_H_
-#define CONTENT_RENDERER_PEPPER_V8_VAR_CONVERTER_H_
-
-#include <memory>
-
-#include "base/functional/callback.h"
-#include "content/common/content_export.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/c/pp_var.h"
-#include "ppapi/shared_impl/scoped_pp_var.h"
-#include "v8/include/v8-forward.h"
-
-namespace content {
-
-class ResourceConverter;
-
-class CONTENT_EXPORT V8VarConverter {
- public:
-  // Whether or not to allow converting object vars. If they are not allowed
-  // and they are passed in, conversion will fail.
-  enum AllowObjectVars {
-    kDisallowObjectVars,
-    kAllowObjectVars
-  };
-  V8VarConverter(PP_Instance instance, AllowObjectVars object_vars_allowed);
-
-  // Constructor for testing.
-  V8VarConverter(PP_Instance instance,
-                 std::unique_ptr<ResourceConverter> resource_converter);
-
-  V8VarConverter(const V8VarConverter&) = delete;
-  V8VarConverter& operator=(const V8VarConverter&) = delete;
-
-  ~V8VarConverter();
-
-  // Converts the given PP_Var to a v8::Value. True is returned upon success.
-  bool ToV8Value(const PP_Var& var,
-                 v8::Local<v8::Context> context,
-                 v8::Local<v8::Value>* result);
-
-  struct VarResult {
-   public:
-    VarResult() : completed_synchronously(false), success(false) {}
-
-    // True if the conversion completed synchronously and the callback will not
-    // be called.
-    bool completed_synchronously;
-
-    // True if the conversion was successful. Only valid if
-    // |completed_synchronously| is true.
-    bool success;
-
-    // The result if the conversion was successful. Only valid if
-    // |completed_synchronously| and |success| are true.
-    ppapi::ScopedPPVar var;
-  };
-
-  // Converts the given v8::Value to a PP_Var. Every PP_Var in the reference
-  // graph in the result will have a refcount equal to the number of references
-  // to it in the graph. The root of the result will have one additional
-  // reference. The callback is run when conversion is complete with the
-  // resulting var and a bool indicating success or failure. Conversion may be
-  // asynchronous because converting some resources may result in communication
-  // across IPC. |context| is guaranteed to only be used synchronously. If
-  // the conversion can occur synchronously, |callback| will not be run,
-  // otherwise it will be run.
-  VarResult FromV8Value(
-      v8::Local<v8::Value> val,
-      v8::Local<v8::Context> context,
-      base::OnceCallback<void(const ppapi::ScopedPPVar&, bool)> callback);
-  bool FromV8ValueSync(v8::Local<v8::Value> val,
-                       v8::Local<v8::Context> context,
-                       ppapi::ScopedPPVar* result_var);
- private:
-  // Returns true on success, false on failure.
-  bool FromV8ValueInternal(v8::Local<v8::Value> val,
-                           v8::Local<v8::Context> context,
-                           ppapi::ScopedPPVar* result_var);
-
-  PP_Instance instance_;
-
-  // Whether or not to support conversion to PP_VARTYPE_OBJECT.
-  AllowObjectVars object_vars_allowed_;
-
-  // The converter to use for converting V8 vars to resources.
-  std::unique_ptr<ResourceConverter> resource_converter_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_V8_VAR_CONVERTER_H_
diff --git a/content/renderer/pepper/v8_var_converter_unittest.cc b/content/renderer/pepper/v8_var_converter_unittest.cc
deleted file mode 100644
index e0dc17c..0000000
--- a/content/renderer/pepper/v8_var_converter_unittest.cc
+++ /dev/null
@@ -1,486 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/v8_var_converter.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <cmath>
-#include <memory>
-#include <unordered_map>
-
-#include "base/check.h"
-#include "base/functional/bind.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "base/notimplemented.h"
-#include "base/notreached.h"
-#include "base/run_loop.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/task_environment.h"
-#include "base/values.h"
-#include "content/renderer/pepper/resource_converter.h"
-#include "gin/public/isolate_holder.h"
-#include "ppapi/c/pp_bool.h"
-#include "ppapi/c/pp_var.h"
-#include "ppapi/shared_impl/array_var.h"
-#include "ppapi/shared_impl/dictionary_var.h"
-#include "ppapi/shared_impl/ppapi_globals.h"
-#include "ppapi/shared_impl/proxy_lock.h"
-#include "ppapi/shared_impl/scoped_pp_var.h"
-#include "ppapi/shared_impl/test_globals.h"
-#include "ppapi/shared_impl/test_utils.h"
-#include "ppapi/shared_impl/var.h"
-#include "ppapi/shared_impl/var_tracker.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "v8/include/v8-container.h"
-#include "v8/include/v8-context.h"
-#include "v8/include/v8-isolate.h"
-#include "v8/include/v8-microtask-queue.h"
-#include "v8/include/v8-object.h"
-#include "v8/include/v8-persistent-handle.h"
-#include "v8/include/v8-primitive.h"
-#include "v8/include/v8-script.h"
-#include "v8/include/v8-template.h"
-
-using ppapi::ArrayBufferVar;
-using ppapi::ArrayVar;
-using ppapi::DictionaryVar;
-using ppapi::PpapiGlobals;
-using ppapi::ProxyLock;
-using ppapi::ScopedPPVar;
-using ppapi::StringVar;
-using ppapi::TestGlobals;
-using ppapi::TestEqual;
-using ppapi::VarTracker;
-
-namespace content {
-
-namespace {
-
-void FromV8ValueComplete(const ScopedPPVar& scoped_var,
-                         bool success) {
-  NOTREACHED();
-}
-
-class MockResourceConverter : public content::ResourceConverter {
- public:
-  ~MockResourceConverter() override {}
-  void Reset() override {}
-  bool NeedsFlush() override { return false; }
-  void Flush(base::OnceCallback<void(bool)> callback) override { NOTREACHED(); }
-  bool FromV8Value(v8::Local<v8::Object> val,
-                   v8::Local<v8::Context> context,
-                   PP_Var* result,
-                   bool* was_resource) override {
-    *was_resource = false;
-    return true;
-  }
-  bool ToV8Value(const PP_Var& var,
-                 v8::Local<v8::Context> context,
-                 v8::Local<v8::Value>* result) override {
-    return false;
-  }
-};
-
-// Maps PP_Var IDs to the V8 value handle they correspond to.
-typedef std::unordered_map<int64_t, v8::Local<v8::Value>> VarHandleMap;
-
-bool Equals(const PP_Var& var,
-            v8::Local<v8::Value> val,
-            v8::Isolate* isolate,
-            VarHandleMap* visited_ids) {
-  if (ppapi::VarTracker::IsVarTypeRefcounted(var.type)) {
-    auto it = visited_ids->find(var.value.as_id);
-    if (it != visited_ids->end())
-      return it->second == val;
-    (*visited_ids)[var.value.as_id] = val;
-  }
-
-  v8::Local<v8::Context> context = isolate->GetCurrentContext();
-  if (val->IsUndefined()) {
-    return var.type == PP_VARTYPE_UNDEFINED;
-  } else if (val->IsNull()) {
-    return var.type == PP_VARTYPE_NULL;
-  } else if (val->IsBoolean() || val->IsBooleanObject()) {
-    return var.type == PP_VARTYPE_BOOL &&
-           PP_FromBool(val->ToBoolean(isolate)->Value()) == var.value.as_bool;
-  } else if (val->IsInt32()) {
-    return var.type == PP_VARTYPE_INT32 &&
-           val.As<v8::Int32>()->Value() == var.value.as_int;
-  } else if (val->IsNumber() || val->IsNumberObject()) {
-    return var.type == PP_VARTYPE_DOUBLE &&
-           fabs(val->NumberValue(context).ToChecked() - var.value.as_double) <=
-               1.0e-4;
-  } else if (val->IsString() || val->IsStringObject()) {
-    if (var.type != PP_VARTYPE_STRING)
-      return false;
-    StringVar* string_var = StringVar::FromPPVar(var);
-    DCHECK(string_var);
-    v8::String::Utf8Value utf8(isolate, val);
-    return std::string(*utf8, utf8.length()) == string_var->value();
-  } else if (val->IsArray()) {
-    if (var.type != PP_VARTYPE_ARRAY)
-      return false;
-    ArrayVar* array_var = ArrayVar::FromPPVar(var);
-    DCHECK(array_var);
-    v8::Local<v8::Array> v8_array = val.As<v8::Array>();
-    if (v8_array->Length() != array_var->elements().size())
-      return false;
-    for (uint32_t i = 0; i < v8_array->Length(); ++i) {
-      v8::Local<v8::Value> child_v8 =
-          v8_array->Get(context, i).ToLocalChecked();
-      if (!Equals(array_var->elements()[i].get(), child_v8, isolate,
-                  visited_ids)) {
-        return false;
-      }
-    }
-    return true;
-  } else if (val->IsObject()) {
-    if (var.type == PP_VARTYPE_ARRAY_BUFFER) {
-      // TODO(raymes): Implement this when we have tests for array buffers.
-      NOTIMPLEMENTED();
-      return false;
-    } else {
-      v8::Local<v8::Object> v8_object = val.As<v8::Object>();
-      if (var.type != PP_VARTYPE_DICTIONARY)
-        return false;
-      DictionaryVar* dict_var = DictionaryVar::FromPPVar(var);
-      DCHECK(dict_var);
-      v8::Local<v8::Array> property_names(
-          v8_object->GetOwnPropertyNames(context).ToLocalChecked());
-      if (property_names->Length() != dict_var->key_value_map().size())
-        return false;
-      for (uint32_t i = 0; i < property_names->Length(); ++i) {
-        v8::Local<v8::Value> key(
-            property_names->Get(context, i).ToLocalChecked());
-
-        if (!key->IsString() && !key->IsNumber())
-          return false;
-        v8::Local<v8::Value> child_v8 =
-            v8_object->Get(context, key).ToLocalChecked();
-
-        v8::String::Utf8Value name_utf8(isolate, key);
-        ScopedPPVar release_key(ScopedPPVar::PassRef(),
-                                StringVar::StringToPPVar(std::string(
-                                    *name_utf8, name_utf8.length())));
-        if (!dict_var->HasKey(release_key.get()))
-          return false;
-        ScopedPPVar release_value(ScopedPPVar::PassRef(),
-                                  dict_var->Get(release_key.get()));
-        if (!Equals(release_value.get(), child_v8, isolate, visited_ids)) {
-          return false;
-        }
-      }
-      return true;
-    }
-  }
-  return false;
-}
-
-bool Equals(const PP_Var& var, v8::Local<v8::Value> val, v8::Isolate* isolate) {
-  VarHandleMap var_handle_map;
-  return Equals(var, val, isolate, &var_handle_map);
-}
-
-class V8VarConverterTest : public testing::Test {
- public:
-  V8VarConverterTest()
-      : isolate_holder_(task_environment_.GetMainThreadTaskRunner(),
-                        gin::IsolateHolder::IsolateType::kTest),
-        isolate_scope_(isolate_holder_.isolate()) {
-    isolate_ = isolate_holder_.isolate();
-    PP_Instance dummy = 1234;
-    converter_ = std::make_unique<V8VarConverter>(
-        dummy, std::unique_ptr<ResourceConverter>(new MockResourceConverter));
-  }
-  ~V8VarConverterTest() override {}
-
-  // testing::Test implementation.
-  void SetUp() override {
-    ProxyLock::Acquire();
-    v8::HandleScope handle_scope(isolate_);
-    v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New(isolate_);
-    context_.Reset(isolate_, v8::Context::New(isolate_, nullptr, global));
-  }
-  void TearDown() override {
-    isolate_ = nullptr;
-    context_.Reset();
-    ASSERT_TRUE(PpapiGlobals::Get()->GetVarTracker()->GetLiveVars().empty());
-    ProxyLock::Release();
-  }
-
- protected:
-  bool FromV8ValueSync(v8::Local<v8::Value> val,
-                       v8::Local<v8::Context> context,
-                       PP_Var* result) {
-    V8VarConverter::VarResult conversion_result = converter_->FromV8Value(
-        val, context, base::BindOnce(&FromV8ValueComplete));
-    DCHECK(conversion_result.completed_synchronously);
-    if (conversion_result.success)
-      *result = conversion_result.var.Release();
-
-    return conversion_result.success;
-  }
-
-  bool RoundTrip(const PP_Var& var, PP_Var* result) {
-    v8::HandleScope handle_scope(isolate_);
-    v8::Local<v8::Context> context =
-        v8::Local<v8::Context>::New(isolate_, context_);
-    v8::Context::Scope context_scope(context);
-    v8::MicrotasksScope microtasks(context,
-                                   v8::MicrotasksScope::kDoNotRunMicrotasks);
-    v8::Local<v8::Value> v8_result;
-    if (!converter_->ToV8Value(var, context, &v8_result))
-      return false;
-    if (!Equals(var, v8_result, isolate_)) {
-      return false;
-    }
-    if (!FromV8ValueSync(v8_result, context, result))
-      return false;
-    return true;
-  }
-
-  // Assumes a ref for var.
-  bool RoundTripAndCompare(const PP_Var& var) {
-    ScopedPPVar expected(ScopedPPVar::PassRef(), var);
-    PP_Var actual_var;
-    if (!RoundTrip(expected.get(), &actual_var))
-      return false;
-    ScopedPPVar actual(ScopedPPVar::PassRef(), actual_var);
-    return TestEqual(expected.get(), actual.get(), false);
-  }
-
-  raw_ptr<v8::Isolate> isolate_;
-
-  // Context for the JavaScript in the test.
-  v8::Persistent<v8::Context> context_;
-
-  std::unique_ptr<V8VarConverter> converter_;
-
- private:
-  // Required to receive callbacks.
-  base::test::TaskEnvironment task_environment_;
-  gin::IsolateHolder isolate_holder_;
-  v8::Isolate::Scope isolate_scope_;
-
-  TestGlobals globals_;
-};
-
-}  // namespace
-
-TEST_F(V8VarConverterTest, SimpleRoundTripTest) {
-  EXPECT_TRUE(RoundTripAndCompare(PP_MakeUndefined()));
-  EXPECT_TRUE(RoundTripAndCompare(PP_MakeNull()));
-  EXPECT_TRUE(RoundTripAndCompare(PP_MakeInt32(100)));
-  EXPECT_TRUE(RoundTripAndCompare(PP_MakeBool(PP_TRUE)));
-  EXPECT_TRUE(RoundTripAndCompare(PP_MakeDouble(53.75)));
-}
-
-TEST_F(V8VarConverterTest, StringRoundTripTest) {
-  EXPECT_TRUE(RoundTripAndCompare(StringVar::StringToPPVar("")));
-  EXPECT_TRUE(RoundTripAndCompare(StringVar::StringToPPVar("hello world!")));
-}
-
-TEST_F(V8VarConverterTest, ArrayBufferRoundTripTest) {
-  // TODO(raymes): Testing this here requires spinning up some of WebKit.
-  // Work out how to do this.
-}
-
-TEST_F(V8VarConverterTest, DictionaryArrayRoundTripTest) {
-  // Empty array.
-  scoped_refptr<ArrayVar> array(new ArrayVar);
-  ScopedPPVar release_array(ScopedPPVar::PassRef(), array->GetPPVar());
-  EXPECT_TRUE(RoundTripAndCompare(array->GetPPVar()));
-
-  size_t index = 0;
-
-  // Array with primitives.
-  array->Set(index++, PP_MakeUndefined());
-  array->Set(index++, PP_MakeNull());
-  array->Set(index++, PP_MakeInt32(100));
-  array->Set(index++, PP_MakeBool(PP_FALSE));
-  array->Set(index++, PP_MakeDouble(0.123));
-  EXPECT_TRUE(RoundTripAndCompare(array->GetPPVar()));
-
-  // Array with 2 references to the same string.
-  ScopedPPVar release_string(ScopedPPVar::PassRef(),
-                             StringVar::StringToPPVar("abc"));
-  array->Set(index++, release_string.get());
-  array->Set(index++, release_string.get());
-  EXPECT_TRUE(RoundTripAndCompare(array->GetPPVar()));
-
-  // Array with nested array that references the same string.
-  scoped_refptr<ArrayVar> array2(new ArrayVar);
-  ScopedPPVar release_array2(ScopedPPVar::PassRef(), array2->GetPPVar());
-  array2->Set(0, release_string.get());
-  array->Set(index++, release_array2.get());
-  EXPECT_TRUE(RoundTripAndCompare(array->GetPPVar()));
-
-  // Empty dictionary.
-  scoped_refptr<DictionaryVar> dictionary(new DictionaryVar);
-  ScopedPPVar release_dictionary(ScopedPPVar::PassRef(),
-                                 dictionary->GetPPVar());
-  EXPECT_TRUE(RoundTripAndCompare(dictionary->GetPPVar()));
-
-  // Dictionary with primitives.
-  dictionary->SetWithStringKey("1", PP_MakeUndefined());
-  dictionary->SetWithStringKey("2", PP_MakeNull());
-  dictionary->SetWithStringKey("3", PP_MakeInt32(-100));
-  dictionary->SetWithStringKey("4", PP_MakeBool(PP_TRUE));
-  dictionary->SetWithStringKey("5", PP_MakeDouble(-103.52));
-  EXPECT_TRUE(RoundTripAndCompare(dictionary->GetPPVar()));
-
-  // Dictionary with 2 references to the same string.
-  dictionary->SetWithStringKey("6", release_string.get());
-  dictionary->SetWithStringKey("7", release_string.get());
-  EXPECT_TRUE(RoundTripAndCompare(dictionary->GetPPVar()));
-
-  // Dictionary with nested dictionary that references the same string.
-  scoped_refptr<DictionaryVar> dictionary2(new DictionaryVar);
-  ScopedPPVar release_dictionary2(ScopedPPVar::PassRef(),
-                                  dictionary2->GetPPVar());
-  dictionary2->SetWithStringKey("abc", release_string.get());
-  dictionary->SetWithStringKey("8", release_dictionary2.get());
-  EXPECT_TRUE(RoundTripAndCompare(dictionary->GetPPVar()));
-
-  // Array with dictionary.
-  array->Set(index++, release_dictionary.get());
-  EXPECT_TRUE(RoundTripAndCompare(array->GetPPVar()));
-
-  // Array with dictionary with array.
-  array2->Set(0, PP_MakeInt32(100));
-  dictionary->SetWithStringKey("9", release_array2.get());
-  EXPECT_TRUE(RoundTripAndCompare(array->GetPPVar()));
-}
-
-TEST_F(V8VarConverterTest, Cycles) {
-  // Check that cycles aren't converted.
-  v8::HandleScope handle_scope(isolate_);
-  v8::Local<v8::Context> context =
-      v8::Local<v8::Context>::New(isolate_, context_);
-  v8::Context::Scope context_scope(context);
-  v8::MicrotasksScope microtasks(context,
-                                 v8::MicrotasksScope::kDoNotRunMicrotasks);
-
-  // Var->V8 conversion.
-  {
-    scoped_refptr<DictionaryVar> dictionary(new DictionaryVar);
-    ScopedPPVar release_dictionary(ScopedPPVar::PassRef(),
-                                   dictionary->GetPPVar());
-    scoped_refptr<ArrayVar> array(new ArrayVar);
-    ScopedPPVar release_array(ScopedPPVar::PassRef(), array->GetPPVar());
-
-    dictionary->SetWithStringKey("1", release_array.get());
-    array->Set(0, release_dictionary.get());
-
-    v8::Local<v8::Value> v8_result;
-
-    // Array <-> dictionary cycle.
-    dictionary->SetWithStringKey("1", release_array.get());
-    ASSERT_FALSE(
-        converter_->ToV8Value(release_dictionary.get(), context, &v8_result));
-    // Break the cycle.
-    // TODO(raymes): We need some better machinery for releasing vars with
-    // cycles. Remove the code below once we have that.
-    dictionary->DeleteWithStringKey("1");
-
-    // Array with self reference.
-    array->Set(0, release_array.get());
-    ASSERT_FALSE(
-        converter_->ToV8Value(release_array.get(), context, &v8_result));
-    // Break the self reference.
-    array->Set(0, PP_MakeUndefined());
-  }
-
-  // V8->Var conversion.
-  {
-    v8::Local<v8::Object> object = v8::Object::New(isolate_);
-    v8::Local<v8::Array> array = v8::Array::New(isolate_);
-
-    PP_Var var_result;
-
-    // Array <-> dictionary cycle.
-    std::string key = "1";
-    object
-        ->Set(context,
-              v8::String::NewFromUtf8(isolate_, key.c_str(),
-                                      v8::NewStringType::kInternalized,
-                                      key.length())
-                  .ToLocalChecked(),
-              array)
-        .ToChecked();
-    array->Set(context, 0, object).ToChecked();
-
-    ASSERT_FALSE(FromV8ValueSync(object, context, &var_result));
-
-    // Array with self reference.
-    array->Set(context, 0, array).Check();
-    ASSERT_FALSE(FromV8ValueSync(array, context, &var_result));
-  }
-}
-
-TEST_F(V8VarConverterTest, StrangeDictionaryKeyTest) {
-  {
-    // Test keys with '.'.
-    scoped_refptr<DictionaryVar> dictionary(new DictionaryVar);
-    dictionary->SetWithStringKey(".", PP_MakeUndefined());
-    dictionary->SetWithStringKey("x.y", PP_MakeUndefined());
-    EXPECT_TRUE(RoundTripAndCompare(dictionary->GetPPVar()));
-  }
-
-  {
-    // Test non-string key types. They should be cast to strings.
-    v8::HandleScope handle_scope(isolate_);
-    v8::Local<v8::Context> context =
-        v8::Local<v8::Context>::New(isolate_, context_);
-    v8::Context::Scope context_scope(context);
-    v8::MicrotasksScope microtasks(context,
-                                   v8::MicrotasksScope::kDoNotRunMicrotasks);
-
-    const char* source =
-        "(function() {"
-        "return {"
-        "1: 'foo',"
-        "'2': 'bar',"
-        "true: 'baz',"
-        "false: 'qux',"
-        "null: 'quux',"
-        "undefined: 'oops'"
-        "};"
-        "})();";
-
-    v8::Local<v8::Script> script(
-        v8::Script::Compile(
-            context, v8::String::NewFromUtf8(isolate_, source).ToLocalChecked())
-            .ToLocalChecked());
-    v8::Local<v8::Object> object =
-        script->Run(context).ToLocalChecked().As<v8::Object>();
-
-    PP_Var actual;
-    ASSERT_TRUE(FromV8ValueSync(
-        object, v8::Local<v8::Context>::New(isolate_, context_), &actual));
-    ScopedPPVar release_actual(ScopedPPVar::PassRef(), actual);
-
-    scoped_refptr<DictionaryVar> expected(new DictionaryVar);
-    ScopedPPVar foo(ScopedPPVar::PassRef(), StringVar::StringToPPVar("foo"));
-    expected->SetWithStringKey("1", foo.get());
-    ScopedPPVar bar(ScopedPPVar::PassRef(), StringVar::StringToPPVar("bar"));
-    expected->SetWithStringKey("2", bar.get());
-    ScopedPPVar baz(ScopedPPVar::PassRef(), StringVar::StringToPPVar("baz"));
-    expected->SetWithStringKey("true", baz.get());
-    ScopedPPVar qux(ScopedPPVar::PassRef(), StringVar::StringToPPVar("qux"));
-    expected->SetWithStringKey("false", qux.get());
-    ScopedPPVar quux(ScopedPPVar::PassRef(), StringVar::StringToPPVar("quux"));
-    expected->SetWithStringKey("null", quux.get());
-    ScopedPPVar oops(ScopedPPVar::PassRef(), StringVar::StringToPPVar("oops"));
-    expected->SetWithStringKey("undefined", oops.get());
-    ScopedPPVar release_expected(ScopedPPVar::PassRef(), expected->GetPPVar());
-
-    ASSERT_TRUE(TestEqual(release_expected.get(), release_actual.get(), true));
-  }
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/v8object_var.cc b/content/renderer/pepper/v8object_var.cc
deleted file mode 100644
index 03d54a6..0000000
--- a/content/renderer/pepper/v8object_var.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/v8object_var.h"
-
-#include "base/check.h"
-#include "content/public/renderer/pepper_plugin_instance.h"
-#include "content/renderer/pepper/host_globals.h"
-#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
-#include "ppapi/c/pp_var.h"
-#include "v8/include/v8-object.h"
-
-namespace ppapi {
-
-// V8ObjectVar -----------------------------------------------------------------
-
-V8ObjectVar::V8ObjectVar(PP_Instance instance,
-                         v8::Local<v8::Object> v8_object)
-    : instance_(content::HostGlobals::Get()->GetInstance(instance)) {
-  v8_object_.Reset(instance_->GetIsolate(), v8_object);
-  content::HostGlobals::Get()->host_var_tracker()->AddV8ObjectVar(this);
-}
-
-V8ObjectVar::~V8ObjectVar() {
-  if (instance_)
-    content::HostGlobals::Get()->host_var_tracker()->RemoveV8ObjectVar(this);
-  v8_object_.Reset();
-}
-
-V8ObjectVar* V8ObjectVar::AsV8ObjectVar() {
-  return this;
-}
-
-PP_VarType V8ObjectVar::GetType() const {
-  return PP_VARTYPE_OBJECT;
-}
-
-v8::Local<v8::Object> V8ObjectVar::GetHandle() const {
-  if (instance_)
-    return v8::Local<v8::Object>::New(instance_->GetIsolate(), v8_object_);
-  return v8::Local<v8::Object>();
-}
-
-void V8ObjectVar::InstanceDeleted() {
-  // This is called by the HostVarTracker which will take care of removing us
-  // from its set.
-  DCHECK(instance_);
-  instance_ = nullptr;
-}
-
-// static
-scoped_refptr<V8ObjectVar> V8ObjectVar::FromPPVar(PP_Var var) {
-  if (var.type != PP_VARTYPE_OBJECT)
-    return scoped_refptr<V8ObjectVar>(nullptr);
-  scoped_refptr<Var> var_object(
-      PpapiGlobals::Get()->GetVarTracker()->GetVar(var));
-  if (!var_object.get())
-    return scoped_refptr<V8ObjectVar>();
-  return scoped_refptr<V8ObjectVar>(var_object->AsV8ObjectVar());
-}
-
-}  // namespace ppapi
diff --git a/content/renderer/pepper/v8object_var.h b/content/renderer/pepper/v8object_var.h
deleted file mode 100644
index 7e894c6..0000000
--- a/content/renderer/pepper/v8object_var.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_V8OBJECT_VAR_H_
-#define CONTENT_RENDERER_PEPPER_V8OBJECT_VAR_H_
-
-#include "base/memory/raw_ptr.h"
-#include "content/common/content_export.h"
-#include "ppapi/c/pp_instance.h"
-#include "ppapi/shared_impl/var.h"
-#include "v8/include/v8-forward.h"
-#include "v8/include/v8-persistent-handle.h"
-
-namespace content {
-class PepperPluginInstanceImpl;
-}  // namespace content
-
-namespace ppapi {
-
-// V8ObjectVar -----------------------------------------------------------------
-
-// Represents a JavaScript object Var. By itself, this represents random
-// v8 objects that a given plugin (identified by the resource's module) wants to
-// reference. If two different modules reference the same v8 object (like the
-// "window" object), then there will be different V8ObjectVar's (and hence
-// PP_Var IDs) for each module. This allows us to track all references owned by
-// a given module and free them when the plugin exits independently of other
-// plugins that may be running at the same time.
-class CONTENT_EXPORT V8ObjectVar : public Var {
- public:
-  V8ObjectVar(PP_Instance instance, v8::Local<v8::Object> v8_object);
-
-  V8ObjectVar(const V8ObjectVar&) = delete;
-  V8ObjectVar& operator=(const V8ObjectVar&) = delete;
-
-  // Var overrides.
-  V8ObjectVar* AsV8ObjectVar() override;
-  PP_VarType GetType() const override;
-
-  // Returns the underlying v8 object corresponding to this V8ObjectVar. This
-  // should only be used on the stack.
-  v8::Local<v8::Object> GetHandle() const;
-
-  // Notification that the instance was deleted, the internal reference will be
-  // zeroed out.
-  void InstanceDeleted();
-
-  // Possibly NULL if the object has outlived its instance.
-  content::PepperPluginInstanceImpl* instance() const { return instance_; }
-
-  // Helper function that converts a PP_Var to an object. This will return NULL
-  // if the PP_Var is not of object type or the object is invalid.
-  static scoped_refptr<V8ObjectVar> FromPPVar(PP_Var var);
-
- private:
-  ~V8ObjectVar() override;
-
-  raw_ptr<content::PepperPluginInstanceImpl> instance_;
-
-  v8::Persistent<v8::Object> v8_object_;
-};
-
-}  // ppapi
-
-#endif  // CONTENT_RENDERER_PEPPER_V8OBJECT_VAR_H_
diff --git a/content/renderer/pepper/video_decoder_shim.cc b/content/renderer/pepper/video_decoder_shim.cc
deleted file mode 100644
index d102a1f..0000000
--- a/content/renderer/pepper/video_decoder_shim.cc
+++ /dev/null
@@ -1,732 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/pepper/video_decoder_shim.h"
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-#include <GLES2/gl2extchromium.h>
-
-#include <memory>
-#include <utility>
-
-#include "base/check_op.h"
-#include "base/compiler_specific.h"
-#include "base/containers/contains.h"
-#include "base/containers/queue.h"
-#include "base/containers/span.h"
-#include "base/functional/bind.h"
-#include "base/functional/callback_helpers.h"
-#include "base/location.h"
-#include "base/memory/ref_counted.h"
-#include "base/notreached.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/task/single_thread_task_runner.h"
-#include "content/public/renderer/render_thread.h"
-#include "content/renderer/pepper/pepper_video_decoder_host.h"
-#include "content/renderer/render_thread_impl.h"
-#include "gpu/command_buffer/client/raster_interface.h"
-#include "media/base/cdm_context.h"
-#include "media/base/decoder_buffer.h"
-#include "media/base/limits.h"
-#include "media/base/media_switches.h"
-#include "media/base/media_util.h"
-#include "media/base/status.h"
-#include "media/base/video_decoder.h"
-#include "media/base/video_decoder_config.h"
-#include "media/filters/ffmpeg_video_decoder.h"
-#include "media/filters/vpx_video_decoder.h"
-#include "media/media_buildflags.h"
-#include "media/video/gpu_video_accelerator_factories.h"
-#include "media/video/video_decode_accelerator.h"
-#include "ppapi/c/pp_errors.h"
-#include "services/viz/public/cpp/gpu/context_provider_command_buffer.h"
-
-namespace content {
-
-namespace {
-
-// Size of the timestamp cache. We don't want the cache to grow without bounds.
-// The maximum size is chosen to be the same as in the VaapiVideoDecoder.
-constexpr size_t kTimestampCacheSize = 128;
-
-constexpr gfx::Size kDefaultSize(128, 128);
-
-bool IsSoftwareCodecSupported(media::VideoCodec codec) {
-#if BUILDFLAG(ENABLE_LIBVPX)
-  if (codec == media::VideoCodec::kVP9 || codec == media::VideoCodec::kVP8) {
-    return true;
-  }
-#endif
-
-#if BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
-  return media::FFmpegVideoDecoder::IsCodecSupported(codec);
-#else
-  return false;
-#endif
-}
-
-}  // namespace
-
-struct VideoDecoderShim::PendingDecode {
-  PendingDecode(std::optional<uint32_t> decode_id,
-                const scoped_refptr<media::DecoderBuffer>& buffer);
-  ~PendingDecode();
-
-  // |decode_id| is std::optional because it will be std::nullopt when the
-  // decoder is being flushed.
-  const std::optional<uint32_t> decode_id;
-  const scoped_refptr<media::DecoderBuffer> buffer;
-};
-
-VideoDecoderShim::PendingDecode::PendingDecode(
-    std::optional<uint32_t> decode_id,
-    const scoped_refptr<media::DecoderBuffer>& buffer)
-    : decode_id(decode_id), buffer(buffer) {}
-
-VideoDecoderShim::PendingDecode::~PendingDecode() {
-}
-
-struct VideoDecoderShim::PendingFrame {
-  explicit PendingFrame(std::optional<uint32_t> decode_id);
-  PendingFrame(std::optional<uint32_t> decode_id,
-               scoped_refptr<media::VideoFrame> frame);
-
-  // This could be expensive to copy, so guard against that.
-  PendingFrame(const PendingFrame&) = delete;
-  PendingFrame& operator=(const PendingFrame&) = delete;
-
-  ~PendingFrame();
-
-  // |decode_id| is std::optional because it will be std::nullopt when the
-  // decoder is being flushed.
-  const std::optional<uint32_t> decode_id;
-  scoped_refptr<media::VideoFrame> video_frame;
-};
-
-VideoDecoderShim::PendingFrame::PendingFrame(std::optional<uint32_t> decode_id)
-    : decode_id(decode_id) {}
-
-VideoDecoderShim::PendingFrame::PendingFrame(
-    std::optional<uint32_t> decode_id,
-    scoped_refptr<media::VideoFrame> frame)
-    : decode_id(decode_id), video_frame(std::move(frame)) {}
-
-VideoDecoderShim::PendingFrame::~PendingFrame() {
-}
-
-// DecoderImpl runs the underlying VideoDecoder on the media thread, receiving
-// calls from the VideoDecodeShim on the main thread and sending results back.
-// This class is constructed on the main thread, but used and destructed on the
-// media thread.
-class VideoDecoderShim::DecoderImpl {
- public:
-  DecoderImpl(const base::WeakPtr<VideoDecoderShim>& proxy,
-              bool use_hw_decoder);
-  ~DecoderImpl();
-
-  void InitializeSoftwareDecoder(media::VideoDecoderConfig config);
-  void InitializeHardwareDecoder(
-      media::VideoDecoderConfig config,
-      media::GpuVideoAcceleratorFactories* gpu_factories);
-  void Decode(uint32_t decode_id, scoped_refptr<media::DecoderBuffer> buffer);
-  void Flush();
-  void Reset();
-  void Stop();
-
- private:
-  void OnInitDone(media::DecoderStatus status);
-  void DoDecode();
-  void OnDecodeComplete(std::optional<uint32_t> decode_id,
-                        media::DecoderStatus status);
-  void OnOutputComplete(scoped_refptr<media::VideoFrame> frame);
-  void OnResetComplete();
-
-  // WeakPtr is bound to main_message_loop_. Use only in shim callbacks.
-  base::WeakPtr<VideoDecoderShim> shim_;
-  media::NullMediaLog media_log_;
-  std::unique_ptr<media::VideoDecoder> decoder_;
-  bool initialized_ = false;
-  scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-  // Queue of decodes waiting for the decoder.
-  using PendingDecodeQueue = base::queue<PendingDecode>;
-  PendingDecodeQueue pending_decodes_;
-  bool awaiting_decoder_ = false;
-  // We can't assume that VideoDecoder always generates corresponding frames
-  // before decode is finished. In that case, the frame can be output before
-  // or after the decode completion callback is called. In order to allow the
-  // Pepper plugin to associate Decode() calls with decoded frames we use
-  // |decode_counter_| and |timestamp_to_id_cache_| to generate and store fake
-  // timestamps. The corresponding timestamp will be put in the
-  // media::DecoderBuffer that's sent to the VideoDecoder. When VideoDecoder
-  // returns a VideoFrame we use its timestamp to look up the Decode() call id
-  // in |timestamp_to_id_cache_|.
-  base::LRUCache<base::TimeDelta, uint32_t> timestamp_to_id_cache_;
-  base::TimeDelta decode_counter_ = base::Microseconds(0u);
-
-  const bool use_hw_decoder_;
-
-  base::WeakPtrFactory<DecoderImpl> weak_ptr_factory_{this};
-};
-
-VideoDecoderShim::DecoderImpl::DecoderImpl(
-    const base::WeakPtr<VideoDecoderShim>& proxy,
-    bool use_hw_decoder)
-    : shim_(proxy),
-      main_task_runner_(base::SingleThreadTaskRunner::GetCurrentDefault()),
-      timestamp_to_id_cache_(kTimestampCacheSize),
-      use_hw_decoder_(use_hw_decoder) {}
-
-VideoDecoderShim::DecoderImpl::~DecoderImpl() {
-  DCHECK(pending_decodes_.empty());
-}
-
-void VideoDecoderShim::DecoderImpl::InitializeSoftwareDecoder(
-    media::VideoDecoderConfig config) {
-  DCHECK(!use_hw_decoder_);
-  DCHECK(!decoder_);
-#if BUILDFLAG(ENABLE_LIBVPX) || BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
-#if BUILDFLAG(ENABLE_LIBVPX)
-  if (config.codec() == media::VideoCodec::kVP9 ||
-      config.codec() == media::VideoCodec::kVP8) {
-    decoder_ = std::make_unique<media::VpxVideoDecoder>();
-  } else
-#endif  // BUILDFLAG(ENABLE_LIBVPX)
-#if BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
-  {
-    std::unique_ptr<media::FFmpegVideoDecoder> ffmpeg_video_decoder(
-        new media::FFmpegVideoDecoder(&media_log_));
-    ffmpeg_video_decoder->set_decode_nalus(true);
-    decoder_ = std::move(ffmpeg_video_decoder);
-  }
-#endif  //  BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
-  // VpxVideoDecoder and FFmpegVideoDecoder support only one pending Decode()
-  // request.
-  DCHECK_EQ(decoder_->GetMaxDecodeRequests(), 1);
-
-  decoder_->Initialize(
-      config, /*low_delay=*/true, nullptr,
-      base::BindOnce(&VideoDecoderShim::DecoderImpl::OnInitDone,
-                     weak_ptr_factory_.GetWeakPtr()),
-      base::BindRepeating(&VideoDecoderShim::DecoderImpl::OnOutputComplete,
-                          weak_ptr_factory_.GetWeakPtr()),
-      base::NullCallback());
-#else
-  OnInitDone(media::DecoderStatus::Codes::kUnsupportedCodec);
-#endif  // BUILDFLAG(ENABLE_LIBVPX) || BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
-}
-
-void VideoDecoderShim::DecoderImpl::InitializeHardwareDecoder(
-    media::VideoDecoderConfig config,
-    media::GpuVideoAcceleratorFactories* gpu_factories) {
-  DCHECK(use_hw_decoder_);
-
-  DCHECK(gpu_factories->GetTaskRunner()->RunsTasksInCurrentSequence());
-  if (!gpu_factories->IsGpuVideoDecodeAcceleratorEnabled()) {
-    OnInitDone(media::DecoderStatus::Codes::kFailedToCreateDecoder);
-    return;
-  }
-
-  decoder_ = gpu_factories->CreateVideoDecoder(
-      &media_log_, /*request_overlay_info_cb=*/base::DoNothing());
-
-  if (!decoder_) {
-    OnInitDone(media::DecoderStatus::Codes::kFailedToCreateDecoder);
-    return;
-  }
-
-  decoder_->Initialize(
-      config, /*low_delay=*/true, nullptr,
-      base::BindOnce(&VideoDecoderShim::DecoderImpl::OnInitDone,
-                     weak_ptr_factory_.GetWeakPtr()),
-      base::BindRepeating(&VideoDecoderShim::DecoderImpl::OnOutputComplete,
-                          weak_ptr_factory_.GetWeakPtr()),
-      base::NullCallback());
-}
-
-void VideoDecoderShim::DecoderImpl::Decode(
-    uint32_t decode_id,
-    scoped_refptr<media::DecoderBuffer> buffer) {
-  DCHECK(decoder_);
-  pending_decodes_.push(PendingDecode(decode_id, buffer));
-  DoDecode();
-}
-
-void VideoDecoderShim::DecoderImpl::Flush() {
-  DCHECK(decoder_);
-
-  pending_decodes_.emplace(/*decode_id=*/std::nullopt,
-                           media::DecoderBuffer::CreateEOSBuffer());
-
-  DoDecode();
-}
-
-void VideoDecoderShim::DecoderImpl::Reset() {
-  DCHECK(decoder_);
-  // Abort all pending decodes.
-  while (!pending_decodes_.empty()) {
-    const PendingDecode& decode = pending_decodes_.front();
-
-    // The PepperVideoDecoderHost validates that there's not a pending flush
-    // when a reset request is received.
-    DCHECK(decode.decode_id.has_value());
-    std::unique_ptr<PendingFrame> pending_frame(
-        new PendingFrame(decode.decode_id));
-    main_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&VideoDecoderShim::OnDecodeComplete, shim_,
-                                  PP_OK, decode.decode_id));
-    pending_decodes_.pop();
-  }
-  // Don't need to call Reset() if the |decoder_| hasn't been initialized.
-  if (!initialized_) {
-    OnResetComplete();
-    return;
-  }
-
-  decoder_->Reset(
-      base::BindOnce(&VideoDecoderShim::DecoderImpl::OnResetComplete,
-                     weak_ptr_factory_.GetWeakPtr()));
-}
-
-void VideoDecoderShim::DecoderImpl::Stop() {
-  // Clear pending decodes now. We don't want OnDecodeComplete to call DoDecode
-  // again.
-  while (!pending_decodes_.empty())
-    pending_decodes_.pop();
-
-  decoder_.reset();
-  // This instance is deleted once we exit this scope.
-}
-
-void VideoDecoderShim::DecoderImpl::OnInitDone(media::DecoderStatus status) {
-  if (!status.is_ok()) {
-    main_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&VideoDecoderShim::OnInitializeFailed, shim_));
-    return;
-  }
-
-  initialized_ = true;
-  DoDecode();
-}
-
-void VideoDecoderShim::DecoderImpl::DoDecode() {
-  if (!initialized_ || pending_decodes_.empty() || awaiting_decoder_)
-    return;
-
-  awaiting_decoder_ = true;
-  const PendingDecode& decode = pending_decodes_.front();
-
-  if (!decode.buffer->end_of_stream()) {
-    const base::TimeDelta new_counter =
-        decode_counter_ + base::Microseconds(1u);
-    if (new_counter == decode_counter_) {
-      // We've reached the maximum base::TimeDelta.
-      main_task_runner_->PostTask(
-          FROM_HERE,
-          base::BindOnce(&VideoDecoderShim::OnDecodeComplete, shim_,
-                         PP_ERROR_RESOURCE_FAILED, decode.decode_id));
-      awaiting_decoder_ = false;
-      pending_decodes_.pop();
-      return;
-    }
-    decode_counter_ = new_counter;
-    DCHECK(timestamp_to_id_cache_.Peek(decode_counter_) ==
-           timestamp_to_id_cache_.end());
-    DCHECK(decode.decode_id.has_value());
-    timestamp_to_id_cache_.Put(decode_counter_, decode.decode_id.value());
-    decode.buffer->set_timestamp(decode_counter_);
-  }
-
-  decoder_->Decode(
-      decode.buffer,
-      base::BindOnce(&VideoDecoderShim::DecoderImpl::OnDecodeComplete,
-                     weak_ptr_factory_.GetWeakPtr(), decode.decode_id));
-  pending_decodes_.pop();
-}
-
-void VideoDecoderShim::DecoderImpl::OnDecodeComplete(
-    std::optional<uint32_t> decode_id,
-    media::DecoderStatus status) {
-  DCHECK(awaiting_decoder_);
-  awaiting_decoder_ = false;
-
-  int32_t result;
-  switch (status.code()) {
-    case media::DecoderStatus::Codes::kOk:
-    case media::DecoderStatus::Codes::kAborted:
-      result = PP_OK;
-      break;
-    default:
-      result = PP_ERROR_RESOURCE_FAILED;
-      break;
-  }
-
-  main_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&VideoDecoderShim::OnDecodeComplete, shim_,
-                                result, decode_id));
-
-  DoDecode();
-}
-
-void VideoDecoderShim::DecoderImpl::OnOutputComplete(
-    scoped_refptr<media::VideoFrame> frame) {
-  // Software decoders are expected to generate frames only when a Decode()
-  // call is pending.
-  DCHECK(use_hw_decoder_ || awaiting_decoder_);
-  DCHECK(!frame->metadata().end_of_stream);
-
-  uint32_t decode_id;
-
-  base::TimeDelta timestamp = frame->timestamp();
-  auto it = timestamp_to_id_cache_.Get(timestamp);
-  if (it != timestamp_to_id_cache_.end()) {
-    decode_id = it->second;
-  } else {
-    NOTREACHED();
-  }
-
-  auto pending_frame =
-      std::make_unique<PendingFrame>(decode_id, std::move(frame));
-
-  main_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&VideoDecoderShim::OnOutputComplete, shim_,
-                                std::move(pending_frame)));
-}
-
-void VideoDecoderShim::DecoderImpl::OnResetComplete() {
-  main_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&VideoDecoderShim::OnResetComplete, shim_));
-}
-
-// static
-std::unique_ptr<VideoDecoderShim> VideoDecoderShim::Create(
-    PepperVideoDecoderHost* host,
-    uint32_t texture_pool_size,
-    bool use_hw_decoder) {
-  scoped_refptr<viz::ContextProviderCommandBuffer>
-      shared_main_thread_context_provider =
-          RenderThreadImpl::current()->SharedMainThreadContextProvider();
-  if (!shared_main_thread_context_provider) {
-    return nullptr;
-  }
-
-  return base::WrapUnique(
-      new VideoDecoderShim(host, texture_pool_size, use_hw_decoder,
-                           std::move(shared_main_thread_context_provider)));
-}
-
-VideoDecoderShim::VideoDecoderShim(
-    PepperVideoDecoderHost* host,
-    uint32_t texture_pool_size,
-    bool use_hw_decoder,
-    scoped_refptr<viz::ContextProviderCommandBuffer>
-        shared_main_thread_context_provider)
-    : state_(UNINITIALIZED),
-      host_(host),
-      media_task_runner_(
-          RenderThreadImpl::current()->GetMediaSequencedTaskRunner()),
-      shared_main_thread_context_provider_(
-          std::move(shared_main_thread_context_provider)),
-      texture_pool_size_(texture_pool_size),
-      num_pending_decodes_(0),
-      use_hw_decoder_(use_hw_decoder) {
-  DCHECK(host_);
-  DCHECK(media_task_runner_.get());
-  DCHECK(shared_main_thread_context_provider_.get());
-  decoder_impl_ = std::make_unique<DecoderImpl>(weak_ptr_factory_.GetWeakPtr(),
-                                                use_hw_decoder_);
-}
-
-VideoDecoderShim::~VideoDecoderShim() {
-  DCHECK(RenderThreadImpl::current());
-
-  CHECK(available_shared_images_.empty())
-      << "VideoDecoderShim::Destroy() must be called before destructor";
-
-  FlushCommandBuffer();
-
-  weak_ptr_factory_.InvalidateWeakPtrs();
-  // No more callbacks from the delegate will be received now.
-
-  // The callback now holds the only reference to the DecoderImpl, which will be
-  // deleted when Stop completes.
-  media_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&VideoDecoderShim::DecoderImpl::Stop,
-                                base::Owned(decoder_impl_.release())));
-}
-
-bool VideoDecoderShim::Initialize(media::VideoCodecProfile profile) {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK_EQ(state_, UNINITIALIZED);
-
-  media::VideoCodec codec = media::VideoCodec::kUnknown;
-  if (profile <= media::H264PROFILE_MAX) {
-    codec = media::VideoCodec::kH264;
-  } else if (profile <= media::VP8PROFILE_MAX) {
-    codec = media::VideoCodec::kVP8;
-  } else if (profile <= media::VP9PROFILE_MAX) {
-    codec = media::VideoCodec::kVP9;
-  }
-  DCHECK_NE(codec, media::VideoCodec::kUnknown);
-
-  // For hardware decoding, an unsupported codec is expected to manifest in an
-  // initialization failure later on.
-  if (!use_hw_decoder_ && !IsSoftwareCodecSupported(codec))
-    return false;
-
-  media::VideoDecoderConfig video_decoder_config(
-      codec, profile, media::VideoDecoderConfig::AlphaMode::kIsOpaque,
-      media::VideoColorSpace(), media::kNoTransformation, kDefaultSize,
-      gfx::Rect(kDefaultSize), kDefaultSize,
-      // TODO(bbudge): Verify extra data isn't needed.
-      media::EmptyExtraData(), media::EncryptionScheme::kUnencrypted);
-
-  if (!use_hw_decoder_) {
-    media_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(
-            &VideoDecoderShim::DecoderImpl::InitializeSoftwareDecoder,
-            base::Unretained(decoder_impl_.get()), video_decoder_config));
-  } else {
-    media::GpuVideoAcceleratorFactories* gpu_factories =
-        RenderThreadImpl::current()->GetGpuFactories();
-    if (!gpu_factories)
-      return false;
-
-    video_renderer_ = std::make_unique<media::PaintCanvasVideoRenderer>();
-
-    // It's safe to pass |gpu_factories| because the underlying instance is
-    // managed by the RenderThreadImpl which doesn't destroy it until its
-    // destructor which stops the media thread before destroying the
-    // GpuVideoAcceleratorFactories.
-    media_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(
-            &VideoDecoderShim::DecoderImpl::InitializeHardwareDecoder,
-            base::Unretained(decoder_impl_.get()), video_decoder_config,
-            gpu_factories));
-  }
-
-  state_ = DECODING;
-
-  // Return success, even though we are asynchronous, to mimic
-  // media::VideoDecodeAccelerator.
-  return true;
-}
-
-void VideoDecoderShim::Decode(media::BitstreamBuffer bitstream_buffer) {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK_EQ(state_, DECODING);
-
-  // We need the address of the shared memory, so we can copy the buffer.
-  const uint8_t* buffer = host_->DecodeIdToAddress(bitstream_buffer.id());
-  DCHECK(buffer);
-
-  media_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(
-          &VideoDecoderShim::DecoderImpl::Decode,
-          base::Unretained(decoder_impl_.get()), bitstream_buffer.id(),
-          media::DecoderBuffer::CopyFrom(
-              // SAFETY: `buffer` is the address of `bitstream_buffer`'s shared
-              // memory and is assumed to have the same size.
-              UNSAFE_BUFFERS(base::span(buffer, bitstream_buffer.size())))));
-  num_pending_decodes_++;
-}
-
-void VideoDecoderShim::ReuseSharedImage(const gpu::Mailbox& mailbox,
-                                        gfx::Size size) {
-  DCHECK(RenderThreadImpl::current());
-
-  // Video resolution could have changed from the time the image was sent to
-  // plugin and so this image is not reusable anymore. Delete it in this case.
-  if (size != texture_size_) {
-    host_->DestroySharedImage(mailbox);
-    return;
-  }
-
-  available_shared_images_.push_back(mailbox);
-  SendSharedImages();
-}
-
-void VideoDecoderShim::Flush() {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK_EQ(state_, DECODING);
-
-  state_ = FLUSHING;
-  media_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&VideoDecoderShim::DecoderImpl::Flush,
-                                base::Unretained(decoder_impl_.get())));
-  num_pending_decodes_++;
-}
-
-void VideoDecoderShim::Reset() {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK_EQ(state_, DECODING);
-  state_ = RESETTING;
-  media_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&VideoDecoderShim::DecoderImpl::Reset,
-                                base::Unretained(decoder_impl_.get())));
-}
-
-void VideoDecoderShim::Destroy() {
-  for (auto mailbox : available_shared_images_) {
-    host_->DestroySharedImage(mailbox);
-  }
-  available_shared_images_.clear();
-
-  FlushCommandBuffer();
-}
-
-void VideoDecoderShim::OnInitializeFailed() {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK(host_);
-
-  host_->NotifyError(media::VideoDecodeAccelerator::PLATFORM_FAILURE);
-}
-
-void VideoDecoderShim::OnDecodeComplete(int32_t result,
-                                        std::optional<uint32_t> decode_id) {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK(host_);
-
-  if (result == PP_ERROR_RESOURCE_FAILED) {
-    host_->NotifyError(media::VideoDecodeAccelerator::PLATFORM_FAILURE);
-    return;
-  }
-
-  num_pending_decodes_--;
-  if (decode_id.has_value()) {
-    completed_decodes_.push(decode_id.value());
-  }
-
-  // If frames are being queued because we're out of textures, don't notify
-  // the host that decode has completed. This exerts "back pressure" to keep
-  // the host from sending buffers that will cause pending_frames_ to grow.
-  if (pending_frames_.empty())
-    NotifyCompletedDecodes();
-
-  if (!decode_id.has_value()) {
-    // The flush request has been completed. This DCHECK is guaranteed by a
-    // couple of facts:
-    //
-    // 1) The PepperVideoDecoderHost doesn't call VideoDecoderShim::Decode() or
-    //    VideoDecoderShim::Flush() if there is a flush in progress, so
-    //    |num_pending_decodes_| shouldn't increase after calling Flush() and
-    //    before the flush is completed.
-    //
-    // 2) All pending decode callbacks should have been called.
-    DCHECK(!num_pending_decodes_);
-    pending_frames_.push(
-        std::make_unique<PendingFrame>(/*decode_id=*/std::nullopt));
-  }
-}
-
-void VideoDecoderShim::OnOutputComplete(std::unique_ptr<PendingFrame> frame) {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK(host_);
-  DCHECK(frame->video_frame);
-
-  if (texture_size_ != frame->video_frame->coded_size()) {
-    // If the size has changed, all current SharedImages must be destroyed.
-    // Destroy images that aren't in use by the plugin. We will destroy the
-    // rest as they are recycled.
-    for (const auto& mailbox : available_shared_images_) {
-      host_->DestroySharedImage(mailbox);
-    }
-
-    available_shared_images_.clear();
-
-    for (uint32_t i = 0; i < texture_pool_size_; i++) {
-      available_shared_images_.push_back(
-          host_->CreateSharedImage(frame->video_frame->coded_size()));
-    }
-
-    texture_size_ = frame->video_frame->coded_size();
-  }
-
-  pending_frames_.push(std::move(frame));
-  SendSharedImages();
-}
-
-void VideoDecoderShim::SendSharedImages() {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK(host_);
-
-  while (!pending_frames_.empty() && !available_shared_images_.empty()) {
-    const std::unique_ptr<PendingFrame>& frame = pending_frames_.front();
-
-    if (!frame->decode_id.has_value()) {
-      // This signals the completion of a flush: all frames should have been
-      // output by the underlying decoder (as required by the
-      // media::VideoDecoder API) and the plugin should not have sent any other
-      // decode requests while the flush was pending (this is validated by the
-      // PepperVideoDecoderHost).
-      pending_frames_.pop();
-      DCHECK(pending_frames_.empty());
-      DCHECK(!num_pending_decodes_);
-      DCHECK_EQ(state_, FLUSHING);
-      break;
-    }
-
-    auto it = available_shared_images_.begin();
-    // Plugin's GLES2Interface and Renderer's RasterInterface are synchronized
-    // by issued `ShallowFlushCHROMIUM` after each work. Synchronization with
-    // SharedImageInterface happens during Creation/Destruction, so we don't
-    // need SyncToken here and ignore one returned from
-    // CopyVideoFrameToSharedImage.
-    auto mailbox = *it;
-    std::ignore = video_renderer_->CopyVideoFrameToSharedImage(
-        shared_main_thread_context_provider_.get(), frame->video_frame, mailbox,
-        gpu::SyncToken(), /*use_visible_rect=*/false);
-
-    DCHECK(frame->decode_id.has_value());
-    host_->SharedImageReady(
-        base::checked_cast<int32_t>(frame->decode_id.value()), mailbox,
-        frame->video_frame->coded_size(), frame->video_frame->visible_rect());
-    available_shared_images_.erase(it);
-    pending_frames_.pop();
-  }
-
-  // Flush our commands so they are executed before plugins command that use
-  // this frame. This requires us to be on the same sequence.
-  FlushCommandBuffer();
-
-  if (pending_frames_.empty()) {
-    // If frames aren't backing up, notify the host of any completed decodes so
-    // it can send more buffers.
-    NotifyCompletedDecodes();
-
-    if (state_ == FLUSHING && !num_pending_decodes_) {
-      state_ = DECODING;
-      host_->NotifyFlushDone();
-    }
-  }
-}
-
-void VideoDecoderShim::OnResetComplete() {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK(host_);
-
-  while (!pending_frames_.empty())
-    pending_frames_.pop();
-  NotifyCompletedDecodes();
-
-  state_ = DECODING;
-  host_->NotifyResetDone();
-}
-
-void VideoDecoderShim::NotifyCompletedDecodes() {
-  while (!completed_decodes_.empty()) {
-    host_->NotifyEndOfBitstreamBuffer(completed_decodes_.front());
-    completed_decodes_.pop();
-  }
-}
-
-void VideoDecoderShim::FlushCommandBuffer() {
-  shared_main_thread_context_provider_->RasterInterface()->Flush();
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/video_decoder_shim.h b/content/renderer/pepper/video_decoder_shim.h
deleted file mode 100644
index aec87a7..0000000
--- a/content/renderer/pepper/video_decoder_shim.h
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_VIDEO_DECODER_SHIM_H_
-#define CONTENT_RENDERER_PEPPER_VIDEO_DECODER_SHIM_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <unordered_map>
-#include <unordered_set>
-#include <vector>
-
-#include "base/containers/queue.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/task/sequenced_task_runner.h"
-#include "media/base/video_decoder_config.h"
-#include "media/renderers/paint_canvas_video_renderer.h"
-#include "media/video/video_decode_accelerator.h"
-#include "ppapi/c/pp_codecs.h"
-#include "services/viz/public/cpp/gpu/context_provider_command_buffer.h"
-
-namespace content {
-
-class PepperVideoDecoderHost;
-
-// This class is a shim to wrap a media::VideoDecoder so that it can be used
-// by PepperVideoDecoderHost. This class should be constructed, used, and
-// destructed on the main (render) thread.
-class VideoDecoderShim {
- public:
-  static std::unique_ptr<VideoDecoderShim> Create(PepperVideoDecoderHost* host,
-                                                  uint32_t texture_pool_size,
-                                                  bool use_hw_decoder);
-
-  VideoDecoderShim(const VideoDecoderShim&) = delete;
-  VideoDecoderShim& operator=(const VideoDecoderShim&) = delete;
-
-  ~VideoDecoderShim();
-
-  bool Initialize(media::VideoCodecProfile profile);
-  void Decode(media::BitstreamBuffer bitstream_buffer);
-  void ReuseSharedImage(const gpu::Mailbox& mailbox, gfx::Size size);
-  void Flush();
-  void Reset();
-  void Destroy();
-
-  const scoped_refptr<viz::ContextProviderCommandBuffer>& context_provider()
-      const {
-    return shared_main_thread_context_provider_;
-  }
-
- private:
-  enum State {
-    UNINITIALIZED,
-    DECODING,
-    FLUSHING,
-    RESETTING,
-  };
-
-  struct PendingDecode;
-  struct PendingFrame;
-  class DecoderImpl;
-
-  VideoDecoderShim(PepperVideoDecoderHost* host,
-                   uint32_t texture_pool_size,
-                   bool use_hw_decoder,
-                   scoped_refptr<viz::ContextProviderCommandBuffer>
-                       shared_main_thread_context_provider);
-
-  void OnInitializeFailed();
-  void OnDecodeComplete(int32_t result, std::optional<uint32_t> decode_id);
-  void OnOutputComplete(std::unique_ptr<PendingFrame> frame);
-  void SendSharedImages();
-  void OnResetComplete();
-  void NotifyCompletedDecodes();
-  // Call this whenever we change GL state that the plugin relies on, such as
-  // creating picture textures.
-  void FlushCommandBuffer();
-
-  std::unique_ptr<DecoderImpl> decoder_impl_;
-  State state_;
-
-  raw_ptr<PepperVideoDecoderHost> host_;
-  scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
-  scoped_refptr<viz::ContextProviderCommandBuffer>
-      shared_main_thread_context_provider_;
-
-  // The current decoded frame size.
-  gfx::Size texture_size_;
-
-  std::vector<gpu::Mailbox> available_shared_images_;
-
-  // Queue of completed decode ids, for notifying the host.
-  using CompletedDecodeQueue = base::queue<uint32_t>;
-  CompletedDecodeQueue completed_decodes_;
-
-  // Queue of decoded frames that await rgb->yuv conversion.
-  using PendingFrameQueue = base::queue<std::unique_ptr<PendingFrame>>;
-  PendingFrameQueue pending_frames_;
-
-  // The optimal number of textures to allocate for decoder_impl_.
-  uint32_t texture_pool_size_;
-
-  uint32_t num_pending_decodes_;
-
-  const bool use_hw_decoder_;
-
-  std::unique_ptr<media::PaintCanvasVideoRenderer> video_renderer_;
-
-  base::WeakPtrFactory<VideoDecoderShim> weak_ptr_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_VIDEO_DECODER_SHIM_H_
diff --git a/content/renderer/pepper/video_encoder_shim.cc b/content/renderer/pepper/video_encoder_shim.cc
deleted file mode 100644
index 21a968b..0000000
--- a/content/renderer/pepper/video_encoder_shim.cc
+++ /dev/null
@@ -1,513 +0,0 @@
-// Copyright 2015 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
-#include "content/renderer/pepper/video_encoder_shim.h"
-
-#include <inttypes.h>
-
-#include <memory>
-
-#include "base/containers/circular_deque.h"
-#include "base/functional/bind.h"
-#include "base/functional/callback_helpers.h"
-#include "base/location.h"
-#include "base/memory/raw_ptr.h"
-#include "base/system/sys_info.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/time/time.h"
-#include "content/renderer/pepper/pepper_video_encoder_host.h"
-#include "content/renderer/render_thread_impl.h"
-#include "media/base/bitstream_buffer.h"
-#include "media/base/media_log.h"
-#include "media/base/video_frame.h"
-#include "media/video/video_encode_accelerator.h"
-#include "third_party/libvpx/source/libvpx/vpx/vp8cx.h"
-#include "third_party/libvpx/source/libvpx/vpx/vpx_encoder.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace content {
-
-namespace {
-
-// TODO(llandwerlin): Libvpx doesn't seem to have a maximum frame size
-// limitation. We currently limit the size of the frames to encode at
-// 2160p (%64 pixels blocks), this seems like a reasonable limit for
-// software encoding.
-const int32_t kMaxWidth = 4096;
-const int32_t kMaxHeight = 2176;
-
-// Bitstream buffer size.
-const uint32_t kBitstreamBufferSize = 2 * 1024 * 1024;
-
-// Number of frames needs at any given time.
-const uint32_t kInputFrameCount = 1;
-
-// Maximal number or threads used for encoding.
-const int32_t kMaxNumThreads = 8;
-
-// Default speed for the encoder. Increases the CPU usage as the value
-// is more negative (VP8 valid range: -16..16, VP9 valid range:
-// -8..8), using the same value as WebRTC.
-const int32_t kVp8DefaultCpuUsed = -6;
-
-// Default quantizer min/max values (same values as WebRTC).
-const int32_t kVp8DefaultMinQuantizer = 2;
-const int32_t kVp8DefaultMaxQuantizer = 52;
-
-// Maximum bitrate in CQ mode (same value as ffmpeg).
-const int32_t kVp8MaxCQBitrate = 1000000;
-
-// For VP9, the following 3 values are the same values as remoting.
-const int32_t kVp9DefaultCpuUsed = 6;
-
-const int32_t kVp9DefaultMinQuantizer = 20;
-const int32_t kVp9DefaultMaxQuantizer = 30;
-
-// VP9 adaptive quantization strategy (same as remoting (live video
-// conferencing)).
-const int kVp9AqModeCyclicRefresh = 3;
-
-void GetVpxCodecParameters(media::VideoCodecProfile codec,
-                           vpx_codec_iface_t** vpx_codec,
-                           int32_t* min_quantizer,
-                           int32_t* max_quantizer,
-                           int32_t* cpu_used) {
-  switch (codec) {
-    case media::VP8PROFILE_ANY:
-      *vpx_codec = vpx_codec_vp8_cx();
-      *min_quantizer = kVp8DefaultMinQuantizer;
-      *max_quantizer = kVp8DefaultMaxQuantizer;
-      *cpu_used = kVp8DefaultCpuUsed;
-      break;
-    // Only VP9 profile 0 is supported by PPAPI at the moment. VP9 profiles 1-3
-    // are not supported due to backward compatibility.
-    case media::VP9PROFILE_PROFILE0:
-      *vpx_codec = vpx_codec_vp9_cx();
-      *min_quantizer = kVp9DefaultMinQuantizer;
-      *max_quantizer = kVp9DefaultMaxQuantizer;
-      *cpu_used = kVp9DefaultCpuUsed;
-      break;
-    default:
-      NOTREACHED();
-  }
-}
-
-}  // namespace
-
-class VideoEncoderShim::EncoderImpl {
- public:
-  explicit EncoderImpl(const base::WeakPtr<VideoEncoderShim>& shim);
-  ~EncoderImpl();
-
-  void Initialize(const media::VideoEncodeAccelerator::Config& config);
-  void Encode(scoped_refptr<media::VideoFrame> frame, bool force_keyframe);
-  void UseOutputBitstreamBuffer(media::BitstreamBuffer buffer, uint8_t* mem);
-  void RequestEncodingParametersChange(const media::Bitrate& bitrate,
-                                       uint32_t framerate,
-                                       const std::optional<gfx::Size>& size);
-  void Stop();
-
- private:
-  struct PendingEncode {
-    PendingEncode(scoped_refptr<media::VideoFrame> frame, bool force_keyframe)
-        : frame(std::move(frame)), force_keyframe(force_keyframe) {}
-    ~PendingEncode() {}
-
-    scoped_refptr<media::VideoFrame> frame;
-    bool force_keyframe;
-  };
-
-  struct BitstreamBuffer {
-    BitstreamBuffer(media::BitstreamBuffer buffer, uint8_t* mem)
-        : buffer(std::move(buffer)), mem(mem) {}
-    BitstreamBuffer(BitstreamBuffer&&) = default;
-    ~BitstreamBuffer() {}
-
-    media::BitstreamBuffer buffer;
-    raw_ptr<uint8_t> mem;
-  };
-
-  void DoEncode();
-  void NotifyErrorStatus(const media::EncoderStatus& status);
-
-  base::WeakPtr<VideoEncoderShim> shim_;
-  scoped_refptr<base::SingleThreadTaskRunner> renderer_task_runner_;
-
-  bool initialized_;
-
-  // Libvpx internal objects. Only valid if |initialized_| is true.
-  vpx_codec_enc_cfg_t config_;
-  vpx_codec_ctx_t encoder_;
-
-  uint32_t framerate_;
-
-  base::circular_deque<PendingEncode> frames_;
-  base::circular_deque<BitstreamBuffer> buffers_;
-};
-
-VideoEncoderShim::EncoderImpl::EncoderImpl(
-    const base::WeakPtr<VideoEncoderShim>& shim)
-    : shim_(shim),
-      renderer_task_runner_(base::SingleThreadTaskRunner::GetCurrentDefault()),
-      initialized_(false) {}
-
-VideoEncoderShim::EncoderImpl::~EncoderImpl() {
-  if (initialized_)
-    vpx_codec_destroy(&encoder_);
-}
-
-void VideoEncoderShim::EncoderImpl::Initialize(const Config& config) {
-  gfx::Size coded_size = media::VideoFrame::PlaneSize(
-      config.input_format, 0, config.input_visible_size);
-
-  // Only VP9 profile 0 is supported by PPAPI at the moment. VP9 profiles 1-3
-  // are not supported due to backward compatibility.
-  DCHECK_NE(config.output_profile, media::VP9PROFILE_PROFILE1);
-  DCHECK_NE(config.output_profile, media::VP9PROFILE_PROFILE2);
-  DCHECK_NE(config.output_profile, media::VP9PROFILE_PROFILE3);
-
-  vpx_codec_iface_t* vpx_codec;
-  int32_t min_quantizer, max_quantizer, cpu_used;
-  GetVpxCodecParameters(config.output_profile, &vpx_codec, &min_quantizer,
-                        &max_quantizer, &cpu_used);
-
-  // Populate encoder configuration with default values.
-  if (vpx_codec_enc_config_default(vpx_codec, &config_, 0) != VPX_CODEC_OK) {
-    NotifyErrorStatus(media::EncoderStatus::Codes::kEncoderInitializationError);
-    return;
-  }
-
-  config_.g_w = config.input_visible_size.width();
-  config_.g_h = config.input_visible_size.height();
-
-  framerate_ = config_.g_timebase.den;
-
-  config_.g_lag_in_frames = 0;
-  config_.g_timebase.num = 1;
-  config_.g_timebase.den = base::Time::kMicrosecondsPerSecond;
-  config_.rc_target_bitrate = config.bitrate.target_bps() / 1000;
-  config_.rc_min_quantizer = min_quantizer;
-  config_.rc_max_quantizer = max_quantizer;
-  // Do not saturate CPU utilization just for encoding. On a lower-end system
-  // with only 1 or 2 cores, use only one thread for encoding. On systems with
-  // more cores, allow half of the cores to be used for encoding.
-  config_.g_threads =
-      std::min(kMaxNumThreads, (base::SysInfo::NumberOfProcessors() + 1) / 2);
-
-  // Use Q/CQ mode if no target bitrate is given. Note that in the VP8/CQ case
-  // the meaning of rc_target_bitrate changes to target maximum rate.
-  if (config.bitrate.target_bps() == 0) {
-    if (config.output_profile == media::VP9PROFILE_PROFILE0) {
-      config_.rc_end_usage = VPX_Q;
-    } else if (config.output_profile == media::VP8PROFILE_ANY) {
-      config_.rc_end_usage = VPX_CQ;
-      config_.rc_target_bitrate = kVp8MaxCQBitrate;
-    }
-  }
-
-  vpx_codec_flags_t flags = 0;
-  if (vpx_codec_enc_init(&encoder_, vpx_codec, &config_, flags) !=
-      VPX_CODEC_OK) {
-    NotifyErrorStatus(media::EncoderStatus::Codes::kEncoderInitializationError);
-    return;
-  }
-  initialized_ = true;
-
-  if (vpx_codec_enc_config_set(&encoder_, &config_) != VPX_CODEC_OK) {
-    NotifyErrorStatus(media::EncoderStatus::Codes::kEncoderInitializationError);
-    return;
-  }
-
-  if (vpx_codec_control(&encoder_, VP8E_SET_CPUUSED, cpu_used) !=
-      VPX_CODEC_OK) {
-    NotifyErrorStatus(media::EncoderStatus::Codes::kEncoderInitializationError);
-    return;
-  }
-
-  if (config.output_profile == media::VP9PROFILE_PROFILE0) {
-    if (vpx_codec_control(&encoder_, VP9E_SET_AQ_MODE,
-                          kVp9AqModeCyclicRefresh) != VPX_CODEC_OK) {
-      NotifyErrorStatus(
-          media::EncoderStatus::Codes::kEncoderInitializationError);
-      return;
-    }
-  }
-
-  renderer_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&VideoEncoderShim::OnRequireBitstreamBuffers, shim_,
-                     kInputFrameCount, coded_size, kBitstreamBufferSize));
-}
-
-void VideoEncoderShim::EncoderImpl::Encode(
-    scoped_refptr<media::VideoFrame> frame,
-    bool force_keyframe) {
-  frames_.push_back(PendingEncode(std::move(frame), force_keyframe));
-  DoEncode();
-}
-
-void VideoEncoderShim::EncoderImpl::UseOutputBitstreamBuffer(
-    media::BitstreamBuffer buffer,
-    uint8_t* mem) {
-  buffers_.emplace_back(std::move(buffer), mem);
-  DoEncode();
-}
-
-void VideoEncoderShim::EncoderImpl::RequestEncodingParametersChange(
-    const media::Bitrate& bitrate,
-    uint32_t framerate,
-    const std::optional<gfx::Size>& size) {
-  // If this is changed to use variable bitrate encoding, change the mode check
-  // to check that the mode matches the current mode.
-  if (bitrate.mode() != media::Bitrate::Mode::kConstant) {
-    NotifyErrorStatus(media::EncoderStatus::Codes::kEncoderUnsupportedConfig);
-    return;
-  }
-
-  if (size.has_value()) {
-    NotifyErrorStatus(media::EncoderStatus::Codes::kEncoderUnsupportedConfig);
-    return;
-  }
-
-  framerate_ = framerate;
-
-  uint32_t bitrate_kbit = bitrate.target_bps() / 1000;
-  if (config_.rc_target_bitrate == bitrate_kbit)
-    return;
-
-  config_.rc_target_bitrate = bitrate_kbit;
-  if (vpx_codec_enc_config_set(&encoder_, &config_) != VPX_CODEC_OK) {
-    NotifyErrorStatus(media::EncoderStatus::Codes::kEncoderUnsupportedConfig);
-  }
-}
-
-void VideoEncoderShim::EncoderImpl::Stop() {
-  // Release frames on the renderer thread.
-  while (!frames_.empty()) {
-    PendingEncode frame = frames_.front();
-    frames_.pop_front();
-
-    renderer_task_runner_->ReleaseSoon(FROM_HERE, std::move(frame.frame));
-  }
-  buffers_.clear();
-}
-
-void VideoEncoderShim::EncoderImpl::DoEncode() {
-  while (!frames_.empty() && !buffers_.empty()) {
-    PendingEncode frame = frames_.front();
-    frames_.pop_front();
-
-    // Wrapper for vpx_codec_encode() to access the YUV data in the
-    // |video_frame|. Only the VISIBLE rectangle within |video_frame|
-    // is exposed to the codec.
-    vpx_image_t vpx_image;
-    vpx_image_t* const result = vpx_img_wrap(
-        &vpx_image, VPX_IMG_FMT_I420, frame.frame->visible_rect().width(),
-        frame.frame->visible_rect().height(), 1,
-        const_cast<uint8_t*>(
-            frame.frame->visible_data(media::VideoFrame::Plane::kY)));
-    DCHECK_EQ(result, &vpx_image);
-    vpx_image.planes[VPX_PLANE_Y] = const_cast<uint8_t*>(
-        frame.frame->visible_data(media::VideoFrame::Plane::kY));
-    vpx_image.planes[VPX_PLANE_U] = const_cast<uint8_t*>(
-        frame.frame->visible_data(media::VideoFrame::Plane::kU));
-    vpx_image.planes[VPX_PLANE_V] = const_cast<uint8_t*>(
-        frame.frame->visible_data(media::VideoFrame::Plane::kV));
-    vpx_image.stride[VPX_PLANE_Y] =
-        frame.frame->stride(media::VideoFrame::Plane::kY);
-    vpx_image.stride[VPX_PLANE_U] =
-        frame.frame->stride(media::VideoFrame::Plane::kU);
-    vpx_image.stride[VPX_PLANE_V] =
-        frame.frame->stride(media::VideoFrame::Plane::kV);
-
-    vpx_codec_flags_t flags = 0;
-    if (frame.force_keyframe)
-      flags = VPX_EFLAG_FORCE_KF;
-
-    const base::TimeDelta frame_duration = base::Seconds(1.0 / framerate_);
-    if (vpx_codec_encode(&encoder_, &vpx_image, 0,
-                         frame_duration.InMicroseconds(), flags,
-                         VPX_DL_REALTIME) != VPX_CODEC_OK) {
-      NotifyErrorStatus(media::EncoderStatus::Codes::kEncoderFailedEncode);
-      return;
-    }
-
-    const vpx_codec_cx_pkt_t* packet = nullptr;
-    vpx_codec_iter_t iter = nullptr;
-    while ((packet = vpx_codec_get_cx_data(&encoder_, &iter)) != nullptr) {
-      if (packet->kind != VPX_CODEC_CX_FRAME_PKT)
-        continue;
-
-      BitstreamBuffer buffer = std::move(buffers_.front());
-      buffers_.pop_front();
-
-      CHECK(buffer.buffer.size() >= packet->data.frame.sz);
-      memcpy(buffer.mem, packet->data.frame.buf, packet->data.frame.sz);
-
-      // Pass the media::VideoFrame back to the renderer thread so it's
-      // freed on the right thread.
-      renderer_task_runner_->PostTask(
-          FROM_HERE,
-          base::BindOnce(&VideoEncoderShim::OnBitstreamBufferReady, shim_,
-                         frame.frame, buffer.buffer.id(),
-                         base::checked_cast<size_t>(packet->data.frame.sz),
-                         (packet->data.frame.flags & VPX_FRAME_IS_KEY) != 0));
-      break;  // Done, since all data is provided in one CX_FRAME_PKT packet.
-    }
-  }
-}
-
-void VideoEncoderShim::EncoderImpl::NotifyErrorStatus(
-    const media::EncoderStatus& status) {
-  renderer_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&VideoEncoderShim::OnNotifyErrorStatus, shim_, status));
-  Stop();
-}
-
-VideoEncoderShim::VideoEncoderShim(PepperVideoEncoderHost* host)
-    : host_(host),
-      media_task_runner_(
-          RenderThreadImpl::current()->GetMediaSequencedTaskRunner()) {
-  encoder_impl_ = std::make_unique<EncoderImpl>(weak_ptr_factory_.GetWeakPtr());
-}
-
-VideoEncoderShim::~VideoEncoderShim() {
-  DCHECK(RenderThreadImpl::current());
-
-  media_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&VideoEncoderShim::EncoderImpl::Stop,
-                                base::Owned(encoder_impl_.release())));
-}
-
-media::VideoEncodeAccelerator::SupportedProfiles
-VideoEncoderShim::GetSupportedProfiles() {
-  media::VideoEncodeAccelerator::SupportedProfiles profiles;
-
-  // Get the default VP8 config from Libvpx.
-  vpx_codec_enc_cfg_t config;
-  vpx_codec_err_t ret =
-      vpx_codec_enc_config_default(vpx_codec_vp8_cx(), &config, 0);
-  if (ret == VPX_CODEC_OK) {
-    media::VideoEncodeAccelerator::SupportedProfile profile;
-    profile.profile = media::VP8PROFILE_ANY;
-    profile.max_resolution = gfx::Size(kMaxWidth, kMaxHeight);
-    // Libvpx and media::VideoEncodeAccelerator are using opposite
-    // notions of denominator/numerator.
-    profile.max_framerate_numerator = config.g_timebase.den;
-    profile.max_framerate_denominator = config.g_timebase.num;
-    profile.rate_control_modes = media::VideoEncodeAccelerator::kConstantMode;
-    profiles.push_back(profile);
-  }
-
-  ret = vpx_codec_enc_config_default(vpx_codec_vp9_cx(), &config, 0);
-  if (ret == VPX_CODEC_OK) {
-    media::VideoEncodeAccelerator::SupportedProfile profile;
-    profile.max_resolution = gfx::Size(kMaxWidth, kMaxHeight);
-    profile.max_framerate_numerator = config.g_timebase.den;
-    profile.max_framerate_denominator = config.g_timebase.num;
-    profile.rate_control_modes = media::VideoEncodeAccelerator::kConstantMode;
-    profile.profile = media::VP9PROFILE_PROFILE0;
-    profiles.push_back(profile);
-  }
-
-  return profiles;
-}
-
-media::EncoderStatus VideoEncoderShim::Initialize(
-    const media::VideoEncodeAccelerator::Config& config,
-    media::VideoEncodeAccelerator::Client* client,
-    std::unique_ptr<media::MediaLog> media_log) {
-  DCHECK(RenderThreadImpl::current());
-  DCHECK_EQ(client, host_);
-
-  if (config.input_format != media::PIXEL_FORMAT_I420) {
-    return {media::EncoderStatus::Codes::kEncoderInitializationError};
-  }
-
-  if (config.output_profile != media::VP8PROFILE_ANY &&
-      config.output_profile != media::VP9PROFILE_PROFILE0) {
-    return {media::EncoderStatus::Codes::kEncoderInitializationError};
-  }
-
-  media_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&VideoEncoderShim::EncoderImpl::Initialize,
-                                base::Unretained(encoder_impl_.get()), config));
-
-  return {media::EncoderStatus::Codes::kOk};
-}
-
-void VideoEncoderShim::Encode(scoped_refptr<media::VideoFrame> frame,
-                              bool force_keyframe) {
-  DCHECK(RenderThreadImpl::current());
-
-  media_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&VideoEncoderShim::EncoderImpl::Encode,
-                                base::Unretained(encoder_impl_.get()),
-                                std::move(frame), force_keyframe));
-}
-
-void VideoEncoderShim::UseOutputBitstreamBuffer(media::BitstreamBuffer buffer) {
-  DCHECK(RenderThreadImpl::current());
-
-  media_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&VideoEncoderShim::EncoderImpl::UseOutputBitstreamBuffer,
-                     base::Unretained(encoder_impl_.get()), std::move(buffer),
-                     host_->ShmHandleToAddress(buffer.id())));
-}
-
-void VideoEncoderShim::RequestEncodingParametersChange(
-    const media::Bitrate& bitrate,
-    uint32_t framerate,
-    const std::optional<gfx::Size>& size) {
-  DCHECK(RenderThreadImpl::current());
-
-  media_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(
-          &VideoEncoderShim::EncoderImpl::RequestEncodingParametersChange,
-          base::Unretained(encoder_impl_.get()), bitrate, framerate, size));
-}
-
-void VideoEncoderShim::Destroy() {
-  DCHECK(RenderThreadImpl::current());
-
-  delete this;
-}
-
-void VideoEncoderShim::OnRequireBitstreamBuffers(
-    unsigned int input_count,
-    const gfx::Size& input_coded_size,
-    size_t output_buffer_size) {
-  DCHECK(RenderThreadImpl::current());
-
-  host_->RequireBitstreamBuffers(input_count, input_coded_size,
-                                 output_buffer_size);
-}
-
-void VideoEncoderShim::OnBitstreamBufferReady(
-    scoped_refptr<media::VideoFrame> frame,
-    int32_t bitstream_buffer_id,
-    size_t payload_size,
-    bool key_frame) {
-  DCHECK(RenderThreadImpl::current());
-
-  host_->BitstreamBufferReady(bitstream_buffer_id,
-                              media::BitstreamBufferMetadata(
-                                  payload_size, key_frame, frame->timestamp()));
-}
-
-void VideoEncoderShim::OnNotifyErrorStatus(const media::EncoderStatus& status) {
-  DCHECK(RenderThreadImpl::current());
-
-  host_->NotifyErrorStatus(status);
-}
-
-}  // namespace content
diff --git a/content/renderer/pepper/video_encoder_shim.h b/content/renderer/pepper/video_encoder_shim.h
deleted file mode 100644
index 0bd1388..0000000
--- a/content/renderer/pepper/video_encoder_shim.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2015 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_PEPPER_VIDEO_ENCODER_SHIM_H_
-#define CONTENT_RENDERER_PEPPER_VIDEO_ENCODER_SHIM_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/task/sequenced_task_runner.h"
-#include "media/base/bitrate.h"
-#include "media/base/encoder_status.h"
-#include "media/video/video_encode_accelerator.h"
-
-namespace gfx {
-class Size;
-}
-
-namespace content {
-
-class PepperVideoEncoderHost;
-
-// This class is a shim to wrap a media::cast::SoftwareVideoEncoder so that it
-// can be used by PepperVideoEncoderHost in place of a
-// media::VideoEncodeAccelerator. This class should be constructed, used, and
-// destructed on the main (render) thread.
-class VideoEncoderShim : public media::VideoEncodeAccelerator {
- public:
-  explicit VideoEncoderShim(PepperVideoEncoderHost* host);
-
-  VideoEncoderShim(const VideoEncoderShim&) = delete;
-  VideoEncoderShim& operator=(const VideoEncoderShim&) = delete;
-
-  ~VideoEncoderShim() override;
-
-  // media::VideoEncodeAccelerator implementation.
-  media::VideoEncodeAccelerator::SupportedProfiles GetSupportedProfiles()
-      override;
-  media::EncoderStatus Initialize(
-      const media::VideoEncodeAccelerator::Config& config,
-      media::VideoEncodeAccelerator::Client* client,
-      std::unique_ptr<media::MediaLog> media_log = nullptr) override;
-  void Encode(scoped_refptr<media::VideoFrame> frame,
-              bool force_keyframe) override;
-  void UseOutputBitstreamBuffer(media::BitstreamBuffer buffer) override;
-  void RequestEncodingParametersChange(
-      const media::Bitrate& bitrate,
-      uint32_t framerate,
-      const std::optional<gfx::Size>& size) override;
-  void Destroy() override;
-
- private:
-  class EncoderImpl;
-
-  void OnRequireBitstreamBuffers(unsigned int input_count,
-                                 const gfx::Size& input_coded_size,
-                                 size_t output_buffer_size);
-  void OnBitstreamBufferReady(scoped_refptr<media::VideoFrame> frame,
-                              int32_t bitstream_buffer_id,
-                              size_t payload_size,
-                              bool key_frame);
-  void OnNotifyErrorStatus(const media::EncoderStatus& status);
-
-  std::unique_ptr<EncoderImpl> encoder_impl_;
-
-  raw_ptr<PepperVideoEncoderHost> host_;
-
-  // Task doing the encoding.
-  scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
-
-  base::WeakPtrFactory<VideoEncoderShim> weak_ptr_factory_{this};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_PEPPER_VIDEO_ENCODER_SHIM_H_
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 714670b..921955c 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -101,11 +101,11 @@
 #include "content/renderer/mojo/blink_interface_registry_impl.h"
 #include "content/renderer/navigation_client.h"
 #include "content/renderer/navigation_state.h"
-#include "content/renderer/pepper/pepper_audio_controller.h"
 #include "content/renderer/policy_container_util.h"
 #include "content/renderer/render_process.h"
 #include "content/renderer/render_thread_impl.h"
 #include "content/renderer/renderer_blink_platform_impl.h"
+#include "content/renderer/renderer_navigation_metrics_manager.h"
 #include "content/renderer/service_worker/service_worker_network_provider_for_frame.h"
 #include "content/renderer/service_worker/web_service_worker_provider_impl.h"
 #include "content/renderer/skia_benchmarking_extension.h"
@@ -1698,6 +1698,8 @@
     const blink::DocumentToken& document_token,
     blink::mojom::PolicyContainerPtr policy_container,
     bool is_for_nested_main_frame) {
+  base::ElapsedTimer timer;
+
   // TODO(danakj): Split this method into two pieces. The first block makes a
   // WebLocalFrame and collects the `blink::WebView` and RenderFrame for it. The
   // second block uses that to make a RenderWidget, if needed.
@@ -1849,6 +1851,10 @@
   }
 
   render_frame->Initialize(web_frame->Parent());
+
+  RendererNavigationMetricsManager::Instance().AddCreateFrameEvent(
+      navigation_metrics_token, timer.start_time(), timer.Elapsed());
+  // Add any new code above the AddCreateFrameEvent call.
 }
 
 // static
@@ -2726,6 +2732,8 @@
     mojom::CookieManagerInfoPtr cookie_manager_info,
     mojom::StorageInfoPtr storage_info,
     mojom::NavigationClient::CommitNavigationCallback commit_callback) {
+  RendererNavigationMetricsManager::Instance().MarkCommitStart(
+      commit_params->navigation_metrics_token);
   if (!response_head->client_side_content_decoding_types.empty()) {
     // Attempt to create the data pipe needed for content decoding.
     auto data_pipe_pair =
@@ -3125,6 +3133,8 @@
   TRACE_EVENT1("navigation,benchmark,rail",
                "RenderFrameImpl::CommitFailedNavigation", "frame_token",
                frame_token_);
+  RendererNavigationMetricsManager::Instance().MarkCommitStart(
+      commit_params->navigation_metrics_token);
   DCHECK(navigation_client_impl_);
   DCHECK(!NavigationTypeUtils::IsSameDocument(common_params->navigation_type));
 
@@ -3312,12 +3322,16 @@
     blink::mojom::CommonNavigationParamsPtr common_params,
     blink::mojom::CommitNavigationParamsPtr commit_params,
     CommitSameDocumentNavigationCallback callback) {
+  RendererNavigationMetricsManager::Instance().MarkCommitStart(
+      commit_params->navigation_metrics_token);
+
   DCHECK(!blink::IsRendererDebugURL(common_params->url));
   DCHECK(!NavigationTypeUtils::IsReload(common_params->navigation_type));
   DCHECK(!commit_params->is_view_source);
   DCHECK(NavigationTypeUtils::IsSameDocument(common_params->navigation_type));
 
   CHECK(in_frame_tree_);
+
   // Unlike a cross-document navigation commit, detach the MHTMLBodyLoaderClient
   // before resetting it. In the case of a cross-document navigation, it's
   // important to ensure *something* commits, even if the original commit
@@ -5344,6 +5358,17 @@
     main_frame_intersection_rect_.reset();
     main_frame_viewport_rect_.reset();
   }
+
+  // Record metrics and trace events for the navigation that was just committed.
+  // For the navigation start time, use `actual_navigation_start` from
+  // common_params() instead of `navigation_start`, since the latter might've
+  // been adjusted by beforeunload handling, and it's important to use the
+  // non-adjusted version for trace events.
+  RendererNavigationMetricsManager::Instance().ProcessNavigationCommit(
+      navigation_state->commit_params().navigation_metrics_token,
+      navigation_state->common_params().url,
+      navigation_state->common_params().actual_navigation_start);
+  // Add any new code above the ProcessNavigationCommit call.
 }
 
 void RenderFrameImpl::PrepareFrameForCommit(
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index 59ccb3b..e54e804 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -56,6 +56,7 @@
 #include "content/renderer/media/renderer_webaudiodevice_impl.h"
 #include "content/renderer/render_frame_impl.h"
 #include "content/renderer/render_thread_impl.h"
+#include "content/renderer/renderer_navigation_metrics_manager.h"
 #include "content/renderer/service_worker/controller_service_worker_connector.h"
 #include "content/renderer/service_worker/service_worker_subresource_loader.h"
 #include "content/renderer/v8_value_converter_impl.h"
@@ -999,6 +1000,16 @@
 }
 
 //------------------------------------------------------------------------------
+
+void RendererBlinkPlatformImpl::AddCreateRemoteChildrenEvent(
+    const std::optional<base::UnguessableToken>& navigation_metrics_token,
+    const base::TimeTicks& start_time,
+    const base::TimeDelta& elapsed_time) {
+  RendererNavigationMetricsManager::Instance().AddCreateRemoteChildrenEvent(
+      navigation_metrics_token, start_time, elapsed_time);
+}
+
+//------------------------------------------------------------------------------
 media::GpuVideoAcceleratorFactories*
 RendererBlinkPlatformImpl::GetGpuFactories() {
   auto* render_thread = RenderThreadImpl::current();
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h
index 2b6f49b6..b4fc08d 100644
--- a/content/renderer/renderer_blink_platform_impl.h
+++ b/content/renderer/renderer_blink_platform_impl.h
@@ -223,6 +223,10 @@
       blink::MediaInspectorContext* inspector_context,
       scoped_refptr<base::SingleThreadTaskRunner> owner_task_runner,
       bool is_on_worker) override;
+  void AddCreateRemoteChildrenEvent(
+      const std::optional<base::UnguessableToken>& navigation_metrics_token,
+      const base::TimeTicks& start_time,
+      const base::TimeDelta& elapsed_time) override;
   media::GpuVideoAcceleratorFactories* GetGpuFactories() override;
   scoped_refptr<base::SequencedTaskRunner> MediaThreadTaskRunner() override;
   base::WeakPtr<media::DecoderFactory> GetMediaDecoderFactory() override;
diff --git a/content/renderer/renderer_navigation_metrics_manager.cc b/content/renderer/renderer_navigation_metrics_manager.cc
new file mode 100644
index 0000000..b6df2bb
--- /dev/null
+++ b/content/renderer/renderer_navigation_metrics_manager.cc
@@ -0,0 +1,322 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/renderer/renderer_navigation_metrics_manager.h"
+
+#include "base/check.h"
+#include "base/containers/contains.h"
+#include "base/logging.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/no_destructor.h"
+#include "base/task/thread_pool.h"
+#include "base/trace_event/trace_event.h"
+#include "base/trace_event/trace_id_helper.h"
+#include "content/renderer/render_thread_impl.h"
+
+namespace content {
+
+namespace {
+
+// If a navigation hasn't completed within this timeout, its timeline data will
+// be cleaned up. See also cleanup comments in GetOrCreateTimeline() below.
+constexpr base::TimeDelta kLazyCleanupTimeout = base::Seconds(300);
+
+// Kill switch for `RendererNavigationMetricsManager`'s generation of renderer
+// trace events and metrics, in case they cause any unexpected overhead or other
+// issues. See https://crbug.com/415821826.
+BASE_FEATURE(kEnableRendererNavigationTimeline,
+             "EnableRendererNavigationTimeline",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
+}  // namespace
+
+RendererNavigationMetricsManager& RendererNavigationMetricsManager::Instance() {
+  static base::NoDestructor<RendererNavigationMetricsManager> manager;
+  return *manager.get();
+}
+
+RendererNavigationMetricsManager::RendererNavigationMetricsManager() = default;
+RendererNavigationMetricsManager::~RendererNavigationMetricsManager() = default;
+
+RendererNavigationMetricsManager::Timeline::Timeline() = default;
+RendererNavigationMetricsManager::Timeline::~Timeline() = default;
+
+RendererNavigationMetricsManager::Timeline&
+RendererNavigationMetricsManager::GetOrCreateTimeline(
+    const base::UnguessableToken& navigation_metrics_token) {
+  auto it = timelines_.find(navigation_metrics_token);
+  if (it != timelines_.end()) {
+    return it->second;
+  }
+
+  // Create a new Timeline object for this navigation.
+  Timeline& timeline = timelines_[navigation_metrics_token];
+
+  // Post a task to clean up the new timeline after a timeout, if the
+  // corresponding navigation hasn't finished by then.
+  //
+  // Ideally, we would detect navigation cancellation and remove the timeline at
+  // that point. Unfortunately, this is not as easy as it seems:
+  // - IPCs for destroying previously created proxies, views, and provisional
+  //   frames would all have to identify which navigation they pertained to, if
+  //   any, which would add a lot of complexity.
+  // - detecting NavigationClient interface disconnection seems promising, but
+  //   unfortunately doesn't work for cross-process browser-initiated
+  //   navigations where the commit NavigationClient isn't set up until
+  //   ready-to-commit time, after proxy/view creation.
+  //
+  // As a longer-term solution, it might be possible to set up the commit
+  // NavigationClient earlier and the corresponding `Timeline` directly on it.
+  // However, this will also be tricky, since the current NavigationClient
+  // lifetime also impacts web compatibility, by defining when a
+  // renderer-initiated navigation may be canceled by JavaScript - see comments
+  // on `RenderFrameImpl::navigation_client_impl_`.
+  timeline.lazy_cleanup_timer_.Start(
+      FROM_HERE, kLazyCleanupTimeout,
+      base::BindOnce(
+          [](const base::UnguessableToken& token) {
+            RendererNavigationMetricsManager::Instance().timelines_.erase(
+                token);
+          },
+          navigation_metrics_token));
+
+  // Remember that this process has started at least one navigation.
+  timeline.is_first_navigation_in_this_process = !has_first_navigation_started_;
+  has_first_navigation_started_ = true;
+
+  return timeline;
+}
+
+void RendererNavigationMetricsManager::AddCreateViewEvent(
+    const std::optional<base::UnguessableToken>& navigation_metrics_token,
+    const base::TimeTicks& start_time,
+    const base::TimeDelta& elapsed_time) {
+  if (!base::FeatureList::IsEnabled(kEnableRendererNavigationTimeline)) {
+    return;
+  }
+
+  // Don't record any metrics if this event was not for a navigation.
+  if (!navigation_metrics_token) {
+    return;
+  }
+
+  auto& timeline = GetOrCreateTimeline(*navigation_metrics_token);
+  timeline.create_view_events.emplace_back(start_time,
+                                           start_time + elapsed_time);
+}
+
+void RendererNavigationMetricsManager::AddCreateRemoteChildrenEvent(
+    const std::optional<base::UnguessableToken>& navigation_metrics_token,
+    const base::TimeTicks& start_time,
+    const base::TimeDelta& elapsed_time) {
+  if (!base::FeatureList::IsEnabled(kEnableRendererNavigationTimeline)) {
+    return;
+  }
+
+  // Don't record any metrics if this event was not for a navigation.
+  if (!navigation_metrics_token) {
+    return;
+  }
+
+  auto& timeline = GetOrCreateTimeline(*navigation_metrics_token);
+  timeline.create_remote_children_events.emplace_back(
+      start_time, start_time + elapsed_time);
+}
+
+void RendererNavigationMetricsManager::AddCreateFrameEvent(
+    const std::optional<base::UnguessableToken>& navigation_metrics_token,
+    const base::TimeTicks& start_time,
+    const base::TimeDelta& elapsed_time) {
+  if (!base::FeatureList::IsEnabled(kEnableRendererNavigationTimeline)) {
+    return;
+  }
+
+  // Don't record any metrics if this event was not for a navigation.
+  if (!navigation_metrics_token) {
+    return;
+  }
+
+  auto& timeline = GetOrCreateTimeline(*navigation_metrics_token);
+
+  // Typically, there's one CreateFrame call per navigation, corresponding to
+  // the provisional frame that will eventually commit the navigation. However,
+  // it's possible that a navigation will pick a different RenderFrame at
+  // response time, which could end up being created in the same renderer
+  // process. In this case, for now, capture the start/end times of the latest
+  // CreateFrame call (which is more relevant for navigation latency), by
+  // overwriting the start/end times if they already exist. In the future,
+  // these calls could potentially be tracked as separate events.
+  timeline.create_frame_event.emplace(start_time, start_time + elapsed_time);
+}
+
+void RendererNavigationMetricsManager::MarkCommitStart(
+    const base::UnguessableToken& navigation_metrics_token) {
+  if (!base::FeatureList::IsEnabled(kEnableRendererNavigationTimeline)) {
+    return;
+  }
+
+  GetOrCreateTimeline(navigation_metrics_token).commit_start =
+      base::TimeTicks().Now();
+}
+
+void RendererNavigationMetricsManager::RecordTraceEventsAndMetrics(
+    const RendererNavigationMetricsManager::Timeline& timeline,
+    const GURL& url) {
+  CHECK(!timeline.navigation_start.is_null())
+      << "Navigation start time not found for " << url;
+
+  RenderThreadImpl* render_thread = RenderThreadImpl::current();
+  // The `render_thread` may be null in tests.
+  if (!render_thread) {
+    return;
+  }
+
+  // Record these trace events in a global "Navigations" track, so that it can
+  // be found under "Global Track Events". This complements events logged
+  // from the browser process into the same track.
+  constexpr uint64_t kGlobalInstantTrackId = 0;
+  static perfetto::NamedTrack track(
+      "Navigation: Timelines (Renderer)",
+      base::trace_event::GetNextGlobalTraceId(),
+      perfetto::Track::Global(kGlobalInstantTrackId));
+
+  // Define a helper to log both a trace event slice and a corresponding metric
+  // for one stage of a navigation.
+  //
+  // Note: A similar helper exists to log browser-side navigation timeline
+  // events in RecordNavigationTraceEventsAndMetrics(). When adding new code
+  // here, consider whether the browser-side helper also needs to be updated.
+  // It might be desirable to merge the two helpers in the future.
+  auto log_trace_event_and_uma =
+      [&](perfetto::StaticString name, const base::TimeTicks& begin_time,
+          const base::TimeTicks& end_time,
+          const std::optional<std::string>& histogram_name = std::nullopt,
+          const std::optional<std::string>& url = std::nullopt) {
+        if (begin_time.is_null() || end_time.is_null()) {
+          return;
+        }
+
+        TRACE_EVENT_BEGIN(
+            "navigation", name, track, begin_time,
+            [&](perfetto::EventContext& ctx) {
+              if (!url.has_value()) {
+                return;
+              }
+              perfetto::protos::pbzero::PageLoad* page_load =
+                  ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>()
+                      ->set_page_load();
+              page_load->set_url(*url);
+            });
+        TRACE_EVENT_END("navigation", track, end_time);
+
+        // When provided, `histogram_name` is used to avoid including variable
+        // or sensitive data in the reported metric name. For example, `name`
+        // may include the navigation URL when measuring the start-to-finish
+        // time, but we only want to use that for trace events and omit the
+        // URL in metric names for UMA.
+        base::UmaHistogramTimes(
+            base::StrCat({"Navigation.Renderer.Timeline.",
+                          histogram_name.value_or(std::string(name.value)),
+                          ".Duration"}),
+            end_time - begin_time);
+      };
+
+  // Actual navigation events are logged below in contiguous (or nested)
+  // intervals.
+  // TODO(crbug.com/405437928): Overlapping navigations may incorrectly appear
+  // to be nested, using the wrong end times.
+  log_trace_event_and_uma("Renderer Navigation", timeline.navigation_start,
+                          timeline.commit_end,
+                          /*histogram_name=*/"Total");
+
+  // Emit a trace event with url in the name for convenience. Do this in a
+  // separate trace event from the one above, since events with dynamic strings
+  // are filtered out in some traces, and the event above would still be useful
+  // in that case.
+  // TODO(crbug.com/415720503): Remove once Perfetto navigation plugins surfaces
+  // urls.
+  std::string top_level_trace_event_name = "URL: " + url.spec();
+  TRACE_EVENT_BEGIN("navigation",
+                    perfetto::DynamicString(top_level_trace_event_name), track,
+                    timeline.navigation_start);
+  TRACE_EVENT_END("navigation", track, timeline.commit_end);
+
+  // It's possible that the process was still starting when the navigation
+  // started. In that case, record an event which measures the time for the
+  // process to finish starting up and become ready for processing IPCs, and
+  // treat that point as the starting point for the next event.
+  base::TimeTicks process_ready_time = render_thread->run_loop_start_time();
+  if (timeline.navigation_start < process_ready_time) {
+    log_trace_event_and_uma("WaitingForProcessReady", timeline.navigation_start,
+                            process_ready_time);
+  } else if (timeline.is_first_navigation_in_this_process) {
+    // If this was the first navigation in this renderer process, and the
+    // process was ready before the navigation started, record a zero-sized
+    // event for WaitingForProcessReady. This allows measuring how much of a
+    // problem process startup costs are for navigations in a freshly created
+    // process.
+    log_trace_event_and_uma("WaitingForProcessReady", timeline.navigation_start,
+                            timeline.navigation_start);
+  }
+
+  // Create an event for each CreateView IPC. There could be multiple if there
+  // are multiple pages on the navigating frame's opener chain. There could also
+  // be no CreateView IPCs at all, for example if a subframe navigates
+  // same-origin.
+  for (const auto& event : timeline.create_view_events) {
+    log_trace_event_and_uma("CreateView", event.start, event.end);
+  }
+
+  // Create an event for each CreateRemoteChildren IPC, which creates all
+  // subframe proxies for a particular page/frame tree. There could be multiple
+  // of these IPCs per navigation if there are multiple pages on the navigating
+  // frame's opener chain. Note that main frame proxies are created as part of
+  // CreateView, and while there is also a CreateRemoteChild IPC to create
+  // an individual proxy, it is not currently used in the navigation flow, so it
+  // is not traced here.
+  for (const auto& event : timeline.create_remote_children_events) {
+    log_trace_event_and_uma("CreateChildProxies", event.start, event.end);
+  }
+
+  // Create an event for processing the CreateFrame IPC. Note that CreateFrame
+  // may not happen if the navigation is staying in a previous RenderFrame, e.g.
+  // for browser-initiated same-document navigations, navigations out of the
+  // initial empty document, or same-site navigations when RenderDocument is
+  // turned off.
+  if (timeline.create_frame_event) {
+    log_trace_event_and_uma("CreateFrame", timeline.create_frame_event->start,
+                            timeline.create_frame_event->end);
+  }
+
+  log_trace_event_and_uma("CommitToDidCommit", timeline.commit_start,
+                          timeline.commit_end);
+}
+
+void RendererNavigationMetricsManager::ProcessNavigationCommit(
+    const base::UnguessableToken& navigation_metrics_token,
+    const GURL& url,
+    const base::TimeTicks& navigation_start_time) {
+  if (!base::FeatureList::IsEnabled(kEnableRendererNavigationTimeline)) {
+    return;
+  }
+
+  auto it = timelines_.find(navigation_metrics_token);
+  // The timeline may not exist for synchronous about:blank commits or
+  // renderer-initiated same-document navigations. For now, do not record
+  // anything for these cases.
+  if (it == timelines_.end()) {
+    return;
+  }
+
+  auto& timeline = it->second;
+  timeline.navigation_start = navigation_start_time;
+  timeline.commit_end = base::TimeTicks().Now();
+  RecordTraceEventsAndMetrics(timeline, url);
+
+  // Remove the timeline from the map and cancel the cleanup timer.
+  timeline.lazy_cleanup_timer_.Stop();
+  timelines_.erase(it);
+}
+
+}  // namespace content
diff --git a/content/renderer/renderer_navigation_metrics_manager.h b/content/renderer/renderer_navigation_metrics_manager.h
new file mode 100644
index 0000000..34d733b9e
--- /dev/null
+++ b/content/renderer/renderer_navigation_metrics_manager.h
@@ -0,0 +1,198 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_RENDERER_RENDERER_NAVIGATION_METRICS_MANAGER_H_
+#define CONTENT_RENDERER_RENDERER_NAVIGATION_METRICS_MANAGER_H_
+
+#include <map>
+
+#include "base/time/time.h"
+#include "base/timer/timer.h"
+#include "base/unguessable_token.h"
+#include "content/common/content_export.h"
+#include "url/gurl.h"
+
+namespace content {
+
+// This class collects start and end times of different events pertaining to
+// navigations in the renderer process. These events include RenderView/WebView
+// creation, proxy creation, (possibly provisional) frame creation, and
+// navigation commit. The main goal is to output a trace with the renderer's
+// view of navigation events, as well as to record metrics for durations of
+// those events. This is done by calling `RecordTraceEventsAndMetrics()` when a
+// navigation finishes committing. The
+// RendererNavigationMetricsManager::Timeline struct below keeps all the
+// necessary timestamps for a single navigation.
+//
+// Multiple navigations may be in progress in the same renderer process, so this
+// class keeps a map of Timelines keyed by "navigation metrics tokens", which
+// are passed in by the browser process in IPCs related to navigations. Each
+// navigation has a unique navigation metrics token, with the source of truth
+// stored in the NavigationRequest.
+//
+// If a navigation starts creating view/frame/proxy objects but ends up not
+// committing in this process, such as after a cross-process redirect or if the
+// navigation is explicitly canceled by the user or another navigation, its
+// timeline data is cleaned up lazily. In particular, a navigation's timestamps
+// are cleaned up if the navigation hasn't committed after a 5-minute timeout -
+// see note in RendererNavigationMetricsManager::GetOrCreateTimeline() about how
+// this works, and why using explicit cancellation signals is hard. The goal is
+// to change this into explicit cleanup in the future by improving signals for
+// navigation cancellations and making them aware of navigation metrics tokens.
+//
+// There is one global RendererNavigationMetricsManager object in each renderer
+// process, accessible via the `Instance()` method below.
+class CONTENT_EXPORT RendererNavigationMetricsManager {
+ public:
+  RendererNavigationMetricsManager();
+
+  static RendererNavigationMetricsManager& Instance();
+
+  // This struct keeps a set of timestamps for performing a particular
+  // navigation in the renderer process. It is created when the very first IPC
+  // associated with this navigation is processed, which is typically
+  // CreateView or CreateFrame.
+  struct Timeline {
+    Timeline();
+    ~Timeline();
+
+    // The time at which this navigation was started, without any beforeunload
+    // adjustments. Note that navigation start might have happened in another
+    // process (e.g., browser process or another renderer process).
+    base::TimeTicks navigation_start;
+
+    // Helper struct that holds a start/end time for a particular event.
+    struct TimelineEvent {
+      base::TimeTicks start;
+      base::TimeTicks end;
+    };
+
+    // A set of <start, end> timestamps for processing all CreateView IPCs for
+    // this navigation. These IPCs set up the blink::WebView and main frame
+    // frame or proxy for the navigating frame and its opener Pages/FrameTrees,
+    // if any.
+    std::vector<TimelineEvent> create_view_events;
+
+    // A set of <start, end> timestamps for processing all CreateRemoteChildren
+    // IPCs that create all necessary subframe proxies for this navigation.
+    // There is one pair  of timestamps for each Page/FrameTree that needed
+    // subframe proxies, including the navigating frame's page as well as
+    // its opener chain.
+    std::vector<TimelineEvent> create_remote_children_events;
+
+    // Start and end times for the CreateFrame IPC. This should exist for most
+    // navigations, but could end up nullopt when a navigation stays in the same
+    // RenderFrame, such as for same-document navigations or navigations out of
+    // an initial blank document.
+    std::optional<TimelineEvent> create_frame_event;
+
+    // The time at which this navigation started processing the CommitNavigation
+    // IPC.
+    base::TimeTicks commit_start;
+
+    // The time at which this navigation finished processing the
+    // CommitNavigation IPC.
+    base::TimeTicks commit_end;
+
+    // A timer that's set at the time this Timeline object is created (i.e.,
+    // when the very first IPC for this navigation is processed), to clean up
+    // the Timeline if this navigation ends up never committing. See a note
+    // about this in RendererNavigationMetricsManager::GetOrCreateTimeline().
+    base::OneShotTimer lazy_cleanup_timer_;
+
+    // Whether this Timeline is for the first navigation in this renderer
+    // process. This is needed to report a single zero-sized
+    // WaitingForProcessReady event in cases that the renderer is ready before
+    // the first navigation begins, to give a sense of how often a process
+    // is ready to go when it's needed for a navigation.
+    bool is_first_navigation_in_this_process;
+  };
+
+  // The following methods are called to add timestamps for processing the
+  // CreateView, CreateRemoteChildren, and CreateFrame IPCs, for a navigation
+  // identified by `navigation_metrics_token`. Note that there might be multiple
+  // CreateView and CreateRemoteChildren IPCs per navigation, since one is sent
+  // for each page/FrameTree, and there could be multiple pages involved with
+  // opener chains. In this case, AddCreateViewEvent and
+  // AddCreateRemoteChildrenEvent might be called multiple times and will record
+  // a list of <start,end> timestamps.
+  //
+  // The normal expected sequence of these events is:
+  // - each page (if any) on the opener chain will generate a CreateView event
+  //   followed by a CreateRemoteChildren event for any subframe proxies on that
+  //   page.
+  // - the page with the navigating frame will generate an optional CreateView
+  //   event (if a main frame/proxy needs to be created), followed by an
+  //   optional CreateRemoteChildren event (if any subframe proxies need to be
+  //   created).
+  // - the navigating frame will generate an optional CreateFrame event (when it
+  //   navigates in a new RenderFrame).
+  //
+  // Note that a navigation could involve no CreateView IPCs at all (e.g., in
+  // same-origin navigations). It could also involve no CreateFrame IPCs if the
+  // navigation is staying in a previous RenderFrame, such as when performing a
+  // same-document navigation, or navigating out of an initial blank document
+  // where RenderDocument is not used.
+  void AddCreateViewEvent(
+      const std::optional<base::UnguessableToken>& navigation_metrics_token,
+      const base::TimeTicks& start_time,
+      const base::TimeDelta& elapsed_time);
+  void AddCreateRemoteChildrenEvent(
+      const std::optional<base::UnguessableToken>& navigation_metrics_token,
+      const base::TimeTicks& start_time,
+      const base::TimeDelta& elapsed_time);
+  void AddCreateFrameEvent(
+      const std::optional<base::UnguessableToken>& navigation_metrics_token,
+      const base::TimeTicks& start_time,
+      const base::TimeDelta& elapsed_time);
+
+  // Set the time at which the renderer process started processing the
+  // CommitNavigation IPC for the navigation identified by
+  // `navigation_metrics_token`. This is not guaranteed to happen for all
+  // navigations - in particular, renderer-initiated same-document navigations
+  // and synchronous about:blank navigations do not involve a commit IPC from
+  // the browser process.
+  //
+  // TODO(crbug.com/415821826): Consider still calling this at the start of
+  // commit for those cases and recording a timeline for them as well.
+  void MarkCommitStart(const base::UnguessableToken& navigation_metrics_token);
+
+  // This is called when a navigation to `url` and identified by
+  // `navigation_metrics_token` has finished committing in the renderer process.
+  // This is a signal for this class to generate trace events and metrics using
+  // all the timestamps collected so far for it. `navigation_start_time`
+  // identifies the time at which this navigation was started, possibly in
+  // another process.
+  void ProcessNavigationCommit(
+      const base::UnguessableToken& navigation_metrics_token,
+      const GURL& url,
+      const base::TimeTicks& navigation_start_time);
+
+ private:
+  ~RendererNavigationMetricsManager();
+
+  Timeline& GetOrCreateTimeline(
+      const base::UnguessableToken& navigation_metrics_token);
+
+  // Records trace events and metrics for a particular navigation, using
+  // timestamps in the provided `timeline`. `url` is used to log a trace event
+  // that contains the navigation's final URL for convenience.
+  void RecordTraceEventsAndMetrics(
+      const RendererNavigationMetricsManager::Timeline& timeline,
+      const GURL& url);
+
+  // A map of navigation metrics tokens to corresponding Timeline objects.
+  std::map<base::UnguessableToken, Timeline> timelines_;
+
+  // Whether or not a first navigation in this renderer process has started.
+  // This is used to report a single zero-sized WaitingForProcessReady per
+  // process in any cases that the process was ready before the first
+  // navigation, which indicates how often the process is ready to go when it's
+  // needed for a navigation.
+  bool has_first_navigation_started_ = false;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_RENDERER_RENDERER_NAVIGATION_METRICS_MANAGER_H_
diff --git a/extensions/browser/api/messaging/message_service.cc b/extensions/browser/api/messaging/message_service.cc
index 7b4abbdc..5cfdf372 100644
--- a/extensions/browser/api/messaging/message_service.cc
+++ b/extensions/browser/api/messaging/message_service.cc
@@ -143,7 +143,8 @@
 // offer the possibility to restart a closed connection to a previous state.
 constexpr const char* kDefaultSWExtendedLifetimeList[] = {
     // Smart Card Connector
-    "chrome-extension://khpfeaanjngmcnplbdlpegiifgpfgdco/",
+    "chrome-extension://khpfeaanjngmcnplbdlpegiifgpfgdco/",  // stable
+    "chrome-extension://mockcojkppdndnhgonljagclgpkjbkek/",  // beta
 
     // Citrix Receiver
     "chrome-extension://haiffjcadagjlijoggckpgfnoeiflnem/",  // stable
diff --git a/extensions/browser/api/web_request/web_request_proxying_webtransport.cc b/extensions/browser/api/web_request/web_request_proxying_webtransport.cc
index 233ce8b..b47b96c 100644
--- a/extensions/browser/api/web_request/web_request_proxying_webtransport.cc
+++ b/extensions/browser/api/web_request/web_request_proxying_webtransport.cc
@@ -147,6 +147,8 @@
 
   // WebTransportHandshakeClient implementation:
   // Proxing should be finished with either of below functions.
+  void OnBeforeConnect(const net::IPEndPoint& server_address) override {}
+
   void OnConnectionEstablished(
       mojo::PendingRemote<network::mojom::WebTransport> transport,
       mojo::PendingReceiver<network::mojom::WebTransportClient> client,
diff --git a/extensions/browser/api_test_utils.cc b/extensions/browser/api_test_utils.cc
index da1d301ad..63da6d2 100644
--- a/extensions/browser/api_test_utils.cc
+++ b/extensions/browser/api_test_utils.cc
@@ -135,7 +135,8 @@
     FunctionMode mode) {
   RunFunction(function, std::move(args), std::move(dispatcher), mode);
   EXPECT_TRUE(function->GetError().empty())
-      << "Unexpected error: " << function->GetError();
+      << "Function " << function->name()
+      << " had unexpected error: " << function->GetError();
   const base::Value::List* results = function->GetResultListForTest();
   if (!results || results->empty()) {
     return std::nullopt;
diff --git a/extensions/browser/extension_registrar.h b/extensions/browser/extension_registrar.h
index 1b29862..2f66850 100644
--- a/extensions/browser/extension_registrar.h
+++ b/extensions/browser/extension_registrar.h
@@ -10,6 +10,7 @@
 
 #include "base/containers/span.h"
 #include "base/files/file_path.h"
+#include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
diff --git a/extensions/common/BUILD.gn b/extensions/common/BUILD.gn
index 085b9ba0..7b1bbc9 100644
--- a/extensions/common/BUILD.gn
+++ b/extensions/common/BUILD.gn
@@ -5,7 +5,6 @@
 import("//build/config/chromeos/ui_mode.gni")
 import("//build/config/features.gni")
 import("//components/guest_view/buildflags/buildflags.gni")
-import("//components/nacl/features.gni")
 import("//extensions/buildflags/buildflags.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
 import("//testing/libfuzzer/fuzzer_test.gni")
@@ -548,7 +547,6 @@
     "//build:chromeos_buildflags",
     "//components/crash/core/common",
     "//components/crx_file",
-    "//components/nacl/common:buildflags",
     "//components/pdf/common:util",
     "//components/safe_browsing/core/common",
     "//components/safe_browsing/core/common/hashprefix_realtime:hash_realtime_utils",
@@ -578,13 +576,6 @@
     "//url",
   ]
 
-  if (enable_nacl) {
-    sources += [
-      "manifest_handlers/nacl_modules_handler.cc",
-      "manifest_handlers/nacl_modules_handler.h",
-    ]
-  }
-
   if (is_chromeos) {
     sources += [
       "manifest_handlers/input_components_handler.cc",
diff --git a/extensions/common/DEPS b/extensions/common/DEPS
index 4c7092d..11ccd90 100644
--- a/extensions/common/DEPS
+++ b/extensions/common/DEPS
@@ -3,7 +3,6 @@
   "+components/crx_file",
   "+components/url_formatter",
   "+tools/json_schema_compiler",
-  "+components/nacl/common/buildflags.h",
   "+components/pdf/common/pdf_util.h",
   "+components/safe_browsing/core/common",
   "+components/safe_browsing/core/common/hashprefix_realtime",
diff --git a/extensions/common/common_manifest_handlers.cc b/extensions/common/common_manifest_handlers.cc
index dec15d3..88d0bb22 100644
--- a/extensions/common/common_manifest_handlers.cc
+++ b/extensions/common/common_manifest_handlers.cc
@@ -7,7 +7,6 @@
 #include <memory>
 
 #include "build/chromeos_buildflags.h"
-#include "components/nacl/common/buildflags.h"
 #include "extensions/common/api/bluetooth/bluetooth_manifest_handler.h"
 #include "extensions/common/api/commands/commands_handler.h"
 #include "extensions/common/api/declarative/declarative_manifest_handler.h"
@@ -32,7 +31,6 @@
 #include "extensions/common/manifest_handlers/incognito_info.h"
 #include "extensions/common/manifest_handlers/kiosk_mode_info.h"
 #include "extensions/common/manifest_handlers/mime_types_handler.h"
-#include "extensions/common/manifest_handlers/nacl_modules_handler.h"
 #include "extensions/common/manifest_handlers/oauth2_manifest_handler.h"
 #include "extensions/common/manifest_handlers/offline_enabled_info.h"
 #include "extensions/common/manifest_handlers/options_page_info.h"
@@ -81,9 +79,6 @@
 #endif
   registry->RegisterHandler(std::make_unique<KioskModeHandler>());
   registry->RegisterHandler(std::make_unique<MimeTypesHandlerParser>());
-#if BUILDFLAG(ENABLE_NACL)
-  registry->RegisterHandler(std::make_unique<NaClModulesHandler>());
-#endif
   registry->RegisterHandler(std::make_unique<OAuth2ManifestHandler>());
   registry->RegisterHandler(std::make_unique<OfflineEnabledHandler>());
   registry->RegisterHandler(std::make_unique<OptionsPageHandler>());
diff --git a/extensions/common/features/feature.cc b/extensions/common/features/feature.cc
index af9d58b..94d22fa 100644
--- a/extensions/common/features/feature.cc
+++ b/extensions/common/features/feature.cc
@@ -12,6 +12,7 @@
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
+#include "extensions/buildflags/buildflags.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/manifest.h"
 
@@ -29,6 +30,8 @@
   return WIN_PLATFORM;
 #elif BUILDFLAG(IS_FUCHSIA)
   return FUCHSIA_PLATFORM;
+#elif BUILDFLAG(ENABLE_DESKTOP_ANDROID_EXTENSIONS)
+  return DESKTOP_ANDROID_PLATFORM;
 #else
   return UNSPECIFIED_PLATFORM;
 #endif
diff --git a/extensions/common/features/feature.h b/extensions/common/features/feature.h
index 8e720e7..ff2e39d3 100644
--- a/extensions/common/features/feature.h
+++ b/extensions/common/features/feature.h
@@ -42,6 +42,7 @@
     MACOSX_PLATFORM,
     WIN_PLATFORM,
     FUCHSIA_PLATFORM,
+    DESKTOP_ANDROID_PLATFORM,
   };
 
   // Whether a feature is available in a given situation or not, and if not,
diff --git a/extensions/common/features/feature_flags.cc b/extensions/common/features/feature_flags.cc
index 60eeedf..60311e9 100644
--- a/extensions/common/features/feature_flags.cc
+++ b/extensions/common/features/feature_flags.cc
@@ -11,6 +11,7 @@
 #include "base/compiler_specific.h"
 #include "base/feature_list.h"
 #include "extensions/common/extension_features.h"
+#include "third_party/blink/public/common/features_generated.h"
 
 namespace extensions {
 
@@ -33,6 +34,9 @@
     &extensions_features::
         kApiEnterpriseReportingPrivateOnDataMaskingRulesTriggered,
     &extensions_features::kWebstoreInstallerUserGestureKillSwitch,
+#if BUILDFLAG(IS_CHROMEOS)
+    &blink::features::kSmartCard,
+#endif
 };
 
 constinit base::span<const base::Feature*> g_feature_flags_test_override;
diff --git a/extensions/common/manifest_constants.h b/extensions/common/manifest_constants.h
index 2d8d359d..c4666d2f 100644
--- a/extensions/common/manifest_constants.h
+++ b/extensions/common/manifest_constants.h
@@ -109,9 +109,6 @@
 inline constexpr char kMIMETypes[] = "mime_types";
 inline constexpr char kMimeTypesHandler[] = "mime_types_handler";
 inline constexpr char kMinimumChromeVersion[] = "minimum_chrome_version";
-inline constexpr char kNaClModules[] = "nacl_modules";
-inline constexpr char kNaClModulesMIMEType[] = "mime_type";
-inline constexpr char kNaClModulesPath[] = "path";
 inline constexpr char kName[] = "name";
 inline constexpr char kNativelyConnectable[] = "natively_connectable";
 inline constexpr char kOfflineEnabled[] = "offline_enabled";
@@ -513,12 +510,6 @@
     u"Invalid value for 'mime_types'.";
 inline constexpr char16_t kInvalidMinimumChromeVersion[] =
     u"Invalid value for 'minimum_chrome_version'.";
-inline constexpr char16_t kInvalidNaClModules[] =
-    u"Invalid value for 'nacl_modules'.";
-inline constexpr char kInvalidNaClModulesMIMEType[] =
-    "Invalid value for 'nacl_modules[*].mime_type'.";
-inline constexpr char kInvalidNaClModulesPath[] =
-    "Invalid value for 'nacl_modules[*].path'.";
 inline constexpr char kInvalidName[] =
     "Required value 'name' is missing or invalid.";
 inline constexpr char16_t kInvalidName16[] =
diff --git a/extensions/common/manifest_handlers/nacl_modules_handler.cc b/extensions/common/manifest_handlers/nacl_modules_handler.cc
deleted file mode 100644
index 1bc4e0c..0000000
--- a/extensions/common/manifest_handlers/nacl_modules_handler.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "extensions/common/manifest_handlers/nacl_modules_handler.h"
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "base/lazy_instance.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/values.h"
-#include "extensions/common/error_utils.h"
-#include "extensions/common/manifest_constants.h"
-
-namespace extensions {
-
-namespace keys = manifest_keys;
-namespace errors = manifest_errors;
-
-namespace {
-
-struct NaClModuleData : Extension::ManifestData {
-  // Optional list of NaCl modules and associated properties.
-  NaClModuleInfo::List nacl_modules_;
-};
-
-}  // namespace
-
-// static
-const NaClModuleInfo::List* NaClModuleInfo::GetNaClModules(
-    const Extension* extension) {
-  NaClModuleData* data = static_cast<NaClModuleData*>(
-      extension->GetManifestData(keys::kNaClModules));
-  return data ? &data->nacl_modules_ : NULL;
-}
-
-NaClModulesHandler::NaClModulesHandler() = default;
-NaClModulesHandler::~NaClModulesHandler() = default;
-
-bool NaClModulesHandler::Parse(Extension* extension, std::u16string* error) {
-  const base::Value* list_value = nullptr;
-  if (!extension->manifest()->GetList(keys::kNaClModules, &list_value)) {
-    *error = errors::kInvalidNaClModules;
-    return false;
-  }
-
-  std::unique_ptr<NaClModuleData> nacl_module_data(new NaClModuleData);
-
-  const base::Value::List& list = list_value->GetList();
-  for (size_t i = 0; i < list.size(); ++i) {
-    const base::Value::Dict* dict = list[i].GetIfDict();
-    if (!dict) {
-      *error = errors::kInvalidNaClModules;
-      return false;
-    }
-
-    // Get nacl_modules[i].path.
-    const std::string* path = dict->FindString(keys::kNaClModulesPath);
-    GURL url = path ? extension->ResolveExtensionURL(*path) : GURL();
-    if (!url.is_valid()) {
-      *error = ErrorUtils::FormatErrorMessageUTF16(
-          errors::kInvalidNaClModulesPath, base::NumberToString(i));
-      return false;
-    }
-
-    // Get nacl_modules[i].mime_type.
-    const std::string* mime_type = dict->FindString(keys::kNaClModulesMIMEType);
-    if (mime_type == nullptr) {
-      *error = ErrorUtils::FormatErrorMessageUTF16(
-          errors::kInvalidNaClModulesMIMEType, base::NumberToString(i));
-      return false;
-    }
-
-    nacl_module_data->nacl_modules_.push_back(NaClModuleInfo{
-        .url = std::move(url),
-        .mime_type = *mime_type,
-    });
-  }
-
-  extension->SetManifestData(keys::kNaClModules, std::move(nacl_module_data));
-  return true;
-}
-
-base::span<const char* const> NaClModulesHandler::Keys() const {
-  static constexpr const char* kKeys[] = {keys::kNaClModules};
-  return kKeys;
-}
-
-}  // namespace extensions
diff --git a/extensions/common/manifest_handlers/nacl_modules_handler.h b/extensions/common/manifest_handlers/nacl_modules_handler.h
deleted file mode 100644
index 16c25d9..0000000
--- a/extensions/common/manifest_handlers/nacl_modules_handler.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef EXTENSIONS_COMMON_MANIFEST_HANDLERS_NACL_MODULES_HANDLER_H_
-#define EXTENSIONS_COMMON_MANIFEST_HANDLERS_NACL_MODULES_HANDLER_H_
-
-#include <list>
-#include <string>
-
-#include "extensions/common/extension.h"
-#include "extensions/common/manifest_handler.h"
-
-namespace extensions {
-
-// An NaCl module included in the extension.
-struct NaClModuleInfo {
-  using List = std::list<NaClModuleInfo>;
-  // Returns the NaCl modules for the extensions, or NULL if none exist.
-  static const NaClModuleInfo::List* GetNaClModules(
-      const Extension* extension);
-
-  GURL url;
-  std::string mime_type;
-};
-
-// Parses the "nacl_modules" manifest key.
-class NaClModulesHandler : public ManifestHandler {
- public:
-  NaClModulesHandler();
-  ~NaClModulesHandler() override;
-
-  bool Parse(Extension* extension, std::u16string* error) override;
-
- private:
-  base::span<const char* const> Keys() const override;
-};
-
-}  // namespace extensions
-
-#endif  // EXTENSIONS_COMMON_MANIFEST_HANDLERS_NACL_MODULES_HANDLER_H_
diff --git a/extensions/shell/BUILD.gn b/extensions/shell/BUILD.gn
index 46e6d21..2cea89fe 100644
--- a/extensions/shell/BUILD.gn
+++ b/extensions/shell/BUILD.gn
@@ -8,7 +8,6 @@
 import("//build/config/ui.gni")
 import("//build/util/lastchange.gni")
 import("//build/util/process_version.gni")
-import("//components/nacl/features.gni")
 import("//extensions/buildflags/buildflags.gni")
 import("//testing/test.gni")
 import("//tools/grit/grit_rule.gni")
@@ -47,7 +46,6 @@
     "//components/guest_view/renderer",
     "//components/keep_alive_registry",
     "//components/keyed_service/content:content",
-    "//components/nacl/common:buildflags",
     "//components/network_session_configurator/common",
     "//components/origin_trials:browser",
     "//components/origin_trials:common",
@@ -249,31 +247,6 @@
       "//ui/display/manager",
     ]
   }
-
-  if (enable_nacl) {
-    sources += [
-      "browser/shell_nacl_browser_delegate.cc",
-      "browser/shell_nacl_browser_delegate.h",
-    ]
-
-    deps += [
-      "//components/nacl/browser",
-      "//components/nacl/common",
-      "//components/nacl/renderer",
-      "//components/nacl/renderer/plugin:nacl_trusted_plugin",
-      "//ppapi/shared_impl:shared_impl",
-    ]
-
-    # TODO(https://crbug.com/1299021): These dependencies might be
-    # redundant given that we were able to disable them, apparently without
-    # negative consequences, for the ARM32-NaCl-on-ARM64 case.
-    if (target_cpu != "arm64") {
-      deps += [ "//components/nacl/loader" ]
-      if (is_linux || is_chromeos) {
-        deps += [ "//components/nacl/loader:nacl_helper" ]
-      }
-    }
-  }
 }
 
 executable("app_shell") {
@@ -377,10 +350,6 @@
       "//chromeos/ash/components/dbus/audio",
     ]
   }
-
-  if (enable_nacl) {
-    sources += [ "browser/shell_nacl_browser_delegate_unittest.cc" ]
-  }
 }
 
 process_version("version_header") {
diff --git a/extensions/shell/app/DEPS b/extensions/shell/app/DEPS
index 21f0a4c5..11ebb81 100644
--- a/extensions/shell/app/DEPS
+++ b/extensions/shell/app/DEPS
@@ -2,7 +2,6 @@
   "+ash/constants",
   "+extensions/shell",
   "+chromeos",
-  "+components/nacl",
   "+content/public/app",
   "+content/public/browser",
   "+content/public/utility",
diff --git a/extensions/shell/app/shell_main_delegate.cc b/extensions/shell/app/shell_main_delegate.cc
index 2a56816f..25f4636 100644
--- a/extensions/shell/app/shell_main_delegate.cc
+++ b/extensions/shell/app/shell_main_delegate.cc
@@ -12,7 +12,6 @@
 #include "base/path_service.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
-#include "components/nacl/common/buildflags.h"
 #include "content/public/browser/browser_main_runner.h"
 #include "content/public/common/content_switches.h"
 #include "content/shell/common/shell_paths.h"
@@ -29,16 +28,6 @@
 #include "chromeos/dbus/constants/dbus_paths.h"
 #endif
 
-#if BUILDFLAG(ENABLE_NACL)
-#include "components/nacl/common/nacl_switches.h"  // nogncheck
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
-#include "components/nacl/common/nacl_paths.h"  // nogncheck
-#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
-#if BUILDFLAG(USE_ZYGOTE)
-#include "components/nacl/zygote/nacl_fork_delegate_linux.h"
-#endif  // BUILDFLAG(USE_ZYGOTE)
-#endif  // BUILDFLAG(ENABLE_NACL)
-
 #if BUILDFLAG(IS_WIN)
 #include "base/base_paths_win.h"
 #include "base/process/process_info.h"
@@ -138,9 +127,6 @@
   ash::RegisterPathProvider();
   chromeos::dbus_paths::RegisterPathProvider();
 #endif
-#if BUILDFLAG(ENABLE_NACL) && (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS))
-  nacl::RegisterPathProvider();
-#endif
   extensions::RegisterPathProvider();
   content::RegisterShellPathProvider();
   return std::nullopt;
@@ -179,9 +165,6 @@
 #if BUILDFLAG(USE_ZYGOTE)
 void ShellMainDelegate::ZygoteStarting(
     std::vector<std::unique_ptr<content::ZygoteForkDelegate>>* delegates) {
-#if BUILDFLAG(ENABLE_NACL)
-  nacl::AddNaClZygoteForkDelegates(delegates);
-#endif  // BUILDFLAG(ENABLE_NACL)
 }
 #endif  // BUILDFLAG(USE_ZYGOTE)
 
@@ -192,9 +175,6 @@
   // On Linux the zygote process opens the resources for the renderers.
   return process_type.empty() || process_type == switches::kZygoteProcess ||
          process_type == switches::kRendererProcess ||
-#if BUILDFLAG(ENABLE_NACL)
-         process_type == switches::kNaClLoaderProcess ||
-#endif
 #if BUILDFLAG(IS_MAC)
          process_type == switches::kGpuProcess ||
 #endif
diff --git a/extensions/shell/browser/DEPS b/extensions/shell/browser/DEPS
index 995f03f..5eda754c 100644
--- a/extensions/shell/browser/DEPS
+++ b/extensions/shell/browser/DEPS
@@ -4,8 +4,6 @@
   "+components/embedder_support/user_agent_utils.h",
   "+components/keep_alive_registry",
   "+components/keyed_service",
-  "+components/nacl/browser",
-  "+components/nacl/common",
   "+components/network_session_configurator/common",
   "+components/origin_trials",
   "+components/pref_registry",
diff --git a/extensions/shell/browser/shell_browser_main_parts.cc b/extensions/shell/browser/shell_browser_main_parts.cc
index b12eec5..358686f 100644
--- a/extensions/shell/browser/shell_browser_main_parts.cc
+++ b/extensions/shell/browser/shell_browser_main_parts.cc
@@ -14,7 +14,6 @@
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
-#include "components/nacl/common/buildflags.h"
 #include "components/prefs/pref_service.h"
 #include "components/sessions/core/session_id_generator.h"
 #include "components/storage_monitor/storage_monitor.h"
@@ -71,19 +70,9 @@
 #include "extensions/shell/browser/shell_network_controller_chromeos.h"
 #endif
 
-#if BUILDFLAG(ENABLE_NACL)
-#include "components/nacl/browser/nacl_browser.h"
-#include "components/nacl/browser/nacl_process_host.h"
-#include "content/public/browser/browser_thread.h"
-#include "extensions/shell/browser/shell_nacl_browser_delegate.h"
-#endif
-
 using base::CommandLine;
 using content::BrowserContext;
 
-#if BUILDFLAG(ENABLE_NACL)
-#endif
-
 namespace extensions {
 
 ShellBrowserMainParts::ShellBrowserMainParts(
@@ -224,12 +213,6 @@
 
   InitExtensionSystem();
 
-#if BUILDFLAG(ENABLE_NACL)
-  nacl::NaClBrowser::SetDelegate(
-      std::make_unique<ShellNaClBrowserDelegate>(browser_context_.get()));
-  nacl::NaClProcessHost::EarlyStartup();
-#endif
-
   content::ShellDevToolsManagerDelegate::StartHttpHandler(
       browser_context_.get());
 
@@ -253,10 +236,6 @@
   // Close apps before shutting down browser context and extensions system.
   desktop_controller_->CloseAppWindows();
 
-#if BUILDFLAG(ENABLE_NACL)
-  nacl::NaClBrowser::ClearAndDeleteDelegate();
-#endif
-
   // NOTE: Please destroy objects in the reverse order of their creation.
   browser_main_delegate_->Shutdown();
   content::ShellDevToolsManagerDelegate::StopHttpHandler();
diff --git a/extensions/shell/browser/shell_browser_main_parts.h b/extensions/shell/browser/shell_browser_main_parts.h
index f705982b..30ffe5aa 100644
--- a/extensions/shell/browser/shell_browser_main_parts.h
+++ b/extensions/shell/browser/shell_browser_main_parts.h
@@ -11,7 +11,6 @@
 #include "base/memory/raw_ptr.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
-#include "components/nacl/common/buildflags.h"
 #include "content/public/browser/browser_main_parts.h"
 
 class PrefService;
diff --git a/extensions/shell/browser/shell_content_browser_client.cc b/extensions/shell/browser/shell_content_browser_client.cc
index f8e48fb9..9883630d 100644
--- a/extensions/shell/browser/shell_content_browser_client.cc
+++ b/extensions/shell/browser/shell_content_browser_client.cc
@@ -14,7 +14,6 @@
 #include "base/task/sequenced_task_runner.h"
 #include "components/embedder_support/user_agent_utils.h"
 #include "components/guest_view/common/guest_view.mojom.h"
-#include "components/nacl/common/buildflags.h"
 #include "content/public/browser/browser_main_runner.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -61,16 +60,6 @@
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
 #include "url/gurl.h"
 
-#if BUILDFLAG(ENABLE_NACL)
-#include "components/nacl/browser/nacl_browser.h"
-#include "components/nacl/browser/nacl_host_message_filter.h"
-#include "components/nacl/browser/nacl_process_host.h"
-#include "components/nacl/common/nacl_process_type.h"  // nogncheck
-#include "components/nacl/common/nacl_switches.h"      // nogncheck
-#include "content/public/browser/browser_child_process_host.h"
-#include "content/public/browser/child_process_data.h"
-#endif
-
 using base::CommandLine;
 using content::BrowserContext;
 namespace extensions {
@@ -111,20 +100,6 @@
   return browser_main_parts;
 }
 
-void ShellContentBrowserClient::RenderProcessWillLaunch(
-    content::RenderProcessHost* host) {
-#if BUILDFLAG(ENABLE_NACL)
-  int render_process_id = host->GetDeprecatedID();
-  BrowserContext* browser_context = browser_main_parts_->browser_context();
-
-  // PluginInfoMessageFilter is not required because app_shell does not have
-  // the concept of disabled plugins.
-  host->AddFilter(new nacl::NaClHostMessageFilter(
-      render_process_id, browser_context->IsOffTheRecord(),
-      browser_context->GetPath()));
-#endif
-}
-
 bool ShellContentBrowserClient::ShouldUseProcessPerSite(
     content::BrowserContext* browser_context,
     const GURL& site_url) {
@@ -186,24 +161,6 @@
   return new speech::ShellSpeechRecognitionManagerDelegate();
 }
 
-content::BrowserPpapiHost*
-ShellContentBrowserClient::GetExternalBrowserPpapiHost(int plugin_process_id) {
-#if BUILDFLAG(ENABLE_NACL)
-  content::BrowserChildProcessHostIterator iter(PROCESS_TYPE_NACL_LOADER);
-  while (!iter.Done()) {
-    nacl::NaClProcessHost* host = static_cast<nacl::NaClProcessHost*>(
-        iter.GetDelegate());
-    if (host->process() &&
-        host->process()->GetData().id == plugin_process_id) {
-      // Found the plugin.
-      return host->browser_ppapi_host();
-    }
-    ++iter;
-  }
-#endif
-  return nullptr;
-}
-
 void ShellContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem(
     std::vector<std::string>* additional_allowed_schemes) {
   ContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem(
@@ -408,14 +365,6 @@
   };
   command_line->CopySwitchesFrom(*base::CommandLine::ForCurrentProcess(),
                                  kSwitchNames);
-
-#if BUILDFLAG(ENABLE_NACL)
-  static const char* const kNaclSwitchNames[] = {
-      ::switches::kEnableNaClDebug,
-  };
-  command_line->CopySwitchesFrom(*base::CommandLine::ForCurrentProcess(),
-                                 kNaclSwitchNames);
-#endif  // BUILDFLAG(ENABLE_NACL)
 }
 
 const Extension* ShellContentBrowserClient::GetExtension(
diff --git a/extensions/shell/browser/shell_content_browser_client.h b/extensions/shell/browser/shell_content_browser_client.h
index 368f9a48..f25e8a0b 100644
--- a/extensions/shell/browser/shell_content_browser_client.h
+++ b/extensions/shell/browser/shell_content_browser_client.h
@@ -66,7 +66,6 @@
   // content::ContentBrowserClient overrides.
   std::unique_ptr<content::BrowserMainParts> CreateBrowserMainParts(
       bool is_integration_test) override;
-  void RenderProcessWillLaunch(content::RenderProcessHost* host) override;
   bool ShouldUseProcessPerSite(content::BrowserContext* browser_context,
                                const GURL& site_url) override;
   bool IsHandledURL(const GURL& url) override;
@@ -76,8 +75,6 @@
                                       int child_process_id) override;
   content::SpeechRecognitionManagerDelegate*
   CreateSpeechRecognitionManagerDelegate() override;
-  content::BrowserPpapiHost* GetExternalBrowserPpapiHost(
-      int plugin_process_id) override;
   void GetAdditionalAllowedSchemesForFileSystem(
       std::vector<std::string>* additional_schemes) override;
   std::unique_ptr<content::DevToolsManagerDelegate>
diff --git a/extensions/shell/browser/shell_nacl_browser_delegate.cc b/extensions/shell/browser/shell_nacl_browser_delegate.cc
deleted file mode 100644
index 7ed6557..0000000
--- a/extensions/shell/browser/shell_nacl_browser_delegate.cc
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "extensions/shell/browser/shell_nacl_browser_delegate.h"
-
-#include <string>
-
-#include "base/base_paths.h"
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/path_service.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "build/build_config.h"
-#include "content/public/browser/browser_context.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/render_frame_host.h"
-#include "content/public/browser/site_instance.h"
-#include "extensions/browser/extension_registry.h"
-#include "extensions/browser/extension_system.h"
-#include "extensions/browser/process_manager.h"
-#include "extensions/common/constants.h"
-#include "extensions/common/extension.h"
-#include "extensions/common/url_pattern.h"
-#include "extensions/shell/common/version.h"  // Generated file.
-#include "url/gurl.h"
-
-using content::BrowserContext;
-using content::BrowserThread;
-using content::BrowserPpapiHost;
-
-namespace extensions {
-
-ShellNaClBrowserDelegate::ShellNaClBrowserDelegate(BrowserContext* context)
-    : browser_context_(context) {
-  DCHECK(browser_context_);
-}
-
-ShellNaClBrowserDelegate::~ShellNaClBrowserDelegate() {
-}
-
-void ShellNaClBrowserDelegate::ShowMissingArchInfobar(int render_process_id,
-                                                      int render_frame_id) {
-  // app_shell does not have infobars.
-  LOG(ERROR) << "Missing architecture for pid " << render_process_id;
-}
-
-bool ShellNaClBrowserDelegate::DialogsAreSuppressed() {
-  return false;
-}
-
-bool ShellNaClBrowserDelegate::GetCacheDirectory(base::FilePath* cache_dir) {
-  // Just use the general cache directory, not a subdirectory like Chrome does.
-  return base::PathService::Get(base::DIR_CACHE, cache_dir);
-}
-
-bool ShellNaClBrowserDelegate::GetPluginDirectory(base::FilePath* plugin_dir) {
-  // On Posix, plugins are in the module directory.
-  return base::PathService::Get(base::DIR_MODULE, plugin_dir);
-}
-
-bool ShellNaClBrowserDelegate::GetPnaclDirectory(base::FilePath* pnacl_dir) {
-  // On Posix, the pnacl directory is inside the plugin directory.
-  base::FilePath plugin_dir;
-  if (!GetPluginDirectory(&plugin_dir))
-    return false;
-  *pnacl_dir = plugin_dir.Append(FILE_PATH_LITERAL("pnacl"));
-  return true;
-}
-
-bool ShellNaClBrowserDelegate::GetUserDirectory(base::FilePath* user_dir) {
-  base::FilePath path = browser_context_->GetPath();
-  if (!path.empty()) {
-    *user_dir = path;
-    return true;
-  }
-  return false;
-}
-
-std::string ShellNaClBrowserDelegate::GetVersionString() const {
-  // A version change triggers an update of the NaCl validation caches.
-  // Example version: "39.0.2129.0 (290550)".
-  return PRODUCT_VERSION " (" LAST_CHANGE ")";
-}
-
-ppapi::host::HostFactory* ShellNaClBrowserDelegate::CreatePpapiHostFactory(
-    content::BrowserPpapiHost* ppapi_host) {
-  return NULL;
-}
-
-void ShellNaClBrowserDelegate::SetDebugPatterns(
-    const std::string& debug_patterns) {
-  // No debugger support. Developers should use Chrome for debugging.
-}
-
-bool ShellNaClBrowserDelegate::URLMatchesDebugPatterns(
-    const GURL& manifest_url) {
-  // No debugger support. Developers should use Chrome for debugging.
-  return false;
-}
-
-// This function is security sensitive.  Be sure to check with a security
-// person before you modify it.
-// TODO(jamescook): Refactor this code into the extensions module so it can
-// be shared with Chrome's NaClBrowserDelegateImpl. http://crbug.com/403017
-NaClBrowserDelegate::MapUrlToLocalFilePathCallback
-ShellNaClBrowserDelegate::GetMapUrlToLocalFilePathCallback(
-    const base::FilePath& profile_directory) {
-  auto extensions = std::make_unique<ExtensionSet>();
-  extensions->InsertAll(
-      ExtensionRegistry::Get(browser_context_)->enabled_extensions());
-  return base::BindRepeating(
-      [](const ExtensionSet* extensions, const GURL& file_url,
-         bool use_blocking_api, base::FilePath* file_path) {
-        // Check that the URL is recognized by the extension system.
-        const Extension* extension =
-            extensions->GetExtensionOrAppByURL(file_url);
-        if (!extension)
-          return false;
-
-        // This is a short-cut which avoids calling a blocking file operation
-        // (GetFilePath()), so that this can be called on the IO thread. It only
-        // handles a subset of the urls.
-        if (!use_blocking_api) {
-          if (file_url.SchemeIs(kExtensionScheme)) {
-            std::string path = file_url.path();
-            base::TrimString(path, "/", &path);  // Remove first slash
-            *file_path = extension->path().AppendASCII(path);
-            return true;
-          }
-          return false;
-        }
-
-        // Check that the URL references a resource in the extension.
-        // NOTE: app_shell does not support shared modules.
-        ExtensionResource resource = extension->GetResource(file_url.path());
-        if (resource.empty())
-          return false;
-
-        // GetFilePath is a blocking function call.
-        const base::FilePath resource_file_path = resource.GetFilePath();
-        if (resource_file_path.empty())
-          return false;
-
-        *file_path = resource_file_path;
-        return true;
-      },
-      base::Owned(std::move(extensions)));
-}
-
-}  // namespace extensions
diff --git a/extensions/shell/browser/shell_nacl_browser_delegate.h b/extensions/shell/browser/shell_nacl_browser_delegate.h
deleted file mode 100644
index 4935384..0000000
--- a/extensions/shell/browser/shell_nacl_browser_delegate.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef EXTENSIONS_SHELL_BROWSER_SHELL_NACL_BROWSER_DELEGATE_H_
-#define EXTENSIONS_SHELL_BROWSER_SHELL_NACL_BROWSER_DELEGATE_H_
-
-#include "base/compiler_specific.h"
-#include "base/memory/raw_ptr.h"
-#include "components/nacl/browser/nacl_browser_delegate.h"
-
-namespace content {
-class BrowserContext;
-}
-
-namespace extensions {
-class InfoMap;
-
-// A lightweight NaClBrowserDelegate for app_shell. Only supports a single
-// BrowserContext.
-class ShellNaClBrowserDelegate : public NaClBrowserDelegate {
- public:
-  // Uses `context` to look up extensions via InfoMap on the IO thread.
-  explicit ShellNaClBrowserDelegate(content::BrowserContext* context);
-
-  ShellNaClBrowserDelegate(const ShellNaClBrowserDelegate&) = delete;
-  ShellNaClBrowserDelegate& operator=(const ShellNaClBrowserDelegate&) = delete;
-
-  ~ShellNaClBrowserDelegate() override;
-
-  // NaClBrowserDelegate overrides:
-  void ShowMissingArchInfobar(int render_process_id,
-                              int render_frame_id) override;
-  bool DialogsAreSuppressed() override;
-  bool GetCacheDirectory(base::FilePath* cache_dir) override;
-  bool GetPluginDirectory(base::FilePath* plugin_dir) override;
-  bool GetPnaclDirectory(base::FilePath* pnacl_dir) override;
-  bool GetUserDirectory(base::FilePath* user_dir) override;
-  std::string GetVersionString() const override;
-  ppapi::host::HostFactory* CreatePpapiHostFactory(
-      content::BrowserPpapiHost* ppapi_host) override;
-  MapUrlToLocalFilePathCallback GetMapUrlToLocalFilePathCallback(
-      const base::FilePath& profile_directory) override;
-  void SetDebugPatterns(const std::string& debug_patterns) override;
-  bool URLMatchesDebugPatterns(const GURL& manifest_url) override;
-
- private:
-  raw_ptr<content::BrowserContext> browser_context_;  // Not owned.
-};
-
-}  // namespace extensions
-
-#endif  // EXTENSIONS_SHELL_BROWSER_SHELL_NACL_BROWSER_DELEGATE_H_
diff --git a/extensions/shell/browser/shell_nacl_browser_delegate_unittest.cc b/extensions/shell/browser/shell_nacl_browser_delegate_unittest.cc
deleted file mode 100644
index f2094f5..0000000
--- a/extensions/shell/browser/shell_nacl_browser_delegate_unittest.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "extensions/shell/browser/shell_nacl_browser_delegate.h"
-
-#include "base/strings/pattern.h"
-#include "base/strings/string_util.h"
-#include "content/public/test/browser_task_environment.h"
-#include "content/public/test/test_browser_context.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace extensions {
-
-using ShellNaClBrowserDelegateTest = testing::Test;
-
-// Verifies that the returned version string has a valid format.
-TEST_F(ShellNaClBrowserDelegateTest, VersionString) {
-  content::BrowserTaskEnvironment task_environment;
-  content::TestBrowserContext browser_context;
-  ShellNaClBrowserDelegate delegate(&browser_context);
-
-  // Version should look like "1.2.3.4 (5)".
-  std::string version = delegate.GetVersionString();
-  EXPECT_TRUE(base::MatchPattern(version, "*.*.*.* (*)")) << "bad version "
-                                                          << version;
-}
-
-}  // namespace extensions
diff --git a/extensions/shell/common/DEPS b/extensions/shell/common/DEPS
index fe06bdc..f36458a 100644
--- a/extensions/shell/common/DEPS
+++ b/extensions/shell/common/DEPS
@@ -1,6 +1,4 @@
 include_rules = [
-  "+components/nacl/common",
-  "+components/nacl/renderer/plugin",
   "+extensions/shell/grit",
   "+ppapi",
 ]
diff --git a/extensions/shell/common/shell_content_client.cc b/extensions/shell/common/shell_content_client.cc
index 495ed632..0685c4eb 100644
--- a/extensions/shell/common/shell_content_client.cc
+++ b/extensions/shell/common/shell_content_client.cc
@@ -7,37 +7,12 @@
 #include <string_view>
 
 #include "base/strings/utf_string_conversions.h"
-#include "components/nacl/common/buildflags.h"
 #include "extensions/common/constants.h"
 #include "extensions/shell/common/version.h"  // Generated file.
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 
-#if BUILDFLAG(ENABLE_NACL)
-#include "base/base_paths.h"
-#include "base/files/file_path.h"
-#include "base/path_service.h"
-#include "components/nacl/common/nacl_constants.h"              // nogncheck
-#include "components/nacl/renderer/plugin/ppapi_entrypoints.h"  // nogncheck
-#include "content/public/common/content_plugin_info.h"          // nogncheck
-#include "ppapi/shared_impl/ppapi_permissions.h"                // nogncheck
-#endif
-
 namespace extensions {
-namespace {
-
-#if BUILDFLAG(ENABLE_NACL)
-bool GetNaClPluginPath(base::FilePath* path) {
-  // On Posix, plugins live in the module directory.
-  base::FilePath module;
-  if (!base::PathService::Get(base::DIR_MODULE, &module))
-    return false;
-  *path = module.Append(nacl::kInternalNaClPluginFileName);
-  return true;
-}
-#endif  // BUILDFLAG(ENABLE_NACL)
-
-}  // namespace
 
 ShellContentClient::ShellContentClient() {
 }
@@ -45,36 +20,6 @@
 ShellContentClient::~ShellContentClient() {
 }
 
-void ShellContentClient::AddPlugins(
-    std::vector<content::ContentPluginInfo>* plugins) {
-#if BUILDFLAG(ENABLE_NACL)
-  base::FilePath path;
-  if (!GetNaClPluginPath(&path))
-    return;
-
-  content::ContentPluginInfo nacl;
-  // The nacl plugin is now built into the binary.
-  nacl.is_internal = true;
-  nacl.path = path;
-  nacl.name = nacl::kNaClPluginName;
-  content::WebPluginMimeType nacl_mime_type(nacl::kNaClPluginMimeType,
-                                            nacl::kNaClPluginExtension,
-                                            nacl::kNaClPluginDescription);
-  nacl.mime_types.push_back(nacl_mime_type);
-  content::WebPluginMimeType pnacl_mime_type(nacl::kPnaclPluginMimeType,
-                                             nacl::kPnaclPluginExtension,
-                                             nacl::kPnaclPluginDescription);
-  nacl.mime_types.push_back(pnacl_mime_type);
-  nacl.internal_entry_points.get_interface = nacl_plugin::PPP_GetInterface;
-  nacl.internal_entry_points.initialize_module =
-      nacl_plugin::PPP_InitializeModule;
-  nacl.internal_entry_points.shutdown_module =
-      nacl_plugin::PPP_ShutdownModule;
-  nacl.permissions = ppapi::PERMISSION_PRIVATE | ppapi::PERMISSION_DEV;
-  plugins->push_back(nacl);
-#endif  // BUILDFLAG(ENABLE_NACL)
-}
-
 void ShellContentClient::AddAdditionalSchemes(Schemes* schemes) {
   schemes->standard_schemes.push_back(extensions::kExtensionScheme);
   schemes->savable_schemes.push_back(kExtensionScheme);
diff --git a/extensions/shell/common/shell_content_client.h b/extensions/shell/common/shell_content_client.h
index 0725a9ed..a4aeac4 100644
--- a/extensions/shell/common/shell_content_client.h
+++ b/extensions/shell/common/shell_content_client.h
@@ -20,7 +20,6 @@
 
   ~ShellContentClient() override;
 
-  void AddPlugins(std::vector<content::ContentPluginInfo>* plugins) override;
   void AddAdditionalSchemes(Schemes* schemes) override;
   std::u16string GetLocalizedString(int message_id) override;
   std::string_view GetDataResource(
diff --git a/extensions/shell/renderer/DEPS b/extensions/shell/renderer/DEPS
index 20d01c03..f19c7d4 100644
--- a/extensions/shell/renderer/DEPS
+++ b/extensions/shell/renderer/DEPS
@@ -1,7 +1,5 @@
 include_rules = [
   # Only allow includes the renderer can use.
-  "+components/nacl/common",
-  "+components/nacl/renderer",
   "+content/public/renderer",
   "+ppapi",
   "+third_party/blink/public",
diff --git a/extensions/shell/renderer/shell_content_renderer_client.cc b/extensions/shell/renderer/shell_content_renderer_client.cc
index 7ab9c421..a0debbf 100644
--- a/extensions/shell/renderer/shell_content_renderer_client.cc
+++ b/extensions/shell/renderer/shell_content_renderer_client.cc
@@ -6,7 +6,6 @@
 
 #include <memory>
 
-#include "components/nacl/common/buildflags.h"
 #include "content/public/common/content_constants.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_frame_observer.h"
@@ -21,11 +20,6 @@
 #include "extensions/shell/renderer/shell_extensions_renderer_client.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 
-#if BUILDFLAG(ENABLE_NACL)
-#include "components/nacl/common/nacl_constants.h"
-#include "components/nacl/renderer/nacl_helper.h"
-#endif
-
 using blink::WebFrame;
 using blink::WebString;
 using content::RenderThread;
@@ -56,13 +50,6 @@
   new ExtensionFrameHelper(render_frame, dispatcher);
 
   dispatcher->OnRenderFrameCreated(render_frame);
-
-  // TODO(jamescook): Do we need to add a new PepperHelper(render_frame) here?
-  // It doesn't seem necessary for either Pepper or NaCl.
-  // http://crbug.com/403004
-#if BUILDFLAG(ENABLE_NACL)
-  new nacl::NaClHelper(render_frame);
-#endif
 }
 
 bool ShellContentRendererClient::OverrideCreatePlugin(
@@ -91,18 +78,6 @@
   // TODO(jamescook): Cause an error for bad extension scheme requests?
 }
 
-bool ShellContentRendererClient::IsExternalPepperPlugin(
-    const std::string& module_name) {
-#if BUILDFLAG(ENABLE_NACL)
-  // TODO(bbudge) remove this when the trusted NaCl plugin has been removed.
-  // We must defer certain plugin events for NaCl instances since we switch
-  // from the in-process to the out-of-process proxy after instantiating them.
-  return module_name == nacl::kNaClPluginName;
-#else
-  return false;
-#endif
-}
-
 void ShellContentRendererClient::RunScriptsAtDocumentStart(
     content::RenderFrame* render_frame) {
   extensions_renderer_client_->dispatcher()->RunScriptsAtDocumentStart(
diff --git a/extensions/shell/renderer/shell_content_renderer_client.h b/extensions/shell/renderer/shell_content_renderer_client.h
index a1fe6c9..ca480c69 100644
--- a/extensions/shell/renderer/shell_content_renderer_client.h
+++ b/extensions/shell/renderer/shell_content_renderer_client.h
@@ -46,7 +46,6 @@
                        const net::SiteForCookies& site_for_cookies,
                        const url::Origin* initiator_origin,
                        GURL* new_url) override;
-  bool IsExternalPepperPlugin(const std::string& module_name) override;
   void RunScriptsAtDocumentStart(content::RenderFrame* render_frame) override;
   void RunScriptsAtDocumentEnd(content::RenderFrame* render_frame) override;
 
diff --git a/gpu/command_buffer/common/shared_image_usage.cc b/gpu/command_buffer/common/shared_image_usage.cc
index 4725c5a..9bf62e2e 100644
--- a/gpu/command_buffer/common/shared_image_usage.cc
+++ b/gpu/command_buffer/common/shared_image_usage.cc
@@ -60,6 +60,7 @@
       {SHARED_IMAGE_USAGE_WEBNN_SHARED_TENSOR, "WebnnSharedTensor"},
       {SHARED_IMAGE_USAGE_CPU_ONLY_READ_WRITE, "CpuOnlyReadWrite"},
       {SHARED_IMAGE_USAGE_RASTER_COPY_SOURCE, "RasterCopySource"},
+      {SHARED_IMAGE_USAGE_CPU_READ, "CpuRead"},
   };
 
   std::string label;
diff --git a/gpu/command_buffer/common/shared_image_usage.h b/gpu/command_buffer/common/shared_image_usage.h
index d8928d2cd..21eb539 100644
--- a/gpu/command_buffer/common/shared_image_usage.h
+++ b/gpu/command_buffer/common/shared_image_usage.h
@@ -112,15 +112,18 @@
   // Image will be used by one copy raster for raster source access.
   SHARED_IMAGE_USAGE_RASTER_COPY_SOURCE = 1 << 27,
 
+  // Image will be used for CPU Reads by client.
+  SHARED_IMAGE_USAGE_CPU_READ = 1 << 28,
+
   // Start service side only usage flags after this entry. They must be larger
   // than `LAST_CLIENT_USAGE`.
-  LAST_CLIENT_USAGE = SHARED_IMAGE_USAGE_RASTER_COPY_SOURCE,
+  LAST_CLIENT_USAGE = SHARED_IMAGE_USAGE_CPU_READ,
 
   // Image will have pixels uploaded from CPU. The backing must implement
   // `UploadFromMemory()` if it supports this usage. Clients should specify
   // SHARED_IMAGE_USAGE_CPU_WRITE_ONLY if they need to write pixels to the
   // image.
-  SHARED_IMAGE_USAGE_CPU_UPLOAD = 1 << 28,
+  SHARED_IMAGE_USAGE_CPU_UPLOAD = 1 << 29,
 
   LAST_SHARED_IMAGE_USAGE = SHARED_IMAGE_USAGE_CPU_UPLOAD
 };
diff --git a/gpu/command_buffer/service/shared_image/iosurface_image_backing.h b/gpu/command_buffer/service/shared_image/iosurface_image_backing.h
index 0ad7beca..317dd530 100644
--- a/gpu/command_buffer/service/shared_image/iosurface_image_backing.h
+++ b/gpu/command_buffer/service/shared_image/iosurface_image_backing.h
@@ -8,6 +8,7 @@
 #include "base/apple/scoped_nsobject.h"
 #include "base/containers/flat_map.h"
 #include "base/memory/raw_ptr.h"
+#include "base/task/single_thread_task_runner.h"
 #include "build/build_config.h"
 #include "gpu/command_buffer/service/shared_image/dawn_shared_texture_cache.h"
 #include "gpu/command_buffer/service/shared_image/shared_image_backing.h"
diff --git a/gpu/config/BUILD.gn b/gpu/config/BUILD.gn
index 41a96c5..b99e3e2 100644
--- a/gpu/config/BUILD.gn
+++ b/gpu/config/BUILD.gn
@@ -266,14 +266,14 @@
     # External code should depend on ":config_java" instead.
     visibility = [ ":*" ]
     sources = [ "gpu_switches.cc" ]
-    template = "android/java/src/org/chromium/gpu/config/GpuSwitches.java.tmpl"
+    class_name = "org.chromium.gpu.config.GpuSwitches"
   }
 
   java_cpp_features("java_features_srcjar") {
     # External code should depend on ":config_java" instead.
     visibility = [ ":*" ]
     sources = [ "gpu_finch_features.cc" ]
-    template = "android/java/src/org/chromium/gpu/config/GpuFeatures.java.tmpl"
+    class_name = "org.chromium.gpu.config.GpuFeatures"
   }
 
   android_library("config_java") {
diff --git a/gpu/config/android/java/src/org/chromium/gpu/config/GpuFeatures.java.tmpl b/gpu/config/android/java/src/org/chromium/gpu/config/GpuFeatures.java.tmpl
deleted file mode 100644
index 4bc42953..0000000
--- a/gpu/config/android/java/src/org/chromium/gpu/config/GpuFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.gpu.config;
-
-/**
- * Constants for the names of GPU Features.
- */
-public final class GpuFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Prevent instantiation.
-    private GpuFeatures() {{}}
-}}
diff --git a/gpu/config/android/java/src/org/chromium/gpu/config/GpuSwitches.java.tmpl b/gpu/config/android/java/src/org/chromium/gpu/config/GpuSwitches.java.tmpl
deleted file mode 100644
index 340f9aff..0000000
--- a/gpu/config/android/java/src/org/chromium/gpu/config/GpuSwitches.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.gpu.config;
-
-/**
- * Contains all of the command line switches that are specific to the gpu/ layer.
- */
-public final class GpuSwitches {{
-
-{NATIVE_STRINGS}
-
-    // Prevent instantiation.
-    private GpuSwitches() {{}}
-}}
diff --git a/infra/archive_config/linux-chromiumos-full.json b/infra/archive_config/linux-chromiumos-full.json
index f6fc374..fba01ae 100644
--- a/infra/archive_config/linux-chromiumos-full.json
+++ b/infra/archive_config/linux-chromiumos-full.json
@@ -14,9 +14,6 @@
                 "libminigbm.so",
                 "MEIPreload/manifest.json",
                 "MEIPreload/preloaded_data.pb",
-                "nacl_helper",
-                "nacl_helper_bootstrap",
-                "nacl_irt_x86_64.nexe",
                 "PrivacySandboxAttestationsPreloaded/manifest.json",
                 "PrivacySandboxAttestationsPreloaded/privacy-sandbox-attestations.dat",
                 "product_logo_48.png",
diff --git a/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Builder/targets/chromium.memory.json b/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Builder/targets/chromium.memory.json
index ebfe9be..b96446f6 100644
--- a/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Builder/targets/chromium.memory.json
+++ b/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Builder/targets/chromium.memory.json
@@ -495,7 +495,7 @@
             "os": "Ubuntu-22.04"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 14
+          "shards": 28
         },
         "test": "content_browsertests",
         "test_id_prefix": "ninja://content/test:content_browsertests/"
diff --git "a/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/targets/chromium.memory.json" "b/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/targets/chromium.memory.json"
index ebfe9be..b96446f6 100644
--- "a/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/targets/chromium.memory.json"
+++ "b/infra/config/generated/builders/ci/Linux Chromium OS ASan LSan Tests \0501\051/targets/chromium.memory.json"
@@ -495,7 +495,7 @@
             "os": "Ubuntu-22.04"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 14
+          "shards": 28
         },
         "test": "content_browsertests",
         "test_id_prefix": "ninja://content/test:content_browsertests/"
diff --git a/infra/config/generated/builders/ci/ios-blink-rel-fyi/properties.json b/infra/config/generated/builders/ci/ios-blink-rel-fyi/properties.json
index 74ceece..700cdef 100644
--- a/infra/config/generated/builders/ci/ios-blink-rel-fyi/properties.json
+++ b/infra/config/generated/builders/ci/ios-blink-rel-fyi/properties.json
@@ -71,5 +71,5 @@
   },
   "builder_group": "chromium.fyi",
   "recipe": "chromium",
-  "xcode_build_version": "16f6"
+  "xcode_build_version": "17a5241e"
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-blink-rel-fyi/targets/chromium.fyi.json b/infra/config/generated/builders/ci/ios-blink-rel-fyi/targets/chromium.fyi.json
index ef7fcf9..8530a77 100644
--- a/infra/config/generated/builders/ci/ios-blink-rel-fyi/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/ci/ios-blink-rel-fyi/targets/chromium.fyi.json
@@ -13,7 +13,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -42,7 +42,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -61,7 +61,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -90,7 +90,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -112,7 +112,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -141,7 +141,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -160,7 +160,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -189,7 +189,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -208,7 +208,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -237,7 +237,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -256,7 +256,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -285,7 +285,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -307,7 +307,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -341,7 +341,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -360,7 +360,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -389,7 +389,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -408,7 +408,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -437,7 +437,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -456,7 +456,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -485,7 +485,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -504,7 +504,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -533,7 +533,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -555,7 +555,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -584,7 +584,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -605,7 +605,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -634,7 +634,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -655,7 +655,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -684,7 +684,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -705,7 +705,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -734,7 +734,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -755,7 +755,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -784,7 +784,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -806,7 +806,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -835,7 +835,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -854,7 +854,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -883,7 +883,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -902,7 +902,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -931,7 +931,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -950,7 +950,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -979,7 +979,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -998,7 +998,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1027,7 +1027,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1046,7 +1046,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1075,7 +1075,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1094,7 +1094,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1123,7 +1123,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1142,7 +1142,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1171,7 +1171,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1192,7 +1192,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1221,7 +1221,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1240,7 +1240,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1269,7 +1269,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1288,7 +1288,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1317,7 +1317,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1336,7 +1336,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1365,7 +1365,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1386,7 +1386,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1415,7 +1415,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1434,7 +1434,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1463,7 +1463,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1482,7 +1482,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1511,7 +1511,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1530,7 +1530,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1559,7 +1559,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1578,7 +1578,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1607,7 +1607,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1626,7 +1626,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1655,7 +1655,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1676,7 +1676,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1705,7 +1705,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1730,7 +1730,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1759,7 +1759,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1784,7 +1784,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1813,7 +1813,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1832,7 +1832,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1861,7 +1861,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1882,7 +1882,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1911,7 +1911,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1930,7 +1930,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1959,7 +1959,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1978,7 +1978,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2007,7 +2007,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2026,7 +2026,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2055,7 +2055,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2074,7 +2074,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2103,7 +2103,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2122,7 +2122,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2151,7 +2151,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2171,7 +2171,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2200,7 +2200,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2219,7 +2219,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2248,7 +2248,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2267,7 +2267,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2296,7 +2296,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2315,7 +2315,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2344,7 +2344,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2363,7 +2363,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2392,7 +2392,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2412,7 +2412,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2441,7 +2441,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2460,7 +2460,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2489,7 +2489,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2508,7 +2508,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2537,7 +2537,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2556,7 +2556,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2585,7 +2585,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2607,7 +2607,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2636,7 +2636,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2655,7 +2655,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2684,7 +2684,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2703,7 +2703,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2732,7 +2732,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
diff --git a/infra/config/generated/builders/ci/linux-chromeos-archive-rel/properties.json b/infra/config/generated/builders/ci/linux-chromeos-archive-rel/properties.json
index 27d0a91..d6db4f1 100644
--- a/infra/config/generated/builders/ci/linux-chromeos-archive-rel/properties.json
+++ b/infra/config/generated/builders/ci/linux-chromeos-archive-rel/properties.json
@@ -26,6 +26,7 @@
               "execution_mode": "COMPILE_AND_TEST",
               "legacy_chromium_config": {
                 "apply_configs": [
+                  "clobber",
                   "mb"
                 ],
                 "build_config": "Release",
diff --git a/infra/config/generated/builders/try/ios-blink-rel-fyi/targets/chromium.fyi.json b/infra/config/generated/builders/try/ios-blink-rel-fyi/targets/chromium.fyi.json
index ef7fcf9..8530a77 100644
--- a/infra/config/generated/builders/try/ios-blink-rel-fyi/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/try/ios-blink-rel-fyi/targets/chromium.fyi.json
@@ -13,7 +13,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -42,7 +42,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -61,7 +61,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -90,7 +90,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -112,7 +112,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -141,7 +141,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -160,7 +160,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -189,7 +189,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -208,7 +208,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -237,7 +237,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -256,7 +256,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -285,7 +285,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -307,7 +307,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -341,7 +341,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -360,7 +360,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -389,7 +389,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -408,7 +408,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -437,7 +437,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -456,7 +456,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -485,7 +485,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -504,7 +504,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -533,7 +533,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -555,7 +555,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -584,7 +584,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -605,7 +605,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -634,7 +634,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -655,7 +655,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -684,7 +684,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -705,7 +705,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -734,7 +734,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -755,7 +755,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -784,7 +784,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -806,7 +806,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -835,7 +835,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -854,7 +854,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -883,7 +883,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -902,7 +902,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -931,7 +931,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -950,7 +950,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -979,7 +979,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -998,7 +998,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1027,7 +1027,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1046,7 +1046,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1075,7 +1075,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1094,7 +1094,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1123,7 +1123,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1142,7 +1142,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1171,7 +1171,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1192,7 +1192,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1221,7 +1221,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1240,7 +1240,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1269,7 +1269,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1288,7 +1288,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1317,7 +1317,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1336,7 +1336,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1365,7 +1365,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1386,7 +1386,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1415,7 +1415,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1434,7 +1434,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1463,7 +1463,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1482,7 +1482,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1511,7 +1511,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1530,7 +1530,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1559,7 +1559,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1578,7 +1578,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1607,7 +1607,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1626,7 +1626,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1655,7 +1655,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1676,7 +1676,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1705,7 +1705,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1730,7 +1730,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1759,7 +1759,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1784,7 +1784,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1813,7 +1813,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1832,7 +1832,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1861,7 +1861,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1882,7 +1882,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1911,7 +1911,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1930,7 +1930,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -1959,7 +1959,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -1978,7 +1978,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2007,7 +2007,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2026,7 +2026,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2055,7 +2055,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2074,7 +2074,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2103,7 +2103,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2122,7 +2122,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2151,7 +2151,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2171,7 +2171,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2200,7 +2200,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2219,7 +2219,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2248,7 +2248,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2267,7 +2267,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2296,7 +2296,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2315,7 +2315,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2344,7 +2344,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2363,7 +2363,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2392,7 +2392,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2412,7 +2412,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2441,7 +2441,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2460,7 +2460,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2489,7 +2489,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2508,7 +2508,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2537,7 +2537,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2556,7 +2556,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2585,7 +2585,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2607,7 +2607,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2636,7 +2636,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2655,7 +2655,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2684,7 +2684,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
@@ -2703,7 +2703,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "16f6",
+          "17a5241e",
           "--xctest"
         ],
         "merge": {
@@ -2732,7 +2732,7 @@
               "path": "Runtime-ios-18.4"
             },
             {
-              "name": "xcode_ios_16f6",
+              "name": "xcode_ios_17a5241e",
               "path": "Xcode.app"
             }
           ],
diff --git a/infra/config/generated/builders/try/linux_chromium_chromeos_asan_rel_ng/targets/chromium.memory.json b/infra/config/generated/builders/try/linux_chromium_chromeos_asan_rel_ng/targets/chromium.memory.json
index ebfe9be..b96446f6 100644
--- a/infra/config/generated/builders/try/linux_chromium_chromeos_asan_rel_ng/targets/chromium.memory.json
+++ b/infra/config/generated/builders/try/linux_chromium_chromeos_asan_rel_ng/targets/chromium.memory.json
@@ -495,7 +495,7 @@
             "os": "Ubuntu-22.04"
           },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 14
+          "shards": 28
         },
         "test": "content_browsertests",
         "test_id_prefix": "ninja://content/test:content_browsertests/"
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg
index 85bbd3ab..5b6223a3 100644
--- a/infra/config/generated/luci/commit-queue.cfg
+++ b/infra/config/generated/luci/commit-queue.cfg
@@ -610,13 +610,6 @@
         owner_whitelist_group: "google/optimization-guide-try-opt-in@google.com"
       }
       builders {
-        name: "chrome/try/test-o-emulator"
-        includable_only: true
-        result_visibility: COMMENT_LEVEL_RESTRICTED
-        owner_whitelist_group: "googlers"
-        owner_whitelist_group: "project-chromium-robot-committers"
-      }
-      builders {
         name: "chrome/try/webview-arm64-rel-ready"
         includable_only: true
         result_visibility: COMMENT_LEVEL_RESTRICTED
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index cede9f2..0a93545 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -49122,8 +49122,8 @@
       priority: 35
       execution_timeout_secs: 10800
       caches {
-        name: "xcode_ios_16f6"
-        path: "xcode_ios_16f6.app"
+        name: "xcode_ios_17a5241e"
+        path: "xcode_ios_17a5241e.app"
       }
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/infra/config/groups/cq-usage/CQ_USAGE_OWNERS b/infra/config/groups/cq-usage/CQ_USAGE_OWNERS
index c9af944..777fd51d 100644
--- a/infra/config/groups/cq-usage/CQ_USAGE_OWNERS
+++ b/infra/config/groups/cq-usage/CQ_USAGE_OWNERS
@@ -1,3 +1,6 @@
 bpastene@chromium.org
 estaab@chromium.org
-gatong@chromium.org
\ No newline at end of file
+gatong@chromium.org
+
+# For Android CQ Builders
+hypan@google.com
\ No newline at end of file
diff --git a/infra/config/subprojects/chrome/try.star b/infra/config/subprojects/chrome/try.star
index 78b01d5..dad20ed 100644
--- a/infra/config/subprojects/chrome/try.star
+++ b/infra/config/subprojects/chrome/try.star
@@ -377,10 +377,6 @@
 )
 
 chrome_internal_verifier(
-    builder = "test-o-emulator",
-)
-
-chrome_internal_verifier(
     branch_selector = branches.selector.ANDROID_BRANCHES,
     builder = "webview-arm64-rel-ready",
 )
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star
index b3d1916..95b536ad 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -1568,7 +1568,7 @@
             "mac_beta_arm64",
             "mac_toolchain",
             "out_dir_arg",
-            "xcode_16_beta",
+            "xcode_26_beta",
             "xctest",
         ],
     ),
@@ -1579,7 +1579,7 @@
         short_name = "ios-blk",
     ),
     execution_timeout = 3 * time.hour,
-    xcode = xcode.x16betabots,
+    xcode = xcode.x26betabots,
 )
 
 fyi_ios_builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.memory.star b/infra/config/subprojects/chromium/ci/chromium.memory.star
index c4f8da5..e72d1f6 100644
--- a/infra/config/subprojects/chromium/ci/chromium.memory.star
+++ b/infra/config/subprojects/chromium/ci/chromium.memory.star
@@ -445,8 +445,8 @@
             ),
             "content_browsertests": targets.mixin(
                 swarming = targets.swarming(
-                    # https://crbug.com/1471857
-                    shards = 14,
+                    # https://crbug.com/1471857, crbug.com/409823026
+                    shards = 28,
                 ),
             ),
             "gin_unittests": targets.remove(
diff --git a/infra/config/subprojects/chromium/ci/chromium.star b/infra/config/subprojects/chromium/ci/chromium.star
index edbd6154..d767c146 100644
--- a/infra/config/subprojects/chromium/ci/chromium.star
+++ b/infra/config/subprojects/chromium/ci/chromium.star
@@ -359,6 +359,7 @@
         chromium_config = builder_config.chromium_config(
             config = "chromium",
             apply_configs = [
+                "clobber",
                 "mb",
             ],
             build_config = builder_config.build_config.RELEASE,
diff --git a/infra/inclusive_language_presubmit_exempt_dirs.txt b/infra/inclusive_language_presubmit_exempt_dirs.txt
index 3d59432..b7ce55b 100644
--- a/infra/inclusive_language_presubmit_exempt_dirs.txt
+++ b/infra/inclusive_language_presubmit_exempt_dirs.txt
@@ -637,7 +637,6 @@
 third_party/rust/chromium_crates_io/vendor/anstyle-v1
 third_party/rust/chromium_crates_io/vendor/anyhow-v1
 third_party/rust/chromium_crates_io/vendor/anyhow-v1/.github/workflows
-third_party/rust/chromium_crates_io/vendor/autocfg-v1
 third_party/rust/chromium_crates_io/vendor/base64-v0_22
 third_party/rust/chromium_crates_io/vendor/bytes-v1/.github/workflows
 third_party/rust/chromium_crates_io/vendor/clap_builder-v4/src
diff --git a/internal b/internal
index 26795f3..e6bcedca 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit 26795f31e4ce2586e12dfb1897cbd87573277cff
+Subproject commit e6bcedcaefb97479ce80b4611257b3149cae2409
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd
index 6f4647b..0e7f00c6 100644
--- a/ios/chrome/app/strings/ios_chromium_strings.grd
+++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -1124,9 +1124,6 @@
       <message name="IDS_IOS_SYNC_PASSPHRASE_RECOVER" desc="Message about how to recover from a lost passphrase. [Length:100em, may be multiple lines] [iOS only]">
         If you forgot your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>delete the Chromium data in your account<ph name="END_LINK">END_LINK</ph>.
       </message>
-      <message name="IDS_IOS_TAB_GROUPS_PANEL_OUT_OF_DATE_MESSAGE_CELL_TEXT" desc="Text for the out-of-date cell that can appear at the top of the tab groups panel when the app is out-of-date to support shared tab groups.">
-        Update Chromium to continue using your shared tab groups
-      </message>
       <message name="IDS_IOS_TAB_SWITCHER_NO_TABS_TO_SYNC_PROMO" desc="The title of the paragraph IDS_OPEN_TABS_NO_SESSION_INSTRUCTIONS_IOS. The paragraph explains that tabs opened on other devices where the user is signed in will appear here, in the Tab Switcher. [iOS only]">
         Use Chromium everywhere
       </message>
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd
index 53725a3..5489516 100644
--- a/ios/chrome/app/strings/ios_google_chrome_strings.grd
+++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -1130,9 +1130,6 @@
       <message name="IDS_IOS_SYNC_PASSPHRASE_RECOVER" desc="Message about how to recover from a lost passphrase. [Length:100em, may be multiple lines] [iOS only]">
         If you forgot your passphrase or want to change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>delete the Chrome data in your account<ph name="END_LINK">END_LINK</ph>.
       </message>
-      <message name="IDS_IOS_TAB_GROUPS_PANEL_OUT_OF_DATE_MESSAGE_CELL_TEXT" desc="Text for the out-of-date cell that can appear at the top of the tab groups panel when the app is out-of-date to support shared tab groups.">
-        Update Chrome to continue using your shared tab groups
-      </message>
       <message name="IDS_IOS_TAB_SWITCHER_NO_TABS_TO_SYNC_PROMO" desc="The title of the paragraph IDS_OPEN_TABS_NO_SESSION_INSTRUCTIONS_IOS. The paragraph explains that tabs opened on other devices where the user is signed in will appear here, in the Tab Switcher. [iOS only]">
         Use Chrome everywhere
       </message>
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_TAB_GROUPS_PANEL_OUT_OF_DATE_MESSAGE_CELL_TEXT.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_TAB_GROUPS_PANEL_OUT_OF_DATE_MESSAGE_CELL_TEXT.png.sha1
deleted file mode 100644
index a6c328e7..0000000
--- a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_TAB_GROUPS_PANEL_OUT_OF_DATE_MESSAGE_CELL_TEXT.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-5402141ab73bc84299b6b0882a4434a5b0f65989
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 1d99acc..fb8b7849 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -6712,9 +6712,6 @@
       <message name="IDS_IOS_TAB_GRID_UNDO_CLOSE_ALL_BUTTON" desc="Title of the button in the tab grid UI that revert the close all action recently taken by the user. [iOS only]">
         Undo
       </message>
-      <message name="IDS_IOS_TAB_GROUPS_AVAILABLE_AGAIN_IPH_MESSAGE" desc="The text that appears in the in-product help tooltip anchored on the tab groups panel when the shared tab groups are available again (typically after having updated the app).">
-        Your shared tab groups are available again
-      </message>
       <message name="IDS_IOS_TAB_GROUPS_PANEL_CELL_ACCESSIBILITY_LABEL_FORMAT" desc="Format for the accessibility label of a cell in the Tab Groups panel in Tab Grid. [iOS only]">
         Open <ph name="GROUP_TITLE">$1<ex>Travel</ex></ph>, group of <ph name="NUMBER_OF_TABS">$2<ex>4 Tabs</ex></ph>, <ph name="CREATION_TEXT">$3<ex>created 3 days ago</ex></ph>
       </message>
diff --git a/ios/chrome/browser/app_launcher/model/app_launcher_browser_agent.mm b/ios/chrome/browser/app_launcher/model/app_launcher_browser_agent.mm
index c1ea749..1ca62860 100644
--- a/ios/chrome/browser/app_launcher/model/app_launcher_browser_agent.mm
+++ b/ios/chrome/browser/app_launcher/model/app_launcher_browser_agent.mm
@@ -6,7 +6,9 @@
 
 #import "base/check.h"
 #import "base/functional/bind.h"
+#import "base/functional/callback_helpers.h"
 #import "base/metrics/histogram_macros.h"
+#import "base/task/sequenced_task_runner.h"
 #import "ios/chrome/browser/app_launcher/model/app_launcher_tab_helper.h"
 #import "ios/chrome/browser/mailto_handler/model/mailto_handler_service.h"
 #import "ios/chrome/browser/mailto_handler/model/mailto_handler_service_factory.h"
diff --git a/ios/chrome/browser/contextual_panel/sample/model/sample_panel_model.mm b/ios/chrome/browser/contextual_panel/sample/model/sample_panel_model.mm
index 46a446f3..aa95c17c 100644
--- a/ios/chrome/browser/contextual_panel/sample/model/sample_panel_model.mm
+++ b/ios/chrome/browser/contextual_panel/sample/model/sample_panel_model.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/contextual_panel/sample/model/sample_panel_model.h"
 
+#import "base/task/sequenced_task_runner.h"
 #import "components/feature_engagement/public/event_constants.h"
 #import "components/feature_engagement/public/feature_constants.h"
 #import "ios/chrome/browser/contextual_panel/sample/model/sample_panel_item_configuration.h"
diff --git a/ios/chrome/browser/dialogs/ui_bundled/overlay_java_script_dialog_presenter_unittest.mm b/ios/chrome/browser/dialogs/ui_bundled/overlay_java_script_dialog_presenter_unittest.mm
index 8db7eca..a79d643 100644
--- a/ios/chrome/browser/dialogs/ui_bundled/overlay_java_script_dialog_presenter_unittest.mm
+++ b/ios/chrome/browser/dialogs/ui_bundled/overlay_java_script_dialog_presenter_unittest.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/dialogs/ui_bundled/overlay_java_script_dialog_presenter.h"
 
+#import "base/functional/callback_helpers.h"
 #import "base/strings/sys_string_conversions.h"
 #import "ios/chrome/browser/overlays/model/public/overlay_request.h"
 #import "ios/chrome/browser/overlays/model/public/overlay_request_queue.h"
diff --git a/ios/chrome/browser/intelligence/bwg/coordinator/bwg_mediator.mm b/ios/chrome/browser/intelligence/bwg/coordinator/bwg_mediator.mm
index 6464e461..964fdec 100644
--- a/ios/chrome/browser/intelligence/bwg/coordinator/bwg_mediator.mm
+++ b/ios/chrome/browser/intelligence/bwg/coordinator/bwg_mediator.mm
@@ -118,11 +118,7 @@
       page_context_completion_callback =
           base::BindOnce(^void(PageContextWrapperCallbackResponse response) {
             BWGMediator* strongSelf = weakSelf;
-            // TODO(crbug.com/422506000): Handle PageContextWrapper error
-            // states, and pipe them down.
-            if (response.has_value()) {
-              [strongSelf openBWGOverlayForPage:std::move(response.value())];
-            }
+            [strongSelf openBWGOverlayForPage:std::move(response)];
             strongSelf->_pageContextWrapper = nil;
           });
 
@@ -135,13 +131,13 @@
   [_pageContextWrapper populatePageContextFieldsAsync];
 }
 
-// Opens the BWG overlay with a given page context.
+// Opens the BWG overlay with a given PageContextWrapperCallbackResponse.
 - (void)openBWGOverlayForPage:
-    (std::unique_ptr<optimization_guide::proto::PageContext>)pageContext {
+    (PageContextWrapperCallbackResponse)pageContextWrapperResponse {
   BwgService* bwgService =
       BwgServiceFactory::GetForProfile(_browser->GetProfile());
-  bwgService->PresentOverlayOnViewController(self.baseViewController,
-                                             std::move(pageContext));
+  bwgService->PresentOverlayOnViewController(
+      self.baseViewController, std::move(pageContextWrapperResponse));
 
   // TODO(crbug.com/419064727): Dismiss bwg promo/consent.
 }
diff --git a/ios/chrome/browser/intelligence/bwg/model/BUILD.gn b/ios/chrome/browser/intelligence/bwg/model/BUILD.gn
index 3803f46..ac59273 100644
--- a/ios/chrome/browser/intelligence/bwg/model/BUILD.gn
+++ b/ios/chrome/browser/intelligence/bwg/model/BUILD.gn
@@ -12,6 +12,8 @@
     "//components/prefs",
     "//components/signin/public/identity_manager",
     "//ios/chrome/browser/intelligence/bwg/metrics",
+    "//ios/chrome/browser/intelligence/bwg/model:config",
+    "//ios/chrome/browser/intelligence/proto_wrappers",
     "//ios/chrome/browser/shared/model/prefs:pref_names",
     "//ios/chrome/browser/signin/model:authentication_service",
     "//ios/chrome/browser/signin/model:authentication_service_factory",
diff --git a/ios/chrome/browser/intelligence/bwg/model/bwg_service.h b/ios/chrome/browser/intelligence/bwg/model/bwg_service.h
index 30251b3a..5e44bc2 100644
--- a/ios/chrome/browser/intelligence/bwg/model/bwg_service.h
+++ b/ios/chrome/browser/intelligence/bwg/model/bwg_service.h
@@ -8,10 +8,17 @@
 #import <UIKit/UIKit.h>
 
 #import "base/memory/raw_ptr.h"
+#import "base/types/expected.h"
 #import "components/keyed_service/core/keyed_service.h"
-#import "components/optimization_guide/proto/features/common_quality_data.pb.h"
 
 class AuthenticationService;
+
+enum class PageContextWrapperError;
+
+namespace optimization_guide::proto {
+class PageContext;
+}  // namespace optimization_guide::proto
+
 namespace signin {
 class IdentityManager;
 }  // namespace signin
@@ -25,10 +32,12 @@
              PrefService* pref_service);
   ~BwgService() override;
 
-  // Presents the overlay on a given view controller.
+  // Presents the overlay on a given view controller for a given expected
+  // PageContext.
   void PresentOverlayOnViewController(
       UIViewController* base_view_controller,
-      std::unique_ptr<optimization_guide::proto::PageContext> page_context);
+      base::expected<std::unique_ptr<optimization_guide::proto::PageContext>,
+                     PageContextWrapperError> expected_page_context);
 
   // Returns whether the current profile is eligible for BWG.
   // TODO(crbug.com/419066154): Use this function to show the entry point.
diff --git a/ios/chrome/browser/intelligence/bwg/model/bwg_service.mm b/ios/chrome/browser/intelligence/bwg/model/bwg_service.mm
index df741a9..28857a7c 100644
--- a/ios/chrome/browser/intelligence/bwg/model/bwg_service.mm
+++ b/ios/chrome/browser/intelligence/bwg/model/bwg_service.mm
@@ -7,13 +7,29 @@
 #import <memory>
 
 #import "base/metrics/histogram_functions.h"
+#import "components/optimization_guide/proto/features/common_quality_data.pb.h"
 #import "components/prefs/pref_service.h"
 #import "components/signin/public/identity_manager/identity_manager.h"
 #import "ios/chrome/browser/intelligence/bwg/metrics/bwg_metrics.h"
+#import "ios/chrome/browser/intelligence/bwg/model/bwg_configuration.h"
+#import "ios/chrome/browser/intelligence/proto_wrappers/page_context_wrapper.h"
 #import "ios/chrome/browser/shared/model/prefs/pref_names.h"
 #import "ios/chrome/browser/signin/model/authentication_service.h"
 #import "ios/public/provider/chrome/browser/bwg/bwg_api.h"
 
+namespace {
+// Helper to convert PageContextWrapperError to BWGPageContextState.
+ios::provider::BWGPageContextState BWGPageContextFromPageContextWrapperError(
+    PageContextWrapperError error) {
+  switch (error) {
+    case PageContextWrapperError::kForceDetachError:
+      return ios::provider::BWGPageContextState::kProtected;
+    default:
+      return ios::provider::BWGPageContextState::kError;
+  }
+}
+}  // namespace
+
 BwgService::BwgService(AuthenticationService* auth_service,
                        signin::IdentityManager* identity_manager,
                        PrefService* pref_service) {
@@ -26,9 +42,24 @@
 
 void BwgService::PresentOverlayOnViewController(
     UIViewController* base_view_controller,
-    std::unique_ptr<optimization_guide::proto::PageContext> page_context) {
-  ios::provider::StartBwgOverlay(base_view_controller, auth_service_,
-                                 std::move(page_context));
+    base::expected<std::unique_ptr<optimization_guide::proto::PageContext>,
+                   PageContextWrapperError> expected_page_context) {
+  BWGConfiguration* config = [[BWGConfiguration alloc] init];
+  config.baseViewController = base_view_controller;
+  config.authService = auth_service_;
+
+  std::unique_ptr<optimization_guide::proto::PageContext> pageContext = nullptr;
+  if (expected_page_context.has_value()) {
+    pageContext = std::move(expected_page_context.value());
+    config.BWGPageContextState =
+        ios::provider::BWGPageContextState::kSuccessfullyAttached;
+  } else {
+    config.BWGPageContextState = BWGPageContextFromPageContextWrapperError(
+        expected_page_context.error());
+  }
+
+  config.pageContext = std::move(pageContext);
+  ios::provider::StartBwgOverlay(config);
 }
 
 bool BwgService::IsEligibleForBWG() {
diff --git a/ios/chrome/browser/omnibox/coordinator/omnibox_coordinator.mm b/ios/chrome/browser/omnibox/coordinator/omnibox_coordinator.mm
index 6daec22..a2f8dc1 100644
--- a/ios/chrome/browser/omnibox/coordinator/omnibox_coordinator.mm
+++ b/ios/chrome/browser/omnibox/coordinator/omnibox_coordinator.mm
@@ -28,7 +28,6 @@
 #import "ios/chrome/browser/omnibox/model/omnibox_controller_ios.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_pedal_annotator.h"
-#import "ios/chrome/browser/omnibox/model/omnibox_popup_view_ios.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_text_controller.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_text_model.h"
 #import "ios/chrome/browser/omnibox/model/placeholder_service.h"
@@ -307,16 +306,12 @@
 - (OmniboxPopupCoordinator*)createPopupCoordinator:
     (id<OmniboxPopupPresenterDelegate>)presenterDelegate {
   DCHECK(!_popupCoordinator);
-  std::unique_ptr<OmniboxPopupViewIOS> popupView =
-      std::make_unique<OmniboxPopupViewIOS>(_omniboxEditModel.get(),
-                                            _omniboxAutocompleteController);
 
   OmniboxPopupCoordinator* coordinator = [[OmniboxPopupCoordinator alloc]
          initWithBaseViewController:nil
                             browser:self.browser
              autocompleteController:_omniboxController
                                         ->autocomplete_controller()
-                          popupView:std::move(popupView)
       omniboxAutocompleteController:_omniboxAutocompleteController];
   coordinator.presenterDelegate = presenterDelegate;
 
diff --git a/ios/chrome/browser/omnibox/coordinator/popup/omnibox_popup_coordinator.h b/ios/chrome/browser/omnibox/coordinator/popup/omnibox_popup_coordinator.h
index bc0c28a..619a94e 100644
--- a/ios/chrome/browser/omnibox/coordinator/popup/omnibox_popup_coordinator.h
+++ b/ios/chrome/browser/omnibox/coordinator/popup/omnibox_popup_coordinator.h
@@ -5,15 +5,12 @@
 #ifndef IOS_CHROME_BROWSER_OMNIBOX_COORDINATOR_POPUP_OMNIBOX_POPUP_COORDINATOR_H_
 #define IOS_CHROME_BROWSER_OMNIBOX_COORDINATOR_POPUP_OMNIBOX_POPUP_COORDINATOR_H_
 
-#include <memory>
-
 #import "ios/chrome/browser/shared/coordinator/chrome_coordinator/chrome_coordinator.h"
 
 class AutocompleteController;
 @class OmniboxAutocompleteController;
 @protocol OmniboxKeyboardDelegate;
 @protocol OmniboxPopupPresenterDelegate;
-class OmniboxPopupViewIOS;
 @protocol ToolbarOmniboxConsumer;
 
 /// Coordinator for the Omnibox Popup.
@@ -23,9 +20,6 @@
                                    browser:(Browser*)browser
                     autocompleteController:
                         (AutocompleteController*)autocompleteController
-                                 popupView:
-                                     (std::unique_ptr<OmniboxPopupViewIOS>)
-                                         popupView
              omniboxAutocompleteController:
                  (OmniboxAutocompleteController*)omniboxAutocompleteController
     NS_DESIGNATED_INITIALIZER;
diff --git a/ios/chrome/browser/omnibox/coordinator/popup/omnibox_popup_coordinator.mm b/ios/chrome/browser/omnibox/coordinator/popup/omnibox_popup_coordinator.mm
index 6ba4345..4c397df3 100644
--- a/ios/chrome/browser/omnibox/coordinator/popup/omnibox_popup_coordinator.mm
+++ b/ios/chrome/browser/omnibox/coordinator/popup/omnibox_popup_coordinator.mm
@@ -25,7 +25,6 @@
 #import "ios/chrome/browser/omnibox/debugger/omnibox_debugger_view_controller.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_autocomplete_controller.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_image_fetcher.h"
-#import "ios/chrome/browser/omnibox/model/omnibox_popup_view_ios.h"
 #import "ios/chrome/browser/omnibox/public/omnibox_ui_features.h"
 #import "ios/chrome/browser/omnibox/ui/popup/carousel/carousel_item.h"
 #import "ios/chrome/browser/omnibox/ui/popup/carousel/carousel_item_menu_provider.h"
@@ -52,9 +51,7 @@
 #import "ui/base/device_form_factor.h"
 
 @interface OmniboxPopupCoordinator () <OmniboxPopupMediatorProtocolProvider,
-                                       OmniboxPopupMediatorSharingDelegate> {
-  std::unique_ptr<OmniboxPopupViewIOS> _popupView;
-}
+                                       OmniboxPopupMediatorSharingDelegate>
 
 @property(nonatomic, strong) OmniboxPopupViewController* popupViewController;
 @property(nonatomic, strong) OmniboxPopupMediator* mediator;
@@ -80,16 +77,12 @@
                                    browser:(Browser*)browser
                     autocompleteController:
                         (AutocompleteController*)autocompleteController
-                                 popupView:
-                                     (std::unique_ptr<OmniboxPopupViewIOS>)
-                                         popupView
              omniboxAutocompleteController:
                  (OmniboxAutocompleteController*)omniboxAutocompleteController {
   self = [super initWithBaseViewController:nil browser:browser];
   if (self) {
     DCHECK(autocompleteController);
     _autocompleteController = autocompleteController;
-    _popupView = std::move(popupView);
     _popupViewController = [[OmniboxPopupViewController alloc] init];
     _KeyboardDelegate = _popupViewController;
     _omniboxAutocompleteController = omniboxAutocompleteController;
@@ -168,7 +161,6 @@
 
   [self.sharingCoordinator stop];
   self.sharingCoordinator = nil;
-  _popupView.reset();
 }
 
 - (BOOL)isOpen {
diff --git a/ios/chrome/browser/omnibox/model/BUILD.gn b/ios/chrome/browser/omnibox/model/BUILD.gn
index 523ec1c..1821328b 100644
--- a/ios/chrome/browser/omnibox/model/BUILD.gn
+++ b/ios/chrome/browser/omnibox/model/BUILD.gn
@@ -78,8 +78,6 @@
     "omnibox_image_fetcher.mm",
     "omnibox_pedal_annotator.h",
     "omnibox_pedal_annotator.mm",
-    "omnibox_popup_view_ios.h",
-    "omnibox_popup_view_ios.mm",
     "omnibox_text_controller.h",
     "omnibox_text_controller.mm",
     "omnibox_text_controller_delegate.h",
@@ -189,8 +187,6 @@
     "omnibox_autocomplete_controller+Testing.h",
     "test_omnibox_edit_model_ios.h",
     "test_omnibox_edit_model_ios.mm",
-    "test_omnibox_popup_view_ios.h",
-    "test_omnibox_popup_view_ios.mm",
   ]
 
   deps = [
diff --git a/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.h b/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.h
index 8bfb00a..eef2c17 100644
--- a/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.h
+++ b/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.h
@@ -30,7 +30,6 @@
 
 @class OmniboxAutocompleteController;
 class OmniboxControllerIOS;
-class OmniboxPopupViewIOS;
 @class OmniboxTextController;
 
 class OmniboxEditModelIOS {
@@ -41,10 +40,6 @@
   OmniboxEditModelIOS(const OmniboxEditModelIOS&) = delete;
   OmniboxEditModelIOS& operator=(const OmniboxEditModelIOS&) = delete;
 
-  void set_popup_view(OmniboxPopupViewIOS* popup_view);
-  OmniboxPopupViewIOS* get_popup_view() { return popup_view_; }
-  const OmniboxPopupViewIOS* get_popup_view() const { return popup_view_; }
-
   void set_omnibox_autocomplete_controller(
       OmniboxAutocompleteController* omnibox_autocomplete_controller) {
     omnibox_autocomplete_controller_ = omnibox_autocomplete_controller;
@@ -259,12 +254,6 @@
                  const std::u16string& pasted_text,
                  base::TimeTicks match_selection_timestamp = base::TimeTicks());
 
-  // Copies a match corresponding to the current text into `match`, and
-  // populates `alternate_nav_url` as well if it's not nullptr. If the popup
-  // is closed, the match is generated from the autocomplete classifier.
-  void GetInfoForCurrentText(AutocompleteMatch* match,
-                             GURL* alternate_nav_url) const;
-
   // Returns view text if there is a view. Until the model is made the
   // primary data source, this should not be called when there's no view.
   std::u16string GetText() const;
@@ -281,10 +270,6 @@
   // The autocomplete controller.
   __weak OmniboxAutocompleteController* omnibox_autocomplete_controller_ = nil;
 
-  // The popup view is nullptr when there's no popup, and is non-null when
-  // a popup view exists (i.e. between calls to `set_popup_view`).
-  raw_ptr<OmniboxPopupViewIOS> popup_view_ = nullptr;
-
   base::WeakPtrFactory<OmniboxEditModelIOS> weak_factory_{this};
 };
 
diff --git a/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.mm b/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.mm
index 1db4908d..be17d835 100644
--- a/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.mm
+++ b/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.mm
@@ -68,7 +68,6 @@
 #import "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_autocomplete_controller.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_controller_ios.h"
-#import "ios/chrome/browser/omnibox/model/omnibox_popup_view_ios.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_text_controller.h"
 #import "net/cookies/cookie_util.h"
 #import "third_party/icu/source/common/unicode/ubidi.h"
@@ -86,10 +85,6 @@
 
 OmniboxEditModelIOS::~OmniboxEditModelIOS() = default;
 
-void OmniboxEditModelIOS::set_popup_view(OmniboxPopupViewIOS* popup_view) {
-  popup_view_ = popup_view;
-}
-
 void OmniboxEditModelIOS::set_text_controller(
     OmniboxTextController* text_controller) {
   text_controller_ = text_controller;
@@ -105,7 +100,8 @@
   // If we have a valid match use it. Otherwise get one for the current text.
   AutocompleteMatch match = text_model_->current_match;
   if (!match.destination_url.is_valid()) {
-    GetInfoForCurrentText(&match, alternate_nav_url);
+    [text_controller_ getInfoForCurrentText:&match
+                     alternateNavigationURL:alternate_nav_url];
   } else if (alternate_nav_url) {
     AutocompleteProviderClient* provider_client =
         autocomplete_controller()->autocomplete_provider_client();
@@ -140,7 +136,8 @@
 void OmniboxEditModelIOS::SetUserText(const std::u16string& text) {
   [text_controller_ setInputInProgress:YES];
   text_model_->UpdateUserText(text);
-  GetInfoForCurrentText(&text_model_->current_match, nullptr);
+  [text_controller_ getInfoForCurrentText:&text_model_->current_match
+                   alternateNavigationURL:nullptr];
   text_model_->paste_state = OmniboxPasteState::kNone;
 }
 
@@ -270,48 +267,8 @@
   return true;
 }
 
-// static
-const char OmniboxEditModelIOS::kCutOrCopyAllTextHistogram[] =
-    "Omnibox.CutOrCopyAllText";
-
-void OmniboxEditModelIOS::GetInfoForCurrentText(AutocompleteMatch* match,
-                                                GURL* alternate_nav_url) const {
-  DCHECK(match);
-
-  // If there's a query in progress or the popup is open, pick out the default
-  // match or selected match, if there is one.
-  bool found_match_for_text = false;
-  if (!autocomplete_controller()->done() || PopupIsOpen()) {
-    if (!autocomplete_controller()->done() &&
-        autocomplete_controller()->result().default_match()) {
-      // The user cannot have manually selected a match, or the query would have
-      // stopped. So the default match must be the desired selection.
-      *match = *autocomplete_controller()->result().default_match();
-      found_match_for_text = true;
-    }
-    if (found_match_for_text && alternate_nav_url) {
-      AutocompleteProviderClient* provider_client =
-          autocomplete_controller()->autocomplete_provider_client();
-      *alternate_nav_url = AutocompleteResult::ComputeAlternateNavUrl(
-          text_model_->input, *match, provider_client);
-    }
-  }
-
-  if (!found_match_for_text) {
-    // For match generation, we use the unelided `url_for_editing_`, unless the
-    // user input is in progress.
-    std::u16string text_for_match_generation =
-        text_model_->user_input_in_progress ? text_model_->user_text
-                                            : text_model_->url_for_editing;
-
-    controller_->client()->GetAutocompleteClassifier()->Classify(
-        text_for_match_generation, false, true, GetPageClassification(), match,
-        alternate_nav_url);
-  }
-}
-
 bool OmniboxEditModelIOS::PopupIsOpen() const {
-  return popup_view_ && popup_view_->IsOpen();
+  return omnibox_autocomplete_controller_.hasSuggestions;
 }
 
 void OmniboxEditModelIOS::SetAutocompleteInput(AutocompleteInput input) {
@@ -349,11 +306,9 @@
     match.transition = ui::PAGE_TRANSITION_LINK;
   }
 
-  if (popup_view_) {
-    OpenMatch(OmniboxPopupSelection(OmniboxPopupSelection::kNoMatch), match,
-              disposition, alternate_nav_url, std::u16string(),
-              match_selection_timestamp);
-  }
+  OpenMatch(OmniboxPopupSelection(OmniboxPopupSelection::kNoMatch), match,
+            disposition, alternate_nav_url, std::u16string(),
+            match_selection_timestamp);
 }
 
 void OmniboxEditModelIOS::OpenMatch(OmniboxPopupSelection selection,
diff --git a/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios_unittest.mm b/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios_unittest.mm
index e8a28ba..7376bcf3 100644
--- a/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios_unittest.mm
+++ b/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios_unittest.mm
@@ -35,7 +35,6 @@
 #import "ios/chrome/browser/omnibox/model/omnibox_controller_ios.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_text_controller.h"
 #import "ios/chrome/browser/omnibox/model/test_omnibox_edit_model_ios.h"
-#import "ios/chrome/browser/omnibox/model/test_omnibox_popup_view_ios.h"
 #import "testing/gmock/include/gmock/gmock.h"
 #import "testing/gtest/include/gtest/gtest.h"
 #import "testing/platform_test.h"
diff --git a/ios/chrome/browser/omnibox/model/omnibox_popup_view_ios.h b/ios/chrome/browser/omnibox/model/omnibox_popup_view_ios.h
deleted file mode 100644
index d49753a..0000000
--- a/ios/chrome/browser/omnibox/model/omnibox_popup_view_ios.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_OMNIBOX_MODEL_OMNIBOX_POPUP_VIEW_IOS_H_
-#define IOS_CHROME_BROWSER_OMNIBOX_MODEL_OMNIBOX_POPUP_VIEW_IOS_H_
-
-#import <UIKit/UIKit.h>
-
-#import "base/memory/weak_ptr.h"
-
-@class OmniboxAutocompleteController;
-class OmniboxEditModelIOS;
-
-class OmniboxPopupViewIOS {
- public:
-  OmniboxPopupViewIOS(
-      OmniboxEditModelIOS* omnibox_edit_model,
-      OmniboxAutocompleteController* omnibox_autocomplete_controller);
-  virtual ~OmniboxPopupViewIOS();
-
-  // Returns true if the popup is currently open.
-  virtual bool IsOpen() const;
-
- private:
-  base::WeakPtr<OmniboxEditModelIOS> model_;
-
-  __weak OmniboxAutocompleteController* omnibox_autocomplete_controller_;
-};
-
-#endif  // IOS_CHROME_BROWSER_OMNIBOX_MODEL_OMNIBOX_POPUP_VIEW_IOS_H_
diff --git a/ios/chrome/browser/omnibox/model/omnibox_popup_view_ios.mm b/ios/chrome/browser/omnibox/model/omnibox_popup_view_ios.mm
deleted file mode 100644
index e0f59948..0000000
--- a/ios/chrome/browser/omnibox/model/omnibox_popup_view_ios.mm
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/omnibox/model/omnibox_popup_view_ios.h"
-
-#import "ios/chrome/browser/omnibox/model/omnibox_autocomplete_controller.h"
-#import "ios/chrome/browser/omnibox/model/omnibox_controller_ios.h"
-#import "ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.h"
-
-OmniboxPopupViewIOS::OmniboxPopupViewIOS(
-    OmniboxEditModelIOS* omnibox_edit_model,
-    OmniboxAutocompleteController* omnibox_autocomplete_controller)
-    : omnibox_autocomplete_controller_(omnibox_autocomplete_controller) {
-  model_ = omnibox_edit_model->AsWeakPtr();
-  model_->set_popup_view(this);
-}
-
-OmniboxPopupViewIOS::~OmniboxPopupViewIOS() {
-  model_->set_popup_view(nullptr);
-}
-
-bool OmniboxPopupViewIOS::IsOpen() const {
-  return omnibox_autocomplete_controller_.hasSuggestions;
-}
diff --git a/ios/chrome/browser/omnibox/model/omnibox_text_controller.h b/ios/chrome/browser/omnibox/model/omnibox_text_controller.h
index b9610bf..408179a4 100644
--- a/ios/chrome/browser/omnibox/model/omnibox_text_controller.h
+++ b/ios/chrome/browser/omnibox/model/omnibox_text_controller.h
@@ -85,6 +85,12 @@
 /// no user input in progress).
 - (void)revertState;
 
+/// Copies a match corresponding to the current text into `match`, and
+/// populates `alternate_nav_url` as well if it's not nullptr. If the popup
+/// is closed, the match is generated from the autocomplete classifier.
+- (void)getInfoForCurrentText:(AutocompleteMatch*)match
+       alternateNavigationURL:(GURL*)alternateNavigationURL;
+
 #pragma mark - Autocomplete event
 
 /// Sets the additional text.
diff --git a/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm b/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm
index cff86a04..874c93b 100644
--- a/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm
+++ b/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm
@@ -12,6 +12,7 @@
 #import "base/metrics/user_metrics.h"
 #import "base/metrics/user_metrics_action.h"
 #import "base/strings/sys_string_conversions.h"
+#import "components/omnibox/browser/autocomplete_classifier.h"
 #import "components/omnibox/browser/omnibox_client.h"
 #import "components/omnibox/browser/omnibox_text_util.h"
 #import "ios/chrome/browser/omnibox/model/autocomplete_suggestion.h"
@@ -256,6 +257,51 @@
   _omniboxController->client()->OnRevert();
 }
 
+- (void)getInfoForCurrentText:(AutocompleteMatch*)match
+       alternateNavigationURL:(GURL*)alternateNavigationURL {
+  DCHECK(match);
+
+  // If there's a query in progress or the popup is open, pick out the default
+  // match or selected match, if there is one.
+  bool found_match_for_text = false;
+  if (!_omniboxController->autocomplete_controller()->done() ||
+      _omniboxAutocompleteController.hasSuggestions) {
+    if (!_omniboxController->autocomplete_controller()->done() &&
+        _omniboxController->autocomplete_controller()
+            ->result()
+            .default_match()) {
+      // The user cannot have manually selected a match, or the query would have
+      // stopped. So the default match must be the desired selection.
+      *match = *_omniboxController->autocomplete_controller()
+                    ->result()
+                    .default_match();
+      found_match_for_text = true;
+    }
+    if (found_match_for_text && alternateNavigationURL) {
+      AutocompleteProviderClient* provider_client =
+          _omniboxController->autocomplete_controller()
+              ->autocomplete_provider_client();
+      *alternateNavigationURL = AutocompleteResult::ComputeAlternateNavUrl(
+          _omniboxTextModel->input, *match, provider_client);
+    }
+  }
+
+  if (!found_match_for_text) {
+    // For match generation, we use the unelided `url_for_editing_`, unless the
+    // user input is in progress.
+    std::u16string text_for_match_generation =
+        _omniboxTextModel->user_input_in_progress
+            ? _omniboxTextModel->user_text
+            : _omniboxTextModel->url_for_editing;
+
+    _omniboxController->client()->GetAutocompleteClassifier()->Classify(
+        text_for_match_generation, false, true,
+        _omniboxController->client()->GetPageClassification(
+            /*is_prefetch=*/false),
+        match, alternateNavigationURL);
+  }
+}
+
 #pragma mark - Autocomplete events
 
 - (void)setAdditionalText:(const std::u16string&)text {
diff --git a/ios/chrome/browser/omnibox/model/test_omnibox_popup_view_ios.h b/ios/chrome/browser/omnibox/model/test_omnibox_popup_view_ios.h
deleted file mode 100644
index 91c2f37..0000000
--- a/ios/chrome/browser/omnibox/model/test_omnibox_popup_view_ios.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_OMNIBOX_MODEL_TEST_OMNIBOX_POPUP_VIEW_IOS_H_
-#define IOS_CHROME_BROWSER_OMNIBOX_MODEL_TEST_OMNIBOX_POPUP_VIEW_IOS_H_
-
-#import "ios/chrome/browser/omnibox/model/omnibox_popup_view_ios.h"
-
-// Fake implementation of OmniboxPopupViewIOS for use in tests.
-class TestOmniboxPopupViewIOS : public OmniboxPopupViewIOS {
- public:
-  TestOmniboxPopupViewIOS()
-      : OmniboxPopupViewIOS(/*controller=*/nullptr,
-                            /*omnibox_autocomplete_controller=*/nil) {}
-  ~TestOmniboxPopupViewIOS() override = default;
-  bool IsOpen() const override;
-};
-
-#endif  // IOS_CHROME_BROWSER_OMNIBOX_MODEL_TEST_OMNIBOX_POPUP_VIEW_IOS_H_
diff --git a/ios/chrome/browser/omnibox/model/test_omnibox_popup_view_ios.mm b/ios/chrome/browser/omnibox/model/test_omnibox_popup_view_ios.mm
deleted file mode 100644
index d8a9c82..0000000
--- a/ios/chrome/browser/omnibox/model/test_omnibox_popup_view_ios.mm
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/omnibox/model/test_omnibox_popup_view_ios.h"
-
-bool TestOmniboxPopupViewIOS::IsOpen() const {
-  return false;
-}
diff --git a/ios/chrome/browser/providers/bwg/chromium_bwg.mm b/ios/chrome/browser/providers/bwg/chromium_bwg.mm
index 5ab103d..d1a2e2d 100644
--- a/ios/chrome/browser/providers/bwg/chromium_bwg.mm
+++ b/ios/chrome/browser/providers/bwg/chromium_bwg.mm
@@ -19,12 +19,6 @@
   return nullptr;
 }
 
-// TODO(crbug.com/422506000): Remove this once the provider is migrated.
-void StartBwgOverlay(
-    UIViewController* base_view_controller,
-    raw_ptr<AuthenticationService> auth_service,
-    std::unique_ptr<optimization_guide::proto::PageContext> page_context) {}
-
 void StartBwgOverlay(BWGConfiguration* bwg_configuration) {}
 
 const std::u16string GetPageContextShouldDetachScript() {
diff --git a/ios/chrome/browser/web/model/repost_form_tab_helper.mm b/ios/chrome/browser/web/model/repost_form_tab_helper.mm
index 950f095..4ad950b 100644
--- a/ios/chrome/browser/web/model/repost_form_tab_helper.mm
+++ b/ios/chrome/browser/web/model/repost_form_tab_helper.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/web/model/repost_form_tab_helper.h"
 
+#import "base/functional/callback_helpers.h"
 #import "base/memory/ptr_util.h"
 #import "ios/chrome/browser/web/model/repost_form_tab_helper_delegate.h"
 
diff --git a/ios/chrome/browser/web/model/repost_form_tab_helper_unittest.mm b/ios/chrome/browser/web/model/repost_form_tab_helper_unittest.mm
index bdbd4d3..9b06303 100644
--- a/ios/chrome/browser/web/model/repost_form_tab_helper_unittest.mm
+++ b/ios/chrome/browser/web/model/repost_form_tab_helper_unittest.mm
@@ -7,6 +7,7 @@
 #import <UIKit/UIKit.h>
 
 #import "base/functional/bind.h"
+#import "base/functional/callback_helpers.h"
 #import "ios/chrome/browser/web/model/repost_form_tab_helper_delegate.h"
 #import "ios/web/public/test/fakes/fake_web_state.h"
 #import "testing/gtest/include/gtest/gtest.h"
diff --git a/ios/chrome/test/providers/bwg/test_bwg.mm b/ios/chrome/test/providers/bwg/test_bwg.mm
index 4512dbe..8aab715 100644
--- a/ios/chrome/test/providers/bwg/test_bwg.mm
+++ b/ios/chrome/test/providers/bwg/test_bwg.mm
@@ -21,12 +21,6 @@
   return nullptr;
 }
 
-// TODO(crbug.com/422506000): Remove this once the provider is migrated.
-void StartBwgOverlay(
-    UIViewController* base_view_controller,
-    raw_ptr<AuthenticationService> auth_service,
-    std::unique_ptr<optimization_guide::proto::PageContext> page_context) {}
-
 void StartBwgOverlay(BWGConfiguration* bwg_configuration) {}
 
 const std::u16string GetPageContextShouldDetachScript() {
diff --git a/ios/public/provider/chrome/browser/bwg/bwg_api.h b/ios/public/provider/chrome/browser/bwg/bwg_api.h
index 0b64a0ef..8f177cee 100644
--- a/ios/public/provider/chrome/browser/bwg/bwg_api.h
+++ b/ios/public/provider/chrome/browser/bwg/bwg_api.h
@@ -9,12 +9,9 @@
 
 #import <string>
 
-#import "base/memory/raw_ptr.h"
 #import "components/optimization_guide/proto/features/common_quality_data.pb.h"
 #import "services/network/public/cpp/resource_request.h"
 
-class AuthenticationService;
-
 @class BWGConfiguration;
 
 namespace ios::provider {
@@ -44,12 +41,6 @@
 // Creates resource request for loading glic.
 std::unique_ptr<network::ResourceRequest> CreateResourceRequest();
 
-// TODO(crbug.com/422506000): Remove this once the provider is migrated.
-void StartBwgOverlay(
-    UIViewController* base_view_controller,
-    raw_ptr<AuthenticationService> auth_service,
-    std::unique_ptr<optimization_guide::proto::PageContext> page_context);
-
 // Starts the overlay experience with the given configuration.
 void StartBwgOverlay(BWGConfiguration* bwg_configuration);
 
diff --git a/ios/third_party/earl_grey2/src b/ios/third_party/earl_grey2/src
index 26e72194..3894e31 160000
--- a/ios/third_party/earl_grey2/src
+++ b/ios/third_party/earl_grey2/src
@@ -1 +1 @@
-Subproject commit 26e72194d8863202aeaad2f124f7964ae3f3934f
+Subproject commit 3894e319725773683ded248ee6dedea5b29a3189
diff --git a/ios/web/annotations/annotations_text_manager_impl.mm b/ios/web/annotations/annotations_text_manager_impl.mm
index f7292c0..b0fbc45 100644
--- a/ios/web/annotations/annotations_text_manager_impl.mm
+++ b/ios/web/annotations/annotations_text_manager_impl.mm
@@ -5,6 +5,7 @@
 #import "ios/web/annotations/annotations_text_manager_impl.h"
 
 #import "base/strings/string_util.h"
+#import "base/task/sequenced_task_runner.h"
 #import "ios/web/annotations/annotations_java_script_feature.h"
 #import "ios/web/common/features.h"
 #import "ios/web/common/url_scheme_util.h"
diff --git a/ios/web/web_state/web_state_delegate_bridge.mm b/ios/web/web_state/web_state_delegate_bridge.mm
index 767ea8af..75ec7eb 100644
--- a/ios/web/web_state/web_state_delegate_bridge.mm
+++ b/ios/web/web_state/web_state_delegate_bridge.mm
@@ -4,6 +4,8 @@
 
 #import "ios/web/public/web_state_delegate_bridge.h"
 
+#import "base/functional/callback.h"
+#import "base/functional/callback_helpers.h"
 #import "ios/web/public/ui/context_menu_params.h"
 
 namespace web {
diff --git a/ipc/BUILD.gn b/ipc/BUILD.gn
index 3cd4859..5e3128a 100644
--- a/ipc/BUILD.gn
+++ b/ipc/BUILD.gn
@@ -21,6 +21,7 @@
   sources = [
     # These are the param_traits sources needed by all platforms,
     # including ios. The rest are added in a conditional block below.
+    "ipc_channel.cc",
     "ipc_message_utils.cc",
     "ipc_message_utils.h",
     "ipc_mojo_param_traits.cc",
@@ -78,15 +79,6 @@
     ]
   }
 
-  if (is_nacl) {
-    sources += [
-      "ipc_channel_nacl.cc",
-      "ipc_channel_nacl.h",
-    ]
-  } else {
-    sources += [ "ipc_channel.cc" ]
-  }
-
   defines = [ "IS_IPC_IMPL" ]
 
   public_deps = [
diff --git a/ipc/DEPS b/ipc/DEPS
index 9a8d5bd..8597ed5 100644
--- a/ipc/DEPS
+++ b/ipc/DEPS
@@ -1,8 +1,6 @@
 include_rules = [
   "+crypto",
   "+mojo/public",
-  # For ipc_channel_nacl.cc:
-  "+native_client/src/public",
   "+sandbox/mac/seatbelt.h",
   "+services/tracing/public/cpp",
   "+third_party/perfetto/protos/perfetto/trace/track_event",
diff --git a/ipc/ipc_channel_nacl.cc b/ipc/ipc_channel_nacl.cc
deleted file mode 100644
index e7b6bd6..0000000
--- a/ipc/ipc_channel_nacl.cc
+++ /dev/null
@@ -1,398 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ipc/ipc_channel_nacl.h"
-
-#include <errno.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <sys/types.h>
-
-#include <algorithm>
-#include <memory>
-
-#include "base/functional/bind.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_pump_for_io.h"
-#include "base/notimplemented.h"
-#include "base/synchronization/lock.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/threading/simple_thread.h"
-#include "base/trace_event/trace_event.h"
-#include "ipc/ipc_listener.h"
-#include "ipc/ipc_logging.h"
-#include "ipc/ipc_message_attachment_set.h"
-#include "ipc/ipc_platform_file_attachment_posix.h"
-#include "native_client/src/public/imc_syscalls.h"
-#include "native_client/src/public/imc_types.h"
-
-namespace IPC {
-
-struct MessageContents {
-  std::vector<char> data;
-  std::vector<int> fds;
-};
-
-namespace {
-
-bool ReadDataOnReaderThread(int pipe, MessageContents* contents) {
-  DCHECK(pipe >= 0);
-  if (pipe < 0)
-    return false;
-
-  contents->data.resize(Channel::kReadBufferSize);
-  contents->fds.resize(NACL_ABI_IMC_DESC_MAX);
-
-  NaClAbiNaClImcMsgIoVec iov = { &contents->data[0], contents->data.size() };
-  NaClAbiNaClImcMsgHdr msg = {
-    &iov, 1, &contents->fds[0], contents->fds.size()
-  };
-
-  int bytes_read = imc_recvmsg(pipe, &msg, 0);
-
-  if (bytes_read <= 0) {
-    // NaClIPCAdapter::BlockingReceive returns -1 when the pipe closes (either
-    // due to error or for regular shutdown).
-    contents->data.clear();
-    contents->fds.clear();
-    return false;
-  }
-  DCHECK(bytes_read);
-  // Resize the buffers down to the number of bytes and fds we actually read.
-  contents->data.resize(bytes_read);
-  contents->fds.resize(msg.desc_length);
-  return true;
-}
-
-}  // namespace
-
-// static
-constexpr size_t Channel::kMaximumMessageSize;
-
-class ChannelNacl::ReaderThreadRunner
-    : public base::DelegateSimpleThread::Delegate {
- public:
-  // |pipe|: A file descriptor from which we will read using imc_recvmsg.
-  // |data_read_callback|: A callback we invoke (on the main thread) when we
-  //                       have read data.
-  // |failure_callback|: A callback we invoke when we have a failure reading
-  //                     from |pipe|.
-  // |main_message_loop|: A proxy for the main thread, where we will invoke the
-  //                      above callbacks.
-  ReaderThreadRunner(
-      int pipe,
-      base::RepeatingCallback<void(std::unique_ptr<MessageContents>)>
-          data_read_callback,
-      base::RepeatingCallback<void()> failure_callback,
-      scoped_refptr<base::SingleThreadTaskRunner> main_task_runner);
-
-  ReaderThreadRunner(const ReaderThreadRunner&) = delete;
-  ReaderThreadRunner& operator=(const ReaderThreadRunner&) = delete;
-
-  // DelegateSimpleThread implementation. Reads data from the pipe in a loop
-  // until either we are told to quit or a read fails.
-  void Run() override;
-
- private:
-  int pipe_;
-  base::RepeatingCallback<void(std::unique_ptr<MessageContents>)>
-      data_read_callback_;
-  base::RepeatingCallback<void()> failure_callback_;
-  scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-};
-
-ChannelNacl::ReaderThreadRunner::ReaderThreadRunner(
-    int pipe,
-    base::RepeatingCallback<void(std::unique_ptr<MessageContents>)>
-        data_read_callback,
-    base::RepeatingCallback<void()> failure_callback,
-    scoped_refptr<base::SingleThreadTaskRunner> main_task_runner)
-    : pipe_(pipe),
-      data_read_callback_(data_read_callback),
-      failure_callback_(failure_callback),
-      main_task_runner_(main_task_runner) {}
-
-void ChannelNacl::ReaderThreadRunner::Run() {
-  while (true) {
-    std::unique_ptr<MessageContents> msg_contents(new MessageContents);
-    bool success = ReadDataOnReaderThread(pipe_, msg_contents.get());
-    if (success) {
-      main_task_runner_->PostTask(
-          FROM_HERE,
-          base::BindOnce(data_read_callback_, std::move(msg_contents)));
-    } else {
-      main_task_runner_->PostTask(FROM_HERE, failure_callback_);
-      // Because the read failed, we know we're going to quit. Don't bother
-      // trying to read again.
-      return;
-    }
-  }
-}
-
-ChannelNacl::ChannelNacl(const IPC::ChannelHandle& channel_handle,
-                         Mode mode,
-                         Listener* listener)
-    : ChannelReader(listener),
-      mode_(mode),
-      waiting_connect_(true),
-      pipe_(-1),
-      weak_ptr_factory_(this) {
-  if (!CreatePipe(channel_handle)) {
-    // The pipe may have been closed already.
-    const char *modestr = (mode_ & MODE_SERVER_FLAG) ? "server" : "client";
-    LOG(WARNING) << "Unable to create pipe in " << modestr << " mode";
-  }
-}
-
-ChannelNacl::~ChannelNacl() {
-  CleanUp();
-  Close();
-}
-
-bool ChannelNacl::Connect() {
-  WillConnect();
-
-  if (pipe_ == -1) {
-    DLOG(WARNING) << "Channel creation failed";
-    return false;
-  }
-
-  // Note that Connect is called on the "Channel" thread (i.e., the same thread
-  // where Channel::Send will be called, and the same thread that should receive
-  // messages). The constructor might be invoked on another thread (see
-  // ChannelProxy for an example of that). Therefore, we must wait until Connect
-  // is called to decide which SingleThreadTaskRunner to pass to
-  // ReaderThreadRunner.
-  reader_thread_runner_ = std::make_unique<ReaderThreadRunner>(
-      pipe_,
-      base::BindRepeating(&ChannelNacl::DidRecvMsg,
-                          weak_ptr_factory_.GetWeakPtr()),
-      base::BindRepeating(&ChannelNacl::ReadDidFail,
-                          weak_ptr_factory_.GetWeakPtr()),
-      base::SingleThreadTaskRunner::GetCurrentDefault());
-  reader_thread_ = std::make_unique<base::DelegateSimpleThread>(
-      reader_thread_runner_.get(), "ipc_channel_nacl reader thread");
-  reader_thread_->Start();
-  waiting_connect_ = false;
-  // If there were any messages queued before connection, send them.
-  ProcessOutgoingMessages();
-  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-      FROM_HERE, base::BindOnce(&ChannelNacl::CallOnChannelConnected,
-                                weak_ptr_factory_.GetWeakPtr()));
-
-  return true;
-}
-
-void ChannelNacl::Close() {
-  // For now, we assume that at shutdown, the reader thread will be woken with
-  // a failure (see NaClIPCAdapter::BlockingRead and CloseChannel). Or... we
-  // might simply be killed with no chance to clean up anyway :-).
-  // If untrusted code tries to close the channel prior to shutdown, it's likely
-  // to hang.
-  // TODO(dmichael): Can we do anything smarter here to make sure the reader
-  //                 thread wakes up and quits?
-  reader_thread_->Join();
-  close(pipe_);
-  pipe_ = -1;
-  reader_thread_runner_.reset();
-  reader_thread_.reset();
-  read_queue_.clear();
-  output_queue_.clear();
-}
-
-bool ChannelNacl::Send(Message* message) {
-  DCHECK(!message->HasAttachments());
-  DVLOG(2) << "sending message @" << message << " on channel @" << this
-           << " with type " << message->type();
-  std::unique_ptr<Message> message_ptr(message);
-
-#if BUILDFLAG(IPC_MESSAGE_LOG_ENABLED)
-  Logging::GetInstance()->OnSendMessage(message_ptr.get());
-#endif  // BUILDFLAG(IPC_MESSAGE_LOG_ENABLED)
-
-  TRACE_EVENT_WITH_FLOW0("toplevel.flow", "ChannelNacl::Send",
-                         message->header()->flags, TRACE_EVENT_FLAG_FLOW_OUT);
-  output_queue_.push_back(std::move(message_ptr));
-  if (!waiting_connect_)
-    return ProcessOutgoingMessages();
-
-  return true;
-}
-
-void ChannelNacl::DidRecvMsg(std::unique_ptr<MessageContents> contents) {
-  // Close sets the pipe to -1. It's possible we'll get a buffer sent to us from
-  // the reader thread after Close is called. If so, we ignore it.
-  if (pipe_ == -1)
-    return;
-
-  auto data = std::make_unique<std::vector<char>>();
-  data->swap(contents->data);
-  read_queue_.push_back(std::move(data));
-
-  input_attachments_.reserve(contents->fds.size());
-  for (int fd : contents->fds) {
-    input_attachments_.push_back(
-        new internal::PlatformFileAttachment(base::ScopedFD(fd)));
-  }
-  contents->fds.clear();
-
-  // In POSIX, we would be told when there are bytes to read by implementing
-  // OnFileCanReadWithoutBlocking in MessagePumpForIO::FdWatcher. In NaCl, we
-  // instead know at this point because the reader thread posted some data to
-  // us.
-  ProcessIncomingMessages();
-}
-
-void ChannelNacl::ReadDidFail() {
-  Close();
-}
-
-bool ChannelNacl::CreatePipe(
-    const IPC::ChannelHandle& channel_handle) {
-  DCHECK(pipe_ == -1);
-
-  // There's one possible case in NaCl:
-  // 1) It's a channel wrapping a pipe that is given to us.
-  // We don't support these:
-  // 2) It's for a named channel.
-  // 3) It's for a client that we implement ourself.
-  // 4) It's the initial IPC channel.
-
-  if (channel_handle.socket.fd == -1) {
-    NOTIMPLEMENTED();
-    return false;
-  }
-  pipe_ = channel_handle.socket.fd;
-  return true;
-}
-
-bool ChannelNacl::ProcessOutgoingMessages() {
-  DCHECK(!waiting_connect_);  // Why are we trying to send messages if there's
-                              // no connection?
-  if (output_queue_.empty())
-    return true;
-
-  if (pipe_ == -1)
-    return false;
-
-  // Write out all the messages. The trusted implementation is guaranteed to not
-  // block. See NaClIPCAdapter::Send for the implementation of imc_sendmsg.
-  while (!output_queue_.empty()) {
-    std::unique_ptr<Message> msg = std::move(output_queue_.front());
-    output_queue_.pop_front();
-
-    const size_t num_fds = msg->attachment_set()->size();
-    DCHECK(num_fds <= MessageAttachmentSet::kMaxDescriptorsPerMessage);
-    std::vector<int> fds;
-    fds.reserve(num_fds);
-    for (size_t i = 0; i < num_fds; i++) {
-      scoped_refptr<MessageAttachment> attachment =
-          msg->attachment_set()->GetAttachmentAt(i);
-      DCHECK_EQ(MessageAttachment::Type::PLATFORM_FILE, attachment->GetType());
-      fds.push_back(static_cast<internal::PlatformFileAttachment&>(*attachment)
-                        .TakePlatformFile());
-    }
-
-    NaClAbiNaClImcMsgIoVec iov = {const_cast<uint8_t*>(msg->data()),
-                                  msg->size()};
-    NaClAbiNaClImcMsgHdr msgh = {&iov, 1, fds.data(), num_fds};
-    ssize_t bytes_written = imc_sendmsg(pipe_, &msgh, 0);
-
-    DCHECK(bytes_written);  // The trusted side shouldn't return 0.
-    if (bytes_written < 0) {
-      // The trusted side should only ever give us an error of EPIPE. We
-      // should never be interrupted, nor should we get EAGAIN.
-      DCHECK(errno == EPIPE);
-      Close();
-      PLOG(ERROR) << "pipe_ error on "
-                  << pipe_
-                  << " Currently writing message of size: "
-                  << msg->size();
-      return false;
-    } else {
-      msg->attachment_set()->CommitAllDescriptors();
-    }
-
-    // Message sent OK!
-    DVLOG(2) << "sent message @" << msg.get() << " with type " << msg->type()
-             << " on fd " << pipe_;
-  }
-  return true;
-}
-
-void ChannelNacl::CallOnChannelConnected() {
-  listener()->OnChannelConnected(-1);
-}
-
-ChannelNacl::ReadState ChannelNacl::ReadData(
-    char* buffer,
-    int buffer_len,
-    int* bytes_read) {
-  *bytes_read = 0;
-  if (pipe_ == -1)
-    return READ_FAILED;
-  if (read_queue_.empty())
-    return READ_PENDING;
-  while (!read_queue_.empty() && *bytes_read < buffer_len) {
-    std::vector<char>* vec = read_queue_.front().get();
-    size_t bytes_to_read = buffer_len - *bytes_read;
-    if (vec->size() <= bytes_to_read) {
-      // We can read and discard the entire vector.
-      std::ranges::copy(*vec, buffer + *bytes_read);
-      *bytes_read += vec->size();
-      read_queue_.pop_front();
-    } else {
-      // Read all the bytes we can and discard them from the front of the
-      // vector. (This can be slowish, since erase has to move the back of the
-      // vector to the front, but it's hopefully a temporary hack and it keeps
-      // the code simple).
-      std::copy(vec->begin(), vec->begin() + bytes_to_read,
-                buffer + *bytes_read);
-      vec->erase(vec->begin(), vec->begin() + bytes_to_read);
-      *bytes_read += bytes_to_read;
-    }
-  }
-  return READ_SUCCEEDED;
-}
-
-bool ChannelNacl::ShouldDispatchInputMessage(Message* msg) {
-  return true;
-}
-
-bool ChannelNacl::GetAttachments(Message* msg) {
-  uint16_t header_fds = msg->header()->num_fds;
-  CHECK(header_fds == input_attachments_.size());
-  if (header_fds == 0)
-    return true;  // Nothing to do.
-
-  for (auto& attachment : input_attachments_) {
-    msg->attachment_set()->AddAttachment(std::move(attachment));
-  }
-  input_attachments_.clear();
-  return true;
-}
-
-bool ChannelNacl::DidEmptyInputBuffers() {
-  // When the input data buffer is empty, the attachments should be too.
-  return input_attachments_.empty();
-}
-
-void ChannelNacl::HandleInternalMessage(const Message& msg) {
-  // The trusted side IPC::Channel should handle the "hello" handshake; we
-  // should not receive the "Hello" message.
-  NOTREACHED();
-}
-
-// Channel's methods
-
-// static
-std::unique_ptr<Channel> Channel::Create(
-    const IPC::ChannelHandle& channel_handle,
-    Mode mode,
-    Listener* listener) {
-  return std::make_unique<ChannelNacl>(channel_handle, mode, listener);
-}
-
-}  // namespace IPC
diff --git a/ipc/ipc_channel_nacl.h b/ipc/ipc_channel_nacl.h
deleted file mode 100644
index 3ce48b3..0000000
--- a/ipc/ipc_channel_nacl.h
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IPC_IPC_CHANNEL_NACL_H_
-#define IPC_IPC_CHANNEL_NACL_H_
-
-#include <memory>
-#include <string>
-
-#include "base/containers/circular_deque.h"
-#include "base/memory/weak_ptr.h"
-#include "base/process/process.h"
-#include "base/threading/simple_thread.h"
-#include "ipc/ipc_channel.h"
-#include "ipc/ipc_channel_reader.h"
-
-namespace IPC {
-
-class MessageAttachment;
-
-// Contains the results from one call to imc_recvmsg (data and file
-// descriptors).
-struct MessageContents;
-
-// Similar to the ChannelPosix but for Native Client code.
-// This is somewhat different because sendmsg/recvmsg here do not follow POSIX
-// semantics. Instead, they are implemented by a custom embedding of
-// NaClDescCustom. See NaClIPCAdapter for the trusted-side implementation.
-//
-// We don't need to worry about complicated set up and READWRITE mode for
-// sharing handles. We also currently do not support passing file descriptors or
-// named pipes, and we use background threads to emulate signaling when we can
-// read or write without blocking.
-class ChannelNacl : public Channel,
-                    public internal::ChannelReader {
- public:
-  ChannelNacl() = delete;
-
-  // Mirror methods of Channel, see ipc_channel.h for description.
-  ChannelNacl(const IPC::ChannelHandle& channel_handle,
-              Mode mode,
-              Listener* listener);
-
-  ChannelNacl(const ChannelNacl&) = delete;
-  ChannelNacl& operator=(const ChannelNacl&) = delete;
-
-  ~ChannelNacl() override;
-
-  // Channel implementation.
-  bool Connect() override;
-  void Close() override;
-  bool Send(Message* message) override;
-
-  // Posted to the main thread by ReaderThreadRunner.
-  void DidRecvMsg(std::unique_ptr<MessageContents> contents);
-  void ReadDidFail();
-
- private:
-  class ReaderThreadRunner;
-
-  bool CreatePipe(const IPC::ChannelHandle& channel_handle);
-  bool ProcessOutgoingMessages();
-  void CallOnChannelConnected();
-
-  // ChannelReader implementation.
-  ReadState ReadData(char* buffer,
-                     int buffer_len,
-                     int* bytes_read) override;
-  bool ShouldDispatchInputMessage(Message* msg) override;
-  bool GetAttachments(Message* msg) override;
-  bool DidEmptyInputBuffers() override;
-  void HandleInternalMessage(const Message& msg) override;
-
-  Mode mode_;
-  bool waiting_connect_;
-
-  // The pipe used for communication.
-  int pipe_;
-
-  // We use a thread for reading, so that we can simply block on reading and
-  // post the received data back to the main thread to be properly interleaved
-  // with other tasks in the MessagePump.
-  //
-  // imc_recvmsg supports non-blocking reads, but there's no easy way to be
-  // informed when a write or read can be done without blocking (this is handled
-  // by libevent in Posix).
-  std::unique_ptr<ReaderThreadRunner> reader_thread_runner_;
-  std::unique_ptr<base::DelegateSimpleThread> reader_thread_;
-
-  // IPC::ChannelReader expects to be able to call ReadData on us to
-  // synchronously read data waiting in the pipe's buffer without blocking.
-  // Since we can't do that (see 1 and 2 above), the reader thread does blocking
-  // reads and posts the data over to the main thread in MessageContents. Each
-  // MessageContents object is the result of one call to "imc_recvmsg".
-  // DidRecvMsg breaks the MessageContents out in to the data and the file
-  // descriptors, and puts them on these two queues.
-  // TODO(dmichael): There's probably a more efficient way to emulate this with
-  //                 a circular buffer or something, so we don't have to do so
-  //                 many heap allocations. But it maybe isn't worth
-  //                 the trouble given that we probably want to implement 1 and
-  //                 2 above in NaCl eventually.
-  // When ReadData is called, it pulls the bytes out of this queue in order.
-  base::circular_deque<std::unique_ptr<std::vector<char>>> read_queue_;
-  // Queue of file descriptor attachments extracted from imc_recvmsg messages.
-  std::vector<scoped_refptr<MessageAttachment>> input_attachments_;
-
-  // This queue is used when a message is sent prior to Connect having been
-  // called. Normally after we're connected, the queue is empty.
-  base::circular_deque<std::unique_ptr<Message>> output_queue_;
-
-  base::WeakPtrFactory<ChannelNacl> weak_ptr_factory_;
-};
-
-}  // namespace IPC
-
-#endif  // IPC_IPC_CHANNEL_NACL_H_
diff --git a/media/base/android/BUILD.gn b/media/base/android/BUILD.gn
index 3eb8ca5..830dcac 100644
--- a/media/base/android/BUILD.gn
+++ b/media/base/android/BUILD.gn
@@ -142,12 +142,12 @@
 
   java_cpp_strings("java_switches") {
     sources = [ "//media/base/media_switches.cc" ]
-    template = "//media/base/android/java_templates/MediaSwitches.java.tmpl"
+    template = "java_templates/MediaSwitches.java.tmpl"
   }
 
   java_cpp_features("java_features") {
     sources = [ "//media/base/media_switches.cc" ]
-    template = "//media/base/android/java_templates/MediaFeatures.java.tmpl"
+    class_name = "org.chromium.media.MediaFeatures"
   }
 
   android_resources("media_java_resources") {
diff --git a/media/base/android/java_templates/MediaFeatures.java.tmpl b/media/base/android/java_templates/MediaFeatures.java.tmpl
deleted file mode 100644
index 331f32e4..0000000
--- a/media/base/android/java_templates/MediaFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.media;
-
-/**
- * Contains command line switches that are specific to the media layer.
- */
-public abstract class MediaFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Prevents instantiation.
-    private MediaFeatures() {{}}
-}}
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index c6c9d5aa..c0eda43 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -313,6 +313,11 @@
 BASE_FEATURE(kPictureInPictureOcclusionTracking,
              "PictureInPictureOcclusionTracking",
              base::FEATURE_ENABLED_BY_DEFAULT);
+
+// Enables the animation of the Picture-in-Picture window creation.
+BASE_FEATURE(kPictureInPictureShowWindowAnimation,
+             "PictureInPictureShowWindowAnimation",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 #endif  // !BUILDFLAG(IS_ANDROID)
 
 // Enables user control over muting tab audio from the tab strip.
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index 1bcf2d6f..fce48e7d 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -324,6 +324,7 @@
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kPauseBackgroundTimer);
 #if !BUILDFLAG(IS_ANDROID)
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kPictureInPictureOcclusionTracking);
+MEDIA_EXPORT BASE_DECLARE_FEATURE(kPictureInPictureShowWindowAnimation);
 #endif  // !BUILDFLAG(IS_ANDROID)
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kPlatformAudioEncoder);
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kEnableRtcpReporting);
diff --git a/media/base/video_frame_converter.cc b/media/base/video_frame_converter.cc
index f1dea1d1..5759bca5 100644
--- a/media/base/video_frame_converter.cc
+++ b/media/base/video_frame_converter.cc
@@ -34,9 +34,7 @@
     scoped_refptr<VideoFrame> tmp_frame) {
   return VideoFrame::WrapExternalData(
       override_format, tmp_frame->coded_size(), tmp_frame->visible_rect(),
-      tmp_frame->natural_size(),
-      tmp_frame->writable_data(VideoFrame::Plane::kARGB),
-      VideoFrame::AllocationSize(override_format, tmp_frame->coded_size()),
+      tmp_frame->natural_size(), tmp_frame->data_span(VideoFrame::Plane::kARGB),
       tmp_frame->timestamp());
 }
 
diff --git a/media/base/video_frame_unittest.cc b/media/base/video_frame_unittest.cc
index 6a1af98..e79e697 100644
--- a/media/base/video_frame_unittest.cc
+++ b/media/base/video_frame_unittest.cc
@@ -486,14 +486,14 @@
 
 // Create a frame that wraps unowned memory.
 TEST(VideoFrame, WrapExternalData) {
-  uint8_t memory[2 * 256 * 256];
+  std::array<uint8_t, 2 * 256 * 256> memory{};
   gfx::Size coded_size(256, 256);
   gfx::Rect visible_rect(coded_size);
-  CreateTestY16Frame(coded_size, visible_rect, memory);
+  CreateTestY16Frame(coded_size, visible_rect, memory.data());
   auto timestamp = base::Milliseconds(1);
-  auto frame = VideoFrame::WrapExternalData(PIXEL_FORMAT_Y16, coded_size,
-                                            visible_rect, visible_rect.size(),
-                                            memory, sizeof(memory), timestamp);
+  auto frame =
+      VideoFrame::WrapExternalData(PIXEL_FORMAT_Y16, coded_size, visible_rect,
+                                   visible_rect.size(), memory, timestamp);
 
   EXPECT_EQ(frame->coded_size(), coded_size);
   EXPECT_EQ(frame->visible_rect(), visible_rect);
@@ -513,8 +513,7 @@
   auto timestamp = base::Milliseconds(1);
   auto frame = VideoFrame::WrapExternalData(
       PIXEL_FORMAT_Y16, coded_size, visible_rect, visible_rect.size(),
-      mapped_region.mapping.GetMemoryAsSpan<uint8_t>().data(), kDataSize,
-      timestamp);
+      mapped_region.mapping.GetMemoryAsSpan<uint8_t>(), timestamp);
   EXPECT_EQ(frame->storage_type(), VideoFrame::STORAGE_UNOWNED_MEMORY);
 
   frame->BackWithSharedMemory(&mapped_region.region);
@@ -967,9 +966,9 @@
     pixels.resize(coded_size.GetArea() * 4);
 
     auto timestamp = base::Milliseconds(0);
-    auto frame = VideoFrame::WrapExternalData(
-        format, coded_size, visible_rect, visible_rect.size(), pixels.data(),
-        pixels.size(), timestamp);
+    auto frame =
+        VideoFrame::WrapExternalData(format, coded_size, visible_rect,
+                                     visible_rect.size(), pixels, timestamp);
 
     int plane_offset = 0;
     for (size_t plane = 0; plane < VideoFrame::NumPlanes(format); ++plane) {
diff --git a/media/cast/encoding/external_video_encoder.cc b/media/cast/encoding/external_video_encoder.cc
index b51aa567..9d37ce56 100644
--- a/media/cast/encoding/external_video_encoder.cc
+++ b/media/cast/encoding/external_video_encoder.cc
@@ -285,8 +285,8 @@
           video_frame->format(), frame_coded_size_,
           gfx::Rect(video_frame->visible_rect().size()),
           video_frame->visible_rect().size(),
-          static_cast<uint8_t*>(mapped_region.mapping.memory()),
-          mapped_region.mapping.size(), video_frame->timestamp());
+          mapped_region.mapping.GetMemoryAsSpan<uint8_t>(),
+          video_frame->timestamp());
       if (!frame || !media::I420CopyWithPadding(*video_frame, frame.get())) {
         LOG(DFATAL) << "Error: ExternalVideoEncoder: copy failed.";
         AbortLatestEncodeAttemptDueToErrors();
diff --git a/media/gpu/windows/mf_video_processor_accelerator_unittest.cc b/media/gpu/windows/mf_video_processor_accelerator_unittest.cc
index a4a6be4..58ccf02 100644
--- a/media/gpu/windows/mf_video_processor_accelerator_unittest.cc
+++ b/media/gpu/windows/mf_video_processor_accelerator_unittest.cc
@@ -524,8 +524,7 @@
   auto timestamp = base::Milliseconds(0);
   auto frame = VideoFrame::WrapExternalData(
       VideoPixelFormat::PIXEL_FORMAT_XRGB, {kWidth, kHeight},
-      gfx::Rect(0, 0, kWidth, kHeight), {kWidth, kHeight}, image.data(),
-      image.size(), timestamp);
+      gfx::Rect(0, 0, kWidth, kHeight), {kWidth, kHeight}, image, timestamp);
 
   Microsoft::WRL::ComPtr<IMFSample> sample;
   ASSERT_HRESULT_SUCCEEDED(video_processor->Convert(frame, &sample));
diff --git a/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc b/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc
index beb226d2..fc05fd0 100644
--- a/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc
+++ b/media/mojo/clients/mojo_video_encode_accelerator_unittest.cc
@@ -286,8 +286,8 @@
     ASSERT_TRUE(shmem.IsValid());
     const scoped_refptr<VideoFrame> video_frame = VideoFrame::WrapExternalData(
         PIXEL_FORMAT_I420, kInputVisibleSize, gfx::Rect(kInputVisibleSize),
-        kInputVisibleSize, static_cast<uint8_t*>(shmem.mapping.memory()),
-        shmem.mapping.size(), base::TimeDelta());
+        kInputVisibleSize, shmem.mapping.GetMemoryAsSpan<uint8_t>(),
+        base::TimeDelta());
     video_frame->BackWithSharedMemory(&shmem.region);
     const bool is_keyframe = true;
 
diff --git a/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc b/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc
index 2e89fd9b..ae74ed0 100644
--- a/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc
+++ b/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc
@@ -290,8 +290,8 @@
     ASSERT_TRUE(shmem.IsValid());
     const scoped_refptr<VideoFrame> video_frame = VideoFrame::WrapExternalData(
         PIXEL_FORMAT_I420, kInputVisibleSize, gfx::Rect(kInputVisibleSize),
-        kInputVisibleSize, static_cast<uint8_t*>(shmem.mapping.memory()),
-        shmem.mapping.size(), base::TimeDelta());
+        kInputVisibleSize, shmem.mapping.GetMemoryAsSpan<uint8_t>(),
+        base::TimeDelta());
     video_frame->BackWithSharedMemory(&shmem.region);
     const bool is_keyframe = true;
 
@@ -335,8 +335,7 @@
     const scoped_refptr<VideoFrame> video_frame = VideoFrame::WrapExternalData(
         PIXEL_FORMAT_I420, kInvalidInputVisibleSize,
         gfx::Rect(kInvalidInputVisibleSize), kInvalidInputVisibleSize,
-        static_cast<uint8_t*>(shmem.mapping.memory()), shmem.mapping.size(),
-        base::TimeDelta());
+        shmem.mapping.GetMemoryAsSpan<uint8_t>(), base::TimeDelta());
     video_frame->BackWithSharedMemory(&shmem.region);
     const bool is_keyframe = true;
 
diff --git a/media/renderers/paint_canvas_video_renderer_unittest.cc b/media/renderers/paint_canvas_video_renderer_unittest.cc
index f0f7029..46e11f7 100644
--- a/media/renderers/paint_canvas_video_renderer_unittest.cc
+++ b/media/renderers/paint_canvas_video_renderer_unittest.cc
@@ -80,7 +80,7 @@
 
   return media::VideoFrame::WrapExternalData(
       media::PIXEL_FORMAT_Y16, coded_size, visible_rect, visible_rect.size(),
-      static_cast<uint8_t*>(external_memory), byte_size, timestamp);
+      base::span(static_cast<uint8_t*>(external_memory), byte_size), timestamp);
 }
 
 // Readback the contents of a RGBA texture into an array of RGBA values.
@@ -987,7 +987,7 @@
 
   auto video_frame = media::VideoFrame::WrapExternalData(
       media::PIXEL_FORMAT_Y16, coded_size, gfx::Rect(visible_size),
-      visible_size, &memory[0], fWidth * fHeight * 2, base::Milliseconds(4));
+      visible_size, memory, base::Milliseconds(4));
 
   cc::PaintFlags flags;
   PaintCanvasVideoRenderer::PaintParams params;
diff --git a/media/renderers/video_resource_updater_unittest.cc b/media/renderers/video_resource_updater_unittest.cc
index 0ec5f8b..4d5a3e7 100644
--- a/media/renderers/video_resource_updater_unittest.cc
+++ b/media/renderers/video_resource_updater_unittest.cc
@@ -96,9 +96,9 @@
   scoped_refptr<VideoFrame> CreateTestYUVVideoFrame(
       const gfx::Size& size = gfx::Size(10, 10)) {
     constexpr int kMaxDimension = 100;
-    static uint8_t y_data[kMaxDimension * kMaxDimension] = {};
-    static uint8_t u_data[kMaxDimension * kMaxDimension / 2] = {};
-    static uint8_t v_data[kMaxDimension * kMaxDimension / 2] = {};
+    static std::array<uint8_t, kMaxDimension * kMaxDimension> y_data{};
+    static std::array<uint8_t, kMaxDimension * kMaxDimension / 2> u_data{};
+    static std::array<uint8_t, kMaxDimension * kMaxDimension / 2> v_data{};
 
     CHECK_LE(size.width() * size.height(), kMaxDimension * kMaxDimension);
 
@@ -118,43 +118,17 @@
     return video_frame;
   }
 
-  scoped_refptr<VideoFrame> CreateWonkyTestYUVVideoFrame() {
-    const int kDimension = 10;
-    const int kYWidth = kDimension + 5;
-    const int kUWidth = (kYWidth + 1) / 2 + 200;
-    const int kVWidth = (kYWidth + 1) / 2 + 1;
-    static uint8_t y_data[kYWidth * kDimension] = {};
-    static uint8_t u_data[kUWidth * kDimension] = {};
-    static uint8_t v_data[kVWidth * kDimension] = {};
-
-    scoped_refptr<VideoFrame> video_frame = VideoFrame::WrapExternalYuvData(
-        PIXEL_FORMAT_I422,                        // format
-        gfx::Size(kYWidth, kDimension),           // coded_size
-        gfx::Rect(2, 0, kDimension, kDimension),  // visible_rect
-        gfx::Size(kDimension, kDimension),        // natural_size
-        -kYWidth,                                 // y_stride (negative)
-        kUWidth,                                  // u_stride
-        kVWidth,                                  // v_stride
-        y_data + kYWidth * (kDimension - 1),      // y_data
-        u_data,                                   // u_data
-        v_data,                                   // v_data
-        base::TimeDelta());                       // timestamp
-    EXPECT_TRUE(video_frame);
-    return video_frame;
-  }
-
   scoped_refptr<VideoFrame> CreateTestRGBVideoFrame(VideoPixelFormat format) {
     constexpr int kMaxDimension = 10;
     constexpr gfx::Size kSize = gfx::Size(kMaxDimension, kMaxDimension);
-    static uint32_t rgb_data[kMaxDimension * kMaxDimension] = {};
-    scoped_refptr<VideoFrame> video_frame = VideoFrame::WrapExternalData(
-        format,                                // format
-        kSize,                                 // coded_size
-        gfx::Rect(kSize),                      // visible_rect
-        kSize,                                 // natural_size
-        reinterpret_cast<uint8_t*>(rgb_data),  // data,
-        sizeof(rgb_data),                      // data_size
-        base::TimeDelta());                    // timestamp
+    static std::array<uint8_t, 4 * kMaxDimension * kMaxDimension> rgb_data{};
+    scoped_refptr<VideoFrame> video_frame =
+        VideoFrame::WrapExternalData(format,              // format
+                                     kSize,               // coded_size
+                                     gfx::Rect(kSize),    // visible_rect
+                                     kSize,               // natural_size
+                                     rgb_data,            // data,
+                                     base::TimeDelta());  // timestamp
     EXPECT_TRUE(video_frame);
     return video_frame;
   }
@@ -164,23 +138,23 @@
     constexpr int kMaxDimension = 5;
     constexpr gfx::Size kSize = gfx::Size(kMaxDimension, kMaxDimension);
     constexpr gfx::Rect kVisibleRect = gfx::Rect(2, 1, 3, 3);
-    constexpr uint32_t kPix = 0xFFFFFFFF;
-    static uint32_t rgb_data[kMaxDimension * kMaxDimension] = {
-        0x00, 0x00, 0x00, 0x00, 0x00,  //
-        0x00, 0x00, kPix, kPix, kPix,  //
-        0x00, 0x00, kPix, kPix, kPix,  //
-        0x00, 0x00, kPix, kPix, kPix,  //
-        0x00, 0x00, 0x00, 0x00, 0x00,  //
+#define PIX 0xFF, 0xFF, 0xFF, 0xFF
+    static std::array<uint8_t, 4 * kMaxDimension * kMaxDimension> rgb_data{
+        0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  //
+        0, 0, 0, 0, 0, 0, 0, 0, PIX, PIX, PIX,                             //
+        0, 0, 0, 0, 0, 0, 0, 0, PIX, PIX, PIX,                             //
+        0, 0, 0, 0, 0, 0, 0, 0, PIX, PIX, PIX,                             //
+        0, 0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0, 0, 0, 0, 0, 0, 0, 0, 0,  //
     };
+#undef PIX
 
-    scoped_refptr<VideoFrame> video_frame = VideoFrame::WrapExternalData(
-        format,                                // format
-        kSize,                                 // coded_size
-        kVisibleRect,                          // visible_rect
-        kVisibleRect.size(),                   // natural_size
-        reinterpret_cast<uint8_t*>(rgb_data),  // data,
-        sizeof(rgb_data),                      // data_size
-        base::TimeDelta());                    // timestamp
+    scoped_refptr<VideoFrame> video_frame =
+        VideoFrame::WrapExternalData(format,               // format
+                                     kSize,                // coded_size
+                                     kVisibleRect,         // visible_rect
+                                     kVisibleRect.size(),  // natural_size
+                                     rgb_data,             // data,
+                                     base::TimeDelta());   // timestamp
     EXPECT_TRUE(video_frame);
     return video_frame;
   }
@@ -189,23 +163,21 @@
     constexpr int kMaxDimension = 5;
     constexpr gfx::Size kSize = gfx::Size(kMaxDimension, kMaxDimension);
     constexpr gfx::Rect kVisibleRect = gfx::Rect(2, 1, 3, 3);
-    constexpr uint16_t kPix = 0xFFFF;
-    static uint16_t y16_data[kMaxDimension * kMaxDimension] = {
-        0x00, 0x00, 0x00, 0x00, 0x00,  //
-        0x00, 0x00, kPix, kPix, kPix,  //
-        0x00, 0x00, kPix, kPix, kPix,  //
-        0x00, 0x00, kPix, kPix, kPix,  //
-        0x00, 0x00, 0x00, 0x00, 0x00,  //
+    static std::array<uint8_t, 2 * kMaxDimension * kMaxDimension> y16_data = {
+        0, 0, 0, 0, 0,    0,    0,    0,    0,    0,
+        0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+        0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+        0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+        0, 0, 0, 0, 0,    0,    0,    0,    0,    0,
     };
 
-    scoped_refptr<VideoFrame> video_frame = VideoFrame::WrapExternalData(
-        PIXEL_FORMAT_Y16,
-        kSize,                                 // coded_size
-        kVisibleRect,                          // visible_rect
-        kVisibleRect.size(),                   // natural_size
-        reinterpret_cast<uint8_t*>(y16_data),  // data,
-        sizeof(y16_data),                      // data_size
-        base::TimeDelta());                    // timestamp
+    scoped_refptr<VideoFrame> video_frame =
+        VideoFrame::WrapExternalData(PIXEL_FORMAT_Y16,
+                                     kSize,                // coded_size
+                                     kVisibleRect,         // visible_rect
+                                     kVisibleRect.size(),  // natural_size
+                                     y16_data,             // data,
+                                     base::TimeDelta());   // timestamp
     EXPECT_TRUE(video_frame);
     return video_frame;
   }
diff --git a/media/video/video_encode_accelerator_adapter.cc b/media/video/video_encode_accelerator_adapter.cc
index 7802b67..85dae3b4 100644
--- a/media/video/video_encode_accelerator_adapter.cc
+++ b/media/video/video_encode_accelerator_adapter.cc
@@ -1056,8 +1056,7 @@
                               : src_frame;
   auto shared_frame = VideoFrame::WrapExternalData(
       PIXEL_FORMAT_I420, dest_coded_size, dest_visible_rect,
-      dest_visible_rect.size(), static_cast<const uint8_t*>(mapping->memory()),
-      mapping->size(), src_frame->timestamp());
+      dest_visible_rect.size(), *mapping, src_frame->timestamp());
 
   if (!shared_frame || !mapped_src_frame)
     return EncoderStatus(EncoderStatus::Codes::kSystemAPICallError);
diff --git a/mojo/public/cpp/base/values_unittest.cc b/mojo/public/cpp/base/values_unittest.cc
index eb84055b..936bd95 100644
--- a/mojo/public/cpp/base/values_unittest.cc
+++ b/mojo/public/cpp/base/values_unittest.cc
@@ -5,6 +5,7 @@
 #include <string>
 #include <utility>
 
+#include "base/functional/callback_helpers.h"
 #include "base/test/gtest_util.h"
 #include "base/values.h"
 #include "mojo/public/cpp/base/values_mojom_traits.h"
diff --git a/mojo/public/cpp/bindings/connection_group.h b/mojo/public/cpp/bindings/connection_group.h
index 7040ad7..8b27013 100644
--- a/mojo/public/cpp/bindings/connection_group.h
+++ b/mojo/public/cpp/bindings/connection_group.h
@@ -10,7 +10,10 @@
 #include "base/component_export.h"
 #include "base/functional/callback.h"
 #include "base/memory/ref_counted.h"
-#include "base/task/sequenced_task_runner.h"
+
+namespace base {
+class SequencedTaskRunner;
+}
 
 namespace mojo {
 
diff --git a/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm.cc.tmpl b/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm.cc.tmpl
index 45ec4fd..f45e538e 100644
--- a/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm.cc.tmpl
+++ b/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm.cc.tmpl
@@ -317,7 +317,7 @@
 {%-         set response_type = result_param.kind|get_qualified_name_for_kind %}
 static {{param_type}} {{interface.name}}_{{method.name}}Transform(base::expected<
     {{method.result_response.success_kind|cpp_wrapper_type(add_same_module_namespaces=true)}},
-    {{method.result_response.failure_kind|cpp_wrapper_type}}> in) {
+    {{method.result_response.failure_kind|cpp_wrapper_type(add_same_module_namespaces=true)}}> in) {
   return in.has_value() ? {{response_type}}::NewSuccess(std::move(in.value())) :
                           {{response_type}}::NewFailure(std::move(in.error()));
 }
diff --git a/net/base/BUILD.gn b/net/base/BUILD.gn
index 315f921..2872a17 100644
--- a/net/base/BUILD.gn
+++ b/net/base/BUILD.gn
@@ -9,7 +9,7 @@
     # External code should depend on ":features_java" instead.
     visibility = [ ":*" ]
     sources = [ "features.cc" ]
-    template = "android/java_templates/NetFeatures.java.tmpl"
+    class_name = "org.chromium.net.NetFeatures"
   }
 
   android_library("features_java") {
diff --git a/net/base/android/java_templates/NetFeatures.java.tmpl b/net/base/android/java_templates/NetFeatures.java.tmpl
deleted file mode 100644
index fe11c0b..0000000
--- a/net/base/android/java_templates/NetFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.net;
-
-/**
- * Constants for the names of Net Features.
- */
-public final class NetFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Do not instantiate this class.
-    private NetFeatures() {{}}
-}}
diff --git a/net/base/features.cc b/net/base/features.cc
index ce8bab0..fe35c63 100644
--- a/net/base/features.cc
+++ b/net/base/features.cc
@@ -610,6 +610,10 @@
              "EnableWebTransportDraft07",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kWebTransportFineGrainedThrottling,
+             "WebTransportFineGrainedThrottling",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // When enabled, partitioned storage will be allowed even if third-party cookies
 // are disabled by default. Partitioned storage will not be allowed if
 // third-party cookies are disabled due to a specific rule.
diff --git a/net/base/features.h b/net/base/features.h
index be91baf..26e2073 100644
--- a/net/base/features.h
+++ b/net/base/features.h
@@ -620,6 +620,9 @@
 // Enables draft-07 version of WebTransport over HTTP/3.
 NET_EXPORT BASE_DECLARE_FEATURE(kEnableWebTransportDraft07);
 
+// Enables a smarter throttling strategy based in the server's IP.
+NET_EXPORT BASE_DECLARE_FEATURE(kWebTransportFineGrainedThrottling);
+
 NET_EXPORT BASE_DECLARE_FEATURE(kThirdPartyPartitionedStorageAllowedByDefault);
 
 // Enables a more efficient implementation of SpdyHeadersToHttpResponse().
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index 5279a08..d8b5091 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -1076,7 +1076,6 @@
     { "name": "reserve-online.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "riesenmagnete.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rosenkeller.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "siammedia.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "simplystudio.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sprueche-zum-valentinstag.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sprueche-zur-geburt.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -1412,7 +1411,6 @@
     { "name": "ki-on.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kingmanhall.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kpebetka.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "myvirtualserver.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "neftaly.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nu3.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nu3.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -1606,7 +1604,6 @@
     { "name": "benjamin.pe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cryptobin.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "csuw.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "dreadbyte.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dylanscott.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "e-kontakti.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ecfs.link", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -1664,7 +1661,6 @@
     { "name": "getfittedstore.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hatoko.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hda.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "helpadmin.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "iniiter.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ionas-law.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "keepa.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -2006,7 +2002,6 @@
     { "name": "ecake.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ego4u.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ego4u.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "fish-hook.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fniephaus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "forgix.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fuzzing-project.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -3703,7 +3698,6 @@
     { "name": "caesreon.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "calaborlawnews.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "carsforbackpackers.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "cecipu.gob.cl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chcemvediet.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "christiaanconover.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "christianbro.gq", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -3719,7 +3713,6 @@
     { "name": "compucorner.com.mx", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cormilu.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cortexitrecruitment.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "cqchome.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "crow.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cryptopartyutah.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cryptoseb.pw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -4769,7 +4762,6 @@
     { "name": "acabadosboston.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "actserv.co.ke", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "adblockextreme.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "adboos.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "adopteunsiteflash.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "aether.pw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "afuh.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5294,7 +5286,6 @@
     { "name": "moov.is", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "morbatex.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "morenci.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "mornings.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "morpork.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "morteruelo.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mozoa.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5662,7 +5653,6 @@
     { "name": "allthethings.co.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "alphalabs.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "altfire.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "amri.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "anagra.ms", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "andisadhdspot.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "andrewmichaud.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5896,7 +5886,6 @@
     { "name": "kamitech.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kana.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kapseli.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "kawaiiku.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kawaiiku.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "keops-spine.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "keops-spine.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6685,7 +6674,6 @@
     { "name": "maxserver.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mbilker.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mcdonalds.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "mealgoo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mhict.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "michel-wein.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "miku.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7590,7 +7578,6 @@
     { "name": "sparkforautism.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "stat.ink", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sunsetwx.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "stutelage.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sv-turm-hohenlimburg.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "szentistvanpt.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "takk.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7996,7 +7983,6 @@
     { "name": "foorack.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "forex.ee", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fran.cr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "francoz.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "frappant.cc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "frbracch.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fumblers.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -8771,7 +8757,6 @@
     { "name": "sinquin.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "slapen17.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sitc.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "startpage.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sm.ms", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "stammtisch.domains", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "storyland.ie", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9025,7 +9010,6 @@
     { "name": "hayai.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "guildgearscore.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "harrysmallbones.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "gpcsolutions.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "helden-spielen.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "happist.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hedweb.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9075,7 +9059,6 @@
     { "name": "kongar.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kleineanfragen.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "legalrobot.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "kydara.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jeproteste.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lasereyess.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kanaete-uranai.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9517,7 +9500,6 @@
     { "name": "hardtfrieden.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "https.jetzt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "headshotharp.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "http2.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hr98.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hidbo.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hydronium.ga", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9903,7 +9885,6 @@
     { "name": "zeronet.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "x-iweb.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--allgu-biker-o8a.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "wr.su", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yuwei.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yingatech.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "zabszk.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10161,7 +10142,6 @@
     { "name": "gittr.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "glazedmag.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "girvas.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "glueckskindter.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gensonline.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gorn.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "haiboxu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10209,7 +10189,6 @@
     { "name": "imoner.ga", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hyphen.co.za", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "impotsimple.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "ifamily.top", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hoken-wakaru.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "info-sys.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ilard.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10355,7 +10334,6 @@
     { "name": "nalepte.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "newbieboss.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "neko-nyan.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "nautsch.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nadejeproninu.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "netdex.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nidsuber.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10815,7 +10793,6 @@
     { "name": "naude.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nepovolenainternetovahazardnihra.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "newspsychology.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "ninaundandre.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "notar-glagowski.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "object.earth", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ontheten.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10958,7 +10935,6 @@
     { "name": "aandeautobody.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "aaronhorler.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "abigisp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "abolicionistas.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "abolition.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "abolitionism.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "abolitionism.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -11011,7 +10987,6 @@
     { "name": "amorim.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "analgesia.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "andrespaz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "andreundnina.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "andrewrgoss.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "androidzone.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "anedot-sandbox.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -11290,7 +11265,6 @@
     { "name": "facciadastile.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fairviewmotel-simcoe.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fantastichandymanmelbourne.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "faroes.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "faroes.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "farsil.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fdlibre.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -11352,7 +11326,6 @@
     { "name": "georgiaglassrepair.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "getnib.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gfast.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "ggdcpt.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ggs.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "giant-panda.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "giant-tortoise.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -12553,7 +12526,6 @@
     { "name": "livekort.no", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lookatmysco.re", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lesmontagne.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "lukatz.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "loanmatch.sg", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mail.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "malikussa.id", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -13377,7 +13349,6 @@
     { "name": "newmed.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "neoz.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "numwave.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "neurocny.cloud", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ojdip.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "owl.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nephelion.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -13412,7 +13383,6 @@
     { "name": "pssgcsim.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "quantum2.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "psb1.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "qitarabutrans.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "qto.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rbltracker.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "qwerty.work", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -13988,7 +13958,6 @@
     { "name": "corpulent.coffee", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "corpulentcoffee.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "crackcat.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "criena.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "crisisactual.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "daciamodellen.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "darc-mak.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -14422,7 +14391,6 @@
     { "name": "angrysnarl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "animaltesting.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "antennista.milano.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "aotearoaleaks.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "australien-tipps.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "averageinspired.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bedamedia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -16221,7 +16189,6 @@
     { "name": "powersergholdings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "praktijkdevecht.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prodware.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "promotioncentre.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proteogenix-products.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prylarprylar.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "psdsuc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -16491,7 +16458,6 @@
     { "name": "keylaserinstitute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kimis.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kirillaristov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kitabnamabayi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "klinkenberg.ws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "knitfarious.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koecollege.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -16839,7 +16805,6 @@
     { "name": "parteaga.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pbr.so", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "phenixairsoft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "phpunit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "piskenfuerwehr.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "plasticsurgeryservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "plegro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -18084,7 +18049,6 @@
     { "name": "ishet.al", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ivre.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jabbers.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jeda.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koerperkult.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kolcsey.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ladenzeile.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -19215,7 +19179,6 @@
     { "name": "nickplotnek.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ninth.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nshipster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "numerologist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "openstreetmap.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "papaya.me.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pasarella.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -19786,7 +19749,6 @@
     { "name": "gisher.video", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "glitzerstuecke.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gm-net.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gmtplus.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gnk.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goldcoastasian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goldcoastphotographycourses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -20597,7 +20559,6 @@
     { "name": "jaetech.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jamesjboyer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jamesturnerstickley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jannekekaasjager.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jemefaisdesamis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joshgilson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "katex.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -23390,7 +23351,6 @@
     { "name": "michilaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mindmax.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mmgal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "motogb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mralonas.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mrdatenschutz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mte.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -23404,7 +23364,6 @@
     { "name": "nauris.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "new-vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newfoundland-labradorflora.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "noxx.global", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "obec-krakovany.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ordbokpro.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "postandfly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -23437,7 +23396,6 @@
     { "name": "sonaraamat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "spanch.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "studio-n.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "superenduro.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "techlr.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "telsu.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "testeri.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -24565,7 +24523,6 @@
     { "name": "destyntek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diabetessucks.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitaleplus.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "digitalfoster.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dirtinmyshoes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "discordbee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diygeek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -24844,8 +24801,6 @@
     { "name": "zookids.uy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zravyobrazky.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "123birthdaygreetings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aaa-racing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aaa-racing.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "achtzehn.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "adiprospero.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agpideas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -24914,12 +24869,10 @@
     { "name": "my-webcloud.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mystaffonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nazimogluinsaat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "noxx.solutions", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "olitham.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "p-p.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pechonova.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "plumbingkingsllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "post.monster", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "predkosci.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rbs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rcmstream.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -25527,7 +25480,6 @@
     { "name": "mdrsp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mishkan-israel.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "missblisshair.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mneti.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nirhub.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nophelet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nousyukum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -29912,7 +29864,6 @@
     { "name": "veryswing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vsactivity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vsportage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "walkingandcycling.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "warthog.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weloveliving.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wemajin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -30563,7 +30514,6 @@
     { "name": "icecutethings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "illange.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inspiresurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "intrixgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ipinfo.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ispfontela.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ivetazivot.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -30697,7 +30647,6 @@
     { "name": "csci571.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daceurope.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deadpulse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dedoles.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "del-ex.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dementiacaring.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "designepublicidade.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -31022,7 +30971,6 @@
     { "name": "expatfire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "falsterhus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "falsterhus.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fanohus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fanohus.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "feriehus-danmark.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ferienhaus-danemark-hund.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -31446,7 +31394,6 @@
     { "name": "alvimedika.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amoryurgentcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "antipolygraph.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aoyamacc.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arhitekti.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artikel9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baches-piscines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -32226,7 +32173,6 @@
     { "name": "gevme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "giancarlomarino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goolnk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gooseberries.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grupoharbour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hagbergmedia.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "handwerk-digital-steinfurt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -34516,7 +34462,6 @@
     { "name": "krasnodar.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ksm.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "laharilais.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "landflair-magazin.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lasittellecosmetiques.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ligne-roset.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liquidationyt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -34671,7 +34616,6 @@
     { "name": "abilympics.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "addictedtotravel.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "advantageroofer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "advasa.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aktuelleprospekte.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alliaancebiotech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alpinedentalhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -34914,7 +34858,6 @@
     { "name": "smartrentacar.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smartsprouts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snatti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "snorkelaroundtheworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snowdrop.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soderparr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "spieka.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -39508,7 +39451,6 @@
     { "name": "meditrak.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mediums.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medovoe.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "medprozone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medrol.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medspecial.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medvedka-nasekomoe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -43998,7 +43940,6 @@
     { "name": "shawclan.id.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "slothy.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soilegustafsson.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "soloroboto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "songlifty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sophi.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soukka-seura.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -44449,8 +44390,6 @@
     { "name": "antwire.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aoicollege.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arcosdequejana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "asperatechnology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "asperatechnology.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bekabazar.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "berksestateplanning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bernhard-eicher.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -44974,7 +44913,6 @@
     { "name": "languageatplay.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "legterm.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lelux.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "localcryptos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lojasmary.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lost-illusions.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lostserial.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -45552,7 +45490,6 @@
     { "name": "farb-tabelle.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fixedpricemovers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flashcardsmobile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gabnotes.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "geblitzt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gefeuert.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gentlent.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -46590,7 +46527,6 @@
     { "name": "tophighnorldiet.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "topnlist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toumeitech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tranmao.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "transaminasas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tropikdeniz.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trxnews.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48438,7 +48374,6 @@
     { "name": "blues.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blueshouse.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boanastudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bocahkampus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boleyn.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bonneribyen.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boomsocial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -49271,7 +49206,6 @@
     { "name": "theoriginalassistant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theoriginalworkshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thepokerbank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "theresumeapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ubezpieczeniazyciowe.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ubezpieczenie.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ubezpieczeniemieszkania.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -50455,7 +50389,6 @@
     { "name": "pamperssamples.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paramo.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "parelweb.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "parenttheirpassion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "peace-is-possible.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "peppyflora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pflege.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -50470,7 +50403,6 @@
     { "name": "pssjd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "puur.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quantuin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "r-ix.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "r3gi.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radcloud.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radito.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -50922,7 +50854,6 @@
     { "name": "dpc.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dynacrop.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eightballde.luxe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "eligasht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elpreciosostud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eltron.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emojiteka.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -51417,7 +51348,6 @@
     { "name": "styleflow.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sujiao.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sunsetfire.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "supremaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "surveyorcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "swet.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "t-shirt-template.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -51670,7 +51600,6 @@
     { "name": "goldenyacca.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gonenli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goodsync.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gordonhamilton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gospellifewc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gothiclandscape.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gr8ness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -51778,7 +51707,6 @@
     { "name": "mfgo.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "miamibeachcommunitychurch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mijnadviseur.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "millsidecentre.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "miltor.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "miltor.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mintert.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -51818,7 +51746,6 @@
     { "name": "nhatrangbooks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nm.cx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nowecor.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "noxx.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nuclearcake.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nuovicasino.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nyhemsgarden.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -51865,7 +51792,6 @@
     { "name": "precedenceum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "primelendingdallasfw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "primeview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "princedavidlodge.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proteinreport.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "providence.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "psychology-ifk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53526,7 +53452,6 @@
     { "name": "hellblast.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hellhavens.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "helloteen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hellpc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hellsoldiers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "helpcalculator.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "helpcomp.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -55469,7 +55394,6 @@
     { "name": "appetitesanonymous.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "appsbud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "appsren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aptcaust.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "apuestalegal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arcopay.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arscogitandi.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -55787,7 +55711,6 @@
     { "name": "healthcise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "healthlable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "healthlar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "healthpert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "healthrish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "healthsone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "heliosbot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -55835,7 +55758,6 @@
     { "name": "ipgeolocation.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ironwaytransport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ishtyl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "isportsfab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "issho.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isuggi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "italian-shoes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -58577,13 +58499,11 @@
     { "name": "mihirsingh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ministerioaguadevida.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moderneraplumbingandgas.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "montanaonlinedivorce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "morawiecki.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "museodeinsectos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mygobelin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nacudeck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "naturvit.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "newbrunswickonlinedivorce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nicole-richie.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nkg.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nogger.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59001,7 +58921,6 @@
     { "name": "avtojurist.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "avtomaniya.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "awayword.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "awxg.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "az24saat.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "azartmania.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b1r0d4l0m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59252,7 +59171,6 @@
     { "name": "cuidade.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "curioustea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "curvyjessi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cuscoloko.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cvec.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cyriletsophie.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dailyhealthylife.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59411,7 +59329,6 @@
     { "name": "feetnesclub.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fef.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "felonymath.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "femboy.observer", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "feministreview.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "feministreview.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "feministreview.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -61436,7 +61353,6 @@
     { "name": "moocat.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "morecigarettes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "multipotential-labo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "muntstuk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "my-azov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "my-kirov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myalliance.church", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -61717,7 +61633,6 @@
     { "name": "amerikasepetim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andonivr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andreas-kurtz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "anikabyaabi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "antennekaart.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "antivigilancia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aorangi-debt.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -63055,7 +62970,6 @@
     { "name": "cyclingmonthlyest.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cyril-leytsihovich.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "da-tixe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dallasdesignco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daniya.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "darc.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "darkness.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -64851,7 +64765,6 @@
     { "name": "ivanya.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ivi.cx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jag-meccar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jagaimo.works", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jailfoodest.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jameside.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jamesjj.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -67081,7 +66994,6 @@
     { "name": "asmobox.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asp-progress.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asphaltsolutionsnc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "asselin.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "astarfrommosul.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asustor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "atarinew.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -69542,7 +69454,6 @@
     { "name": "altd.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "altoplan.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amalievonstein.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aminta.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anborn.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anccg.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andthisismyodyssey.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -69973,7 +69884,6 @@
     { "name": "shenmiya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shortcut-link.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "significado.origem.nom.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "silvercrossbaby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "silverflow.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skankofamerica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sleismann.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70499,7 +70409,6 @@
     { "name": "kbhfuge.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kennisnetwerkparkeren.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keno.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "keuzehelper.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kevin-neirynck.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kilte.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kinderzorg.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70524,7 +70433,6 @@
     { "name": "librairiez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "librarytapes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "libreexpresion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lojaskd.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "looxent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lousingchaphu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lovellgov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71225,7 +71133,6 @@
     { "name": "didi-online.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dienna.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dishonorablespeechinpolitics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dismed.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "djconde.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "djsamurai.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dmr446.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71444,7 +71351,6 @@
     { "name": "mkg-pch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mobinet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moeblog.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "moneyniti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "monstergovt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "motobrasilferramentas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "motorways.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71584,7 +71490,6 @@
     { "name": "solidian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sophier.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sottomarini.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sougou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "specialsite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "speelfabriek.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "spicerack.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71618,7 +71523,6 @@
     { "name": "theclarke.house", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thefoot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thegadgetflow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "theinsightsfamily.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thepriceisright.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thomaseikel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tianjinair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74274,7 +74178,6 @@
     { "name": "thematchless.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thewatchdog.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thimic.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "thimic.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tomoarigato.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toponlinecasino.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toskavista.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74679,7 +74582,6 @@
     { "name": "bebechegou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bebechegou.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "benjilopez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bertbrockham.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "besonders-s.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "betterlifekidsclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brandbook.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75101,7 +75003,6 @@
     { "name": "cazoo-dev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cazoo-test.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cazoo-test.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cazoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "certivac.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ch-poitiers.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "childrenoftheshadow.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75463,7 +75364,6 @@
     { "name": "foldnfly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "forocoches.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fotofreunde-telegram.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "framago.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freethinker.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freethinkers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freethought.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75571,7 +75471,6 @@
     { "name": "pacot.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pagesdemo.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pagespeaker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "patientenverfuegung.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paulharrisoncars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "payservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pemedia.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76144,7 +76043,6 @@
     { "name": "macdonaldplasticsurgery.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maiscupoes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marketforce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "marketmotion.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "markpulido.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marthajackson.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marvelcargiveaways.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76218,7 +76116,6 @@
     { "name": "productsafety.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "propeld.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qdep.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "quad9.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "readyblinds.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "revolutionhealth.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rhinesuchus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76765,7 +76662,6 @@
     { "name": "pracownia-kasi.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prasinoscomputers.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "praxis-oranienburg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "precisionpdr.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prestigeproviders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proclock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "profitable-textilien.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77940,7 +77836,6 @@
     { "name": "vimexx.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vipstat.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "virtualgayhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vitaline.uz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vitikit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "voi.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vyre.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78242,7 +78137,6 @@
     { "name": "clubetravel.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clubgls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "colombian.cam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "coursdejaponais.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "creer-mon-business-plan.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cremalleradenuria.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crimeamet.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78411,7 +78305,6 @@
     { "name": "productupdates.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "profarea.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "psezalla.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "quicko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quicktricks.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radiomix.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rahenytennis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78706,7 +78599,6 @@
     { "name": "andrasnagy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andreashartmann.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andreasxp.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "andythomsonbooks.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anfr.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "angeladietrich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "angelcreations.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79219,7 +79111,6 @@
     { "name": "clinicatorino.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clok.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cloud-glaeser.dedyn.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cloud-lines.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudads.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudeways.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudfilecomputer.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79715,7 +79606,6 @@
     { "name": "fantasysports.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fapzone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "farescan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "farlezz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "farmaceuticainternazionale.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "farmasimahaganesha.ac.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "farmersgirlkitchen.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80037,7 +79927,6 @@
     { "name": "gruppe-casablanca.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grupposiciliaviola.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gsp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gtalenders.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "guarever.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gudostudio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gugli3d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80202,7 +80091,6 @@
     { "name": "hotelesterobeach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hotelnagarkotparadise.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hotelsrejber.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hotelv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hottie.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hourlyearning.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "housebar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80493,7 +80381,6 @@
     { "name": "kettsy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keuze.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keyoxide.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kgs-neviges.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ki6rbv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kids360pediatrics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kidsgoga.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80761,7 +80648,6 @@
     { "name": "magnusfulton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magnusj.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maiateam.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mail-signatures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mailbywire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mailstation.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mainstortho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81271,7 +81157,6 @@
     { "name": "queirozmiotto.adv.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "queirozmiotto.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quizlets.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "qzlyrics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rabattkoll.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "raccoltarifiuti.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "racemanager.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81477,7 +81362,6 @@
     { "name": "schluesseldienst-haymov.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schooluniform.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schoonheidssalon-annelies-santpoort.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "schroederdennis.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scontomio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scootarama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scott.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82122,7 +82006,6 @@
     { "name": "urlauthority.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "urlauthority.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "usa10.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "usenethd.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "utterman.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vakantiehuisverzekeringen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valariejenkins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82200,7 +82083,6 @@
     { "name": "volantinaggioaroma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "volkstuinwaregem.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vollenberg.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vrchat.community", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vrdennis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vyvozhlama24.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w40faktory.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82385,7 +82267,6 @@
     { "name": "11183.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "11185.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "11400.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "114job.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "114online.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "11792.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "12006.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82562,7 +82443,6 @@
     { "name": "altertek.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alwuz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amazingribs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ameinteriores.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amis-du-cinema.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ampact.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amroelkhatib.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82757,7 +82637,6 @@
     { "name": "btmic.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buero13-design.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buhsantoandre.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "buildingpoint.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bummelwelt.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "burhanionlinestore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "burndyt3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82899,7 +82778,6 @@
     { "name": "courtonetickets.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "courtonetickets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coventrycollege.ac.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "covercrust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "covidstats.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cozyeggdesigns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "craftmeow.support", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83057,7 +82935,6 @@
     { "name": "easysport.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ebookdep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "echima.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ecole-du-digital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecole-eac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecole-parfum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecoles-conde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83093,7 +82970,6 @@
     { "name": "enefitvolt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enefitvolt.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "energicertifikat.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "energy.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enerot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "engbers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "entzoneplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83479,8 +83355,6 @@
     { "name": "jenever.amsterdam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jerusalem.estate", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jerusalemplus.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jf-beco.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jf-igrejanovadosobral.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jimbrown.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jinfbmanagement.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jip2011.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84262,7 +84136,6 @@
     { "name": "projet-pastel.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "properties.org.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proressources.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "proweb-design.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prozoneplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "psacertified.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "psicologiaparatodos.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84563,7 +84436,6 @@
     { "name": "sudtirol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "suedtirolerhotels.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sueperclean.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sugawara-soroban.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sunbeltasphalt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sunbeltsolomon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sunstaroptical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84769,7 +84641,6 @@
     { "name": "vjqlifestyle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vl.cloudns.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vmedia.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "volgares.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "volkswagen.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "voragorn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "voucherx.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84875,7 +84746,6 @@
     { "name": "young-hands.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "youremailexpert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yourlifespirit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yukon.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yupulse.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yxc.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yzal.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -85057,7 +84927,6 @@
     { "name": "brutal.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bsatroop3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bss01.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "budgetscan.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bundlejs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "burgesspetcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bus-hit.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -85715,7 +85584,6 @@
     { "name": "thediyvibe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thenew3rs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thenewsmill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "thinkaheadcomix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thongnhat.com.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "threadingcentral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "threatint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -85994,7 +85862,6 @@
     { "name": "ibarakisenkyohikaku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ignaciolacruz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "impeka.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ineight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inpresso.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "invidious.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ioxio-dataspace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86733,7 +86600,6 @@
     { "name": "joline.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joshgrancell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jpngamerswiki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jugendpresse-hessen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "justindianporn.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jz.lc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kashta-svgeorgi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -87086,7 +86952,6 @@
     { "name": "ambasady.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ameresco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amministrazioni.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "amundsensports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "analisi.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anatoliarles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anbank.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -87717,7 +87582,6 @@
     { "name": "nso.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ntut.edu.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nudgesecurity.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "numbed.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nwmd.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nyanor.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oddoo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -88138,7 +88002,6 @@
     { "name": "cgmote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "champslearning.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "checkmarx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "chendhurcollections.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "citymeats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clague.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cleanhortihigienizados.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -88152,7 +88015,6 @@
     { "name": "coderus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "colder.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "collagepartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "collectif-laicite-yallah.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "collinlove.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "collinlove.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "collins4mayor.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -88191,7 +88053,6 @@
     { "name": "dit.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dizzidecalz.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dksoft.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dlg.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doehle-group.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "domus-rely.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doverfcu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -89108,7 +88969,6 @@
     { "name": "getexplor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "globalmobilityjourneys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goaheadireland.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gravitylab.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grid.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "guestandmore.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hagenkleinert.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -89432,7 +89292,6 @@
     { "name": "capitalendurancegroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "capro.global", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "captainsonic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "careerfoundry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carfaxcanadaappgateway.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cariproperti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "casinonieuws.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -89684,7 +89543,6 @@
     { "name": "lemmamedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lepressoir-info.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lezzetyurdu.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lhm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "libertyreverse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "life360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "link.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -90111,7 +89969,6 @@
     { "name": "castelflowers.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ccslt.org.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "centralesnucleaires.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cesonia.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chaldal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chamath.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chamath.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -90539,7 +90396,6 @@
     { "name": "airportstockholm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ajaxmfs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ajvandeven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "akamu.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "akvakm.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alancolephotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "albertovr.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -90654,7 +90510,6 @@
     { "name": "bugprove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "busarm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "businesschances.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "buzhi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bwsolar.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bywencke.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "c-dome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -90892,7 +90747,6 @@
     { "name": "graphql-on-aws-appsync-book.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gratefulwanderertravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "greatrichmond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "greenit.eco", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "greenwood-it.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "greta-fischer-schule.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gsd.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -91916,7 +91770,6 @@
     { "name": "agora-energiewende.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agora-verkehrswende.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agorabet.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "agoraviagem.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agra.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agravery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agriculture.vic.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -92110,7 +91963,6 @@
     { "name": "anguloconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "angusbarn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anhembi.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "animecollective.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "animekompi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "animepahe.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "animepahe.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -92305,7 +92157,6 @@
     { "name": "auroraer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "auscert.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ausielogistics.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "australiabusinessblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "australiaunwrapped.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "authcom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "authenteak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -92799,7 +92650,6 @@
     { "name": "bulltorrent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bumblecraft.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buncombecounty.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "burberrysunglasses.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "burgas.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "burlingamehistorical.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "burnabyhighstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -93068,7 +92918,6 @@
     { "name": "cjp.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cl-1xbet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "claireandjamie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "clarkcountynv.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "claroty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "classicdriver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "classiques-garnier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -93173,7 +93022,6 @@
     { "name": "compunet.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "computerpoint.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "computersolutions.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "computertechreviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "comquestmed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "comune.palermo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "conferenciaepiscopal.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -93218,7 +93066,6 @@
     { "name": "core300.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cored.al", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coredrive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "corescientific.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cornel1801.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cornerstone.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cornut.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -93883,7 +93730,6 @@
     { "name": "exhalewell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exipure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "expart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "expatexplore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "expediapartnersolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "expediteplus-asia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "expediteplus.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -94325,7 +94171,6 @@
     { "name": "godyo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gogle-analytics-srv2456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gogocarto.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gogocharters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gogohood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gohost.kz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gokiebox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -94588,7 +94433,6 @@
     { "name": "hookemheadlines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hop.exchange", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hopscotchmodel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "horne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hornet.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "horngyihyangped.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "horusrc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -94887,7 +94731,6 @@
     { "name": "ising.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iskra-stolac.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "islamdin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "islipny.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isogg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isq.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "israelpalestinenews.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -95071,7 +94914,6 @@
     { "name": "keepsolid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keiebijters.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keitaro.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kelme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kemba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kemhan.go.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kena-blok.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -95282,7 +95124,6 @@
     { "name": "lendera.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lendinvest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "leoburnett.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "leolabs.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "leon-16255.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "leonardaccessories.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "leonardodrs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -95423,7 +95264,6 @@
     { "name": "lookathernow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "looksmax.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lootdog.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lootstudios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lornosa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "losviajesdequimyelena.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lotusbook247.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -95502,7 +95342,6 @@
     { "name": "mainstaysafetywedge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maison-et-domotique.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maiweave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "majalahponsel.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "majestic-rp.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "majorhifi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "makeitsimple.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -96287,7 +96126,6 @@
     { "name": "ortecdna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "osakayuku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "osb-alliance.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "osk-group.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ostec.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ostseebad-sellin.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ostuninotizie.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -96595,7 +96433,6 @@
     { "name": "polypublisher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ponytailsdesigns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "poonawallafincorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pop.xxx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "popeye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "popmatters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -96677,7 +96514,6 @@
     { "name": "profilib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "profilib.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "profitableventure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "profitero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "profitov.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "profyland.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "progea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -96919,8 +96755,6 @@
     { "name": "refpayio.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "refpazkjixes.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "refreshmentshop.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "regiojet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "regiojet.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "regionalanalysislab.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "register.com.np", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "registryfinder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -96995,9 +96829,7 @@
     { "name": "rg.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rhbrown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rhelevate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rhris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rialtocapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ribar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ribblu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "richard-fath.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "richmix.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -97062,7 +96894,6 @@
     { "name": "rubbingtherock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rubenshuis.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rubix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rude.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ruileitao.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rumahkeadilan.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rumusbilangan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -97660,9 +97491,7 @@
     { "name": "supplements101.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "supplyoutlook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "supportlafd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "surgatekno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "surpasshosting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "surreysportspark.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "susdomicilios.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "suse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sushikiosk.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -97912,7 +97741,6 @@
     { "name": "theprideoflondon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theqrl.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theqtree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "therapyforblackmen.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thermostatsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "therobertcoffeeshow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theros.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -98462,7 +98290,6 @@
     { "name": "washabich.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "watchfreexxx.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "watchpornfree.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "watchpsllive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "watcht20worldcup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "watchtimehub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "water-for-africa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -98522,7 +98349,6 @@
     { "name": "wendys-careers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weoneit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weqollab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "werkenbijblokker.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "werkenbijintertoys.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "werktuigen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "werkzoeken.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99213,7 +99039,6 @@
     { "name": "birthdayfeelings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bisnismuda.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bitbotster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bitcoinreserve.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bitdocs.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bittentechsolutions.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bizcalcs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99365,7 +99190,6 @@
     { "name": "changing-cities.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "charleroi-duty-free.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "charlesperkinsacademy.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "chasecorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chatify.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chatphp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chaveirogrimaldi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99550,7 +99374,6 @@
     { "name": "davosalestax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dawnzine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dblsuretybonds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dcso.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dda.gov.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dealnxt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dealsfinders.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99676,7 +99499,6 @@
     { "name": "dyn.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dynamictesting.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "e-driver.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "e-farm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eaa-online.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "earni.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "earthiq.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99946,7 +99768,6 @@
     { "name": "gayatri.net.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gayhotmovies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gayuhtri.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gaz-connect.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gbpayments.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gcoption.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gear4music.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -100216,7 +100037,6 @@
     { "name": "inwepo.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "io88.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ip.gov.py", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ipadizate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ipadizate.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ipon.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ipv4.party", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -100284,7 +100104,6 @@
     { "name": "kahmad.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaifischer.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaiod.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kamilsevi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kampfsportschule-einherjar.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kankfn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaufleute-sbh.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -100772,7 +100591,6 @@
     { "name": "new-vvip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newlondonhospital.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newpad.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "newworldnew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nex.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nexiopay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nf-tel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -100785,7 +100603,6 @@
     { "name": "nightingalebabyconcierge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nikabazar.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nikkei225jp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nilslab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "njintl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nma.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "noc.best", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -101445,7 +101262,6 @@
     { "name": "swpat.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sydcatholicschools.nsw.edu.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "symfoninews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "synchronicity.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "synfrait.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "t4-wiki.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ta-nehisicoates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102074,7 +101890,6 @@
     { "name": "baxus.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bdocfurniture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bdvasatkova.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "becli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beegarage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beeliarspirit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "behealthyeveryday.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102315,7 +102130,6 @@
     { "name": "drill-work.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drnatura.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dronevlaming.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "duckyubuntu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dudushu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dulcehome.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dynotraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102878,7 +102692,6 @@
     { "name": "mofos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mojavibe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "momsbangteens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mon-assurance-deces.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "monaroindustrial.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "monbebeautrement.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mondaynightbrewing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -103488,7 +103301,6 @@
     { "name": "webstreamworld.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wedatasolution.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wel.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "weldingandwelder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wensenboomaltrecht.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "werksalon.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "whong.media", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -103621,7 +103433,6 @@
     { "name": "biotraxx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "birebirvilla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blackdoordc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "blacklotusaudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blids.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blogbrew.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blogbuz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -103883,7 +103694,6 @@
     { "name": "keks.loan", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kerautretvian.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keyestudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kidm4k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kidsbits.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kingsexyshop.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kini24.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -104222,7 +104032,6 @@
     { "name": "top-super-60.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toricafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tpldevsg-mythiess-dev.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "traficus.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "transfers-sheregesh.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "travelmap.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "travelriny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -104246,7 +104055,6 @@
     { "name": "unlocktoolactivation.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unope.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "us.nl.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "uscdn.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uuuu.loan", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vanilla-official.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vanya.click", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -104542,7 +104350,6 @@
     { "name": "356338.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "356338a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "373521.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "376064.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "379237.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "385833.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "390539.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105185,7 +104992,6 @@
     { "name": "cosmeticosprofissionais.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "costravel.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coursesidekick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "craftutor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crashgambler.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crazytunaaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crownednetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -106531,7 +106337,6 @@
     { "name": "937693.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "937893.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "939493.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "943359.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "973325.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9882258.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9883358.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -106543,7 +106348,6 @@
     { "name": "abolitionist-movement.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "abortopr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "absolutepondcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "abtherapy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "abumount.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "acachau.synology.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "acaltair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -106922,7 +106726,6 @@
     { "name": "eckerl.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecodena.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecoresina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "edenredbenefits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edgemasterspaint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edjo.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edubase.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -107106,7 +106909,6 @@
     { "name": "hamgamweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hanishbagga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hanmandalu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hanmandao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hanmandaohang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hanmangu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hanmanlou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -108038,7 +107840,6 @@
     { "name": "4gtrackers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4hourmini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "51357.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "550885.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "555554.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5611.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5677.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -108445,7 +108246,6 @@
     { "name": "crepaway.com.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "criaraposta.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crimewatchus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "crimsh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cryo-fit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cryosite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crystalprinting.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -108653,7 +108453,6 @@
     { "name": "faces4watch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "factorchave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fairwayhomebuyers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "faithriders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "famschaefer.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fatih-catering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fedifeed.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -108912,7 +108711,6 @@
     { "name": "ith-heerlen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "itninja.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "itradeit.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "itsecboecker.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ivansgroups.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jaajko.me.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jagsttalschule.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -109041,7 +108839,6 @@
     { "name": "losangelescarpetcleaning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lospadillas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lotushouse.yoga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "loveasiangroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lovelandelec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "loveuno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lqy.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -109331,7 +109128,6 @@
     { "name": "pollock.gallery", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "portcomputingsolutions.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "portofsubs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "potatosoft.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pourali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "power-plugins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "power-recovery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -109531,7 +109327,6 @@
     { "name": "skatrey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skinmedshop.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skiptontownhall.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sks.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skyrider.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "slaght.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smallbatchclay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -109541,7 +109336,6 @@
     { "name": "smereka.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smrtgeekdevs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sniffnfetch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "snippetpress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sno-tek.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snotekbyariens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "socblock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111205,7 +110999,6 @@
     { "name": "hireshield.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hix.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "holly.lgbt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "honda2wheelersindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hondajoyclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "honesty.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hookconcretecompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111683,7 +111476,6 @@
     { "name": "reachwithed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "readybyjosh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reallight.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rebure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "redsift.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "redsift.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "redsift.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111980,7 +111772,6 @@
     { "name": "vippclub.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vipuser.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "visionsc.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "visiquate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vistapaket.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "visu.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vivagy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -113179,7 +112970,6 @@
     { "name": "invitarte.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ioriogioielli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ipaddress.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ipdgroup.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iphoned.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iruoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iservicio.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -114084,7 +113874,6 @@
     { "name": "srochno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stackshine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "staffsante.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "stalwartshopping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "standard-wohnungsbaukredit.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "standard-wohnungsbaukredit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "standardwohnungsbaukredit.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -114443,7 +114232,6 @@
     { "name": "weizhe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wellget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wellproof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "weltentanzer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weme.eco", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wenkong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wenkui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -115570,7 +115358,6 @@
     { "name": "discoveryfarms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "disenowebseoolmisur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "disepho.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "distekinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "distinguishedlegal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ditemi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diversual.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -116158,7 +115945,6 @@
     { "name": "heliman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hellfish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hello-aioi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hellomac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hellopet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "help360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hengchu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -116353,7 +116139,6 @@
     { "name": "jeremyfaton.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jeroened.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jewishboston.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jewishphoenix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jfuturist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jianbao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jianghong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -117234,7 +117019,6 @@
     { "name": "picksygirl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pilasebastovce.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pingbanche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pingbandiannao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pingodoce.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pinjian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pinsource.kz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -117553,7 +117337,6 @@
     { "name": "sanlg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sanpower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "santacasamarilia.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "santadeluxo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sanxiabank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saphead.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saponaria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -117749,7 +117532,6 @@
     { "name": "smileys-emojis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smkkesfambatujajar.sch.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smlstriperfishing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "smsnic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smt123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smylemouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snowapparel.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -117991,7 +117773,6 @@
     { "name": "themify.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thenewamericanright.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thenewsvortex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "theo.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theocourt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theperfectmediagroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theperformanceblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -118642,7 +118423,6 @@
     { "name": "ainet.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aion.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "airaplus.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "airborneexperience.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aircs.racing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "airportparkingschiphol.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "airporttour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -118660,7 +118440,6 @@
     { "name": "alentaja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alentaja.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alevro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alexandersavvidis.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alfakir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alfardanexchange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alfordbenefits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -119809,7 +119588,6 @@
     { "name": "mutua.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muzflix.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muziekluisteren.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mwahyunz.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mwstrategicservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "my-website.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myelucidation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -120269,7 +120047,6 @@
     { "name": "seeonee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "segv.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "selectingredient.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "selldesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sellusdtindubai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sellvps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "selv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -120568,7 +120345,6 @@
     { "name": "treningo.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trexedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trige.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "trilliondigital.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tripass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "triplepower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trisomie21-normandie.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -121762,7 +121538,6 @@
     { "name": "illimitmail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "imagisphe.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "imamiyadental.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "imkan.tours", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "imperialmetalproducts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "imprenta.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "improvehome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -121811,7 +121586,6 @@
     { "name": "j3dpd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jacktor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jaenparaisointerior.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jahanhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jailolo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jakoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jalajala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -122060,7 +121834,6 @@
     { "name": "mein-arabischkurs.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meindm.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meinerabatt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "memories-factory.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "merchant-portal.co.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "metaskil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meteoweb.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -122405,7 +122178,6 @@
     { "name": "reiaudio.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "relais-laguiole.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "remoteassistants.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "renascerstp.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "renevo.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reparatieferestre.md", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "revcovi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -122415,7 +122187,6 @@
     { "name": "rileypaige.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rmpbuilders.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "roamroofingco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "robertsfinejewelers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "robstibal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rockbandparty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rocketsales.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -122465,7 +122236,6 @@
     { "name": "sfpdev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shangyibao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shangyun.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sheatoz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sheelyuu.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shesherownceo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shiftkey.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -122644,7 +122414,6 @@
     { "name": "szili.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "szpv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sztreasure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "szw-hessen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "szymczak.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tabella.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tag-verse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -123100,10 +122869,8 @@
     { "name": "aertel.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "afadansedeparis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "affengine.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "afterdarklabs.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "afzaalace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agenciakarazai.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "agoshop.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agritatrade.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ahscarolinas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ai-powered-learning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -123157,7 +122924,6 @@
     { "name": "asiiro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "askeverythingonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asprose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "assoservicesweb.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "astore.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "astroanaliz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "at-consulting.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -123413,7 +123179,6 @@
     { "name": "comdmedias.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "comidasaludablehoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "commercialfundinggroupllc.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "conference.cafe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "congressiinternazionali.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "connectaimpianti.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "consumidor.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -123466,7 +123231,6 @@
     { "name": "devops.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dfg.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dfilip.click", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dg-tal.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "didiwinata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digital-sky.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dijks.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -123959,7 +123723,6 @@
     { "name": "keioni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kento.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kervani.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kevay.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keycodingjohannesburg.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keycodingpretoria.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keypoint.edu.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -124044,7 +123807,6 @@
     { "name": "live-home-cams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livecabomexico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livequote.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "liveutifree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livewood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livka.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "locus-cell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -124114,7 +123876,6 @@
     { "name": "medsilset.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medyumzeyneleroglu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mefano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mehmet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meileke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "memoireimplicite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mennohouse.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -124428,7 +124189,6 @@
     { "name": "rindepo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rinova.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ripu-eshii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "riscure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "riverroaddental.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "robinbrook.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rollthepay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -124936,7 +124696,6 @@
     { "name": "3we.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "444aicai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4infra.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4paws.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "521ssl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "555aicai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5iforum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -125036,7 +124795,6 @@
     { "name": "aivsasociacion.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "akaattorneys.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "akzio.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alamoranchhandyman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alandoyle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alarabiyanow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alarm.net.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -125372,7 +125130,6 @@
     { "name": "blokada.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bloom.study", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bloxtimes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "blue3investimentos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bluegrassprizes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blueit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bluinsights.aws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -126539,7 +126296,6 @@
     { "name": "inilahtv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inizio.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "injuryactive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "inlights.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "innewsweekly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inno2grid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "innovationcu.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -127065,7 +126821,6 @@
     { "name": "mechsoftgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "med.aid.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medd.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "medicininismetalas.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mediolan.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mednews.net.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medservice.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -127210,7 +126965,6 @@
     { "name": "mruniver.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "msklawyer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "msrf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mtpleasantchiropracticsc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mttoubkaltrek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muac-innolab.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muanhamy.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -127645,7 +127399,6 @@
     { "name": "projectcompassion.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "projectobsidian.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "promochevrolet.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "propco.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "properwills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prosamineira.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proservice.website", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -127682,7 +127435,6 @@
     { "name": "pushponline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pvp-factions.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pyxalis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "q-cup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "q-gen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qasphere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qconomics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -127761,7 +127513,6 @@
     { "name": "raitotec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rakor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rakweb.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ralphdeal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "random-numbers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "random-password.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rany.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -128736,7 +128487,6 @@
     { "name": "x3650.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xarcmastering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xcontainer.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xeoxaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xhby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xiansou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xianwei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -128961,7 +128711,6 @@
     { "name": "backlink.gd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "backzoneterapi.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baesystems-she.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "baeten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baitnaservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bakerandfarmer.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bakkerpanden.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -129021,7 +128770,6 @@
     { "name": "btking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "budgetfitter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "budtraffic.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "budulanradu.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buffbarbell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bulgarianmale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bullionexus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -129036,7 +128784,6 @@
     { "name": "c2cdn.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cablare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caf.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cahabadigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cahier-reutilisable.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caishi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "calc.center", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -129363,7 +129110,6 @@
     { "name": "fashionopenstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fastlaneimportautorepair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "feini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fengshuimeta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fetishvips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fikirblog.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "filosofiskaeleonora.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -129462,7 +129208,6 @@
     { "name": "goodmedia.solutions", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goodpad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goodpig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "goodyphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "googleplaypartnerportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gordonbeeming.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gourmet-safran.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -129827,7 +129572,6 @@
     { "name": "mingmingde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mini-rock-festival.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minidrett.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "miobeach.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "miomiorun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mirandaberkhof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mirte-engelhard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -129986,7 +129730,6 @@
     { "name": "pachamamita.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paddle4ever.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "palworld.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "paolodapul.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "parkchesterinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "parkderm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "parliamentcamp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -130019,7 +129762,6 @@
     { "name": "photosbyadeline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "phpfan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "phpfans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pigsbytebooks.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pinjiushi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pinktara.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pip-maker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -130087,7 +129829,6 @@
     { "name": "radarerp.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radarocidental.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radiolavka32.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "railfeeding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rain.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rainbow-girl.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "raipet.spdns.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -130538,7 +130279,6 @@
     { "name": "xiaoneng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xin.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xixiashan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xlr8.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xlr8webshops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn----8sbdjbisdat0g.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--12cfi6eb4azb7c5cbfw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -130579,9 +130319,7 @@
     { "name": "zcapital.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zdlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zearalenone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zenfoodbook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zenjify.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zero-sole.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zerofactory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zgys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zhangze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -130802,7 +130540,6 @@
     { "name": "bonsaiandsuisekimagazine.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boros.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "borsfa.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bosque.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boss-it.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "botelladevidrio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boy.gp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131005,7 +130742,6 @@
     { "name": "ddswireless.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deathbychilisauce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "debtaid.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "degruchy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "delta-4.software", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deltalight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deltrap-ernst.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131181,7 +130917,6 @@
     { "name": "fjordbank.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flat3fowey.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fliesenbock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "flycolor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flyhajjumrahtours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flyingtips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flythink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131191,7 +130926,6 @@
     { "name": "foox.style", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "for-mary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "forestale.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "forestsandrangelands.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "forexman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "formiti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "forum-peugeot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131833,7 +131567,6 @@
     { "name": "prawicadlawolsztyna.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "preecepools.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pregatire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "prelovedkidstyles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "premium-rum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pressride.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pressurepowerwashing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131992,7 +131725,6 @@
     { "name": "sd2017.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sdkuangshajixie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seals2024.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sebastian-bergmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "secure-share.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "security.gov.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seeses.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -132377,7 +132109,6 @@
     { "name": "zarv.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zejuns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zelkinezis.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zenbluemkt.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zencar.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zeusmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zhishengwin.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -132419,7 +132150,6 @@
     { "name": "777111.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "7datarecovery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8000.cx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "89117.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "999100.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "999102.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "999103.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -132488,7 +132218,6 @@
     { "name": "999194.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "999195.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "999941.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "999942.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "999943.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9x0rg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "a-bur.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -132517,7 +132246,6 @@
     { "name": "aerotrophy.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aestheticlounge.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aesthetikpolizei.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "africanteachersassociation-us.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agneswater.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agora-hirsch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ahbgxny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -132539,7 +132267,6 @@
     { "name": "alabamagunowners.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alaincouture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "albinliljestrand.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aleutrealestate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alisceon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alistelab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alixarmour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -132597,9 +132324,6 @@
     { "name": "askthosewhoknow.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aslia.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aspiresys.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "asta-marburg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "asta-marburg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "astamarburg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "astratech.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aswe.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asylum-sanctorium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -133806,7 +133530,6 @@
     { "name": "stowarzyszeniegetback.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "streamlinedprocesses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "strongestcashoffer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "studierendenschaft-marburg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sufni.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "suigen.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sunsystem-speicher.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -134357,7 +134080,6 @@
     { "name": "daymark.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daymarksi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dbplumbingheating.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ddbservices.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deftcontracting.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deluxetransfers.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "demoserver4.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -134376,7 +134098,6 @@
     { "name": "dghyp.org.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dghypimmobrief.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diad.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dickdoesdoors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "die-lage.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dietaryguidelines.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitalcataloghub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -134445,7 +134166,6 @@
     { "name": "engineerinsurance.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enkosi.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "entradascorrida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "entreprisesavendre.quebec", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "equicad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "erfanmhdi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ericaandersonmd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -134633,7 +134353,6 @@
     { "name": "honestpragueguide.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "honestshipping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "honeyarcus.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hopsmaus-shop.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "horlogenumerique.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hotelmirage-bg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "houseofshades.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -134769,7 +134488,6 @@
     { "name": "konila.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koninkrijk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kotuiako.school.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "krastown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kriipsujuku.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kritickemomenty.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "krosker.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -135228,7 +134946,6 @@
     { "name": "smartbetaler.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smartstvari.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smile-shika-fujii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "smokyshores.radio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smpelec.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smshub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snkz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -135434,7 +135151,6 @@
     { "name": "voigt-analytics.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "voipreviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "volcano.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "voltacircuit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vpex.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vr-immoexpress.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vr-immoexpress.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -135504,7 +135220,6 @@
     { "name": "yritza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yzys.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yzzy.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zakutka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zaminutusest.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zdebelak.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zdravevhlave.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -136210,7 +135925,6 @@
     { "name": "ng-stroy.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ngtdevel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ngtqa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nightfoxaudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nightlymoon.us.kg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nikoniko-dental-support.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nimahoda.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -136380,7 +136094,6 @@
     { "name": "sagaknives.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sai.com.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sakumadc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sakurapink.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sandbox-simplevisa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sandholt.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sandtlivigud.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -136787,7 +136500,6 @@
     { "name": "alphonso.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "altabeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "altimetrik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "amalgambiotech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ambankspot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ameriserveintl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amico.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -136975,7 +136687,6 @@
     { "name": "caniphish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "canopelle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "canshare.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "capathsuccess.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "capecat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "capmarquees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caralegal.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -137092,7 +136803,6 @@
     { "name": "dealspotr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "debita.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "debita.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "decourhomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "degustavending.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dekbedden.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dentalimplantsolutions.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -137479,7 +137189,6 @@
     { "name": "kkn.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "klubclio.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kmzs123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "knispel-online.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "knoji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kolmeti.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "komatsu-dental.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -137623,7 +137332,6 @@
     { "name": "menegaro.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mentaflex.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "menukart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mercadoorganico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "merciahandyman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mestriga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "metallokonstruktsii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -137858,7 +137566,6 @@
     { "name": "proteinbowlgokturk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "psikoucka.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pstfoto.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "psychologlodz.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "psyt.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "puertaparaiso.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "punaise-de-lit.paris", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -137903,7 +137610,6 @@
     { "name": "reliableparts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "relyon-plasma.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "renecoignard.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "renren.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rentierpinguin.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reparatur-werk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "resimsin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -138185,7 +137891,6 @@
     { "name": "tiredsleepy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tirkomplekt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tispayments.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "titlecan.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tk0.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tlotsa.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tmadev.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -138899,7 +138604,6 @@
     { "name": "viralytydne.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "virtuallife.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vitekvirtualsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vizxglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "voiceofprague.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vorbis.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vr-immoexpress.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139015,7 +138719,6 @@
     { "name": "automagiatec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "autosynthetix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "av-autoparts.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "avail-sw.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "avivglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "awardsuite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "axeles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139122,7 +138825,6 @@
     { "name": "career.how", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "careerstart.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cartazodiacal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "casadelsole.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caspe.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caspeco.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caspeco.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139213,7 +138915,6 @@
     { "name": "d3oe4g2tw01ssi.cloudfront.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "damlakartal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "danielandantonia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "databridge360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "datawarehouseinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "datekompas.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "datekompas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139273,7 +138974,6 @@
     { "name": "ecdonline.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edel.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eden.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "edepola.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edgarbollow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eezoublog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ekangroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139331,7 +139031,6 @@
     { "name": "exbirr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "excelsamurai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exceptionalcache.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "exercise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exitrooms.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "expo.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fadaebalears.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139533,7 +139232,6 @@
     { "name": "joalheriamaya.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joannadziekan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "johnsonscorporate.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jonvemo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "josh.ooo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joymation.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "justgiving.events", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139555,7 +139253,6 @@
     { "name": "keycenter.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kiewiterp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kimmerheide.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kimootoko.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kindaclothing.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kinderland.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kncss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139765,7 +139462,6 @@
     { "name": "partycal.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "passandsecure.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "passwordass.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pathzero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "patna-pomosht.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "peabodynewhomes.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "peacefulexperiences.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139795,7 +139491,6 @@
     { "name": "pmu.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "podivilov.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pole1.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pollunit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pos-servicios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pplog.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pptbliss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -140514,7 +140209,6 @@
     { "name": "designhousedecor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "desireeburch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "desireeburch.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "destiny-homebuilders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dev.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dewit-automatisering.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dianzi.dog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -140709,7 +140403,6 @@
     { "name": "infinitblog.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infostack.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infraviewer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "inkywanderer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "innio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "insaattedarik.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "instanello.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -140889,7 +140582,6 @@
     { "name": "metalpallets.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meteoben.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "metrolodging.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "meyvs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mhzorg.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "miamidadeshades.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mightyinks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -141442,7 +141134,6 @@
     { "name": "002026.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "031120.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0mniteck.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "191512.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1986equipmentleasing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2-host.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2000meter.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -141763,7 +141454,6 @@
     { "name": "cracky.mywire.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crackychan.duckdns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crcprojects.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cream-dream.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "creationsunivers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "creativemotion.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "creature.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -141869,7 +141559,6 @@
     { "name": "electrochef.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elektror.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elemac.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "elevatedinteriors.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emmalevy.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "empactdigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emprestimodedinheiro.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -142135,7 +141824,6 @@
     { "name": "kawamipiano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kawistamade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kcievents.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "keek.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keishi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "khaihsn.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kim-ariyor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -142213,7 +141901,6 @@
     { "name": "lukaspapcun.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lukka.tokyo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lumaistore.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lungcancermesothelioma.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lupacentrum.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "luvaandco.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lygus.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -142279,10 +141966,7 @@
     { "name": "mercatoday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mercazaragoza.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mesa.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mesotheliomacauses.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mesotheliomaclaims.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mesotheliomasymptoms.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mesotheliomatreatment.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mesutsahin.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "metameva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "metron-eging.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -142539,7 +142223,6 @@
     { "name": "rentify.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rentyard.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "repairyour.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "repartim.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "repomansez.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "resinbondedaggregates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "resolutionlife.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -142680,7 +142363,6 @@
     { "name": "tak.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "takki-sumoi-fi.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "talentsunivercite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "taliabobalia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taniepaleciaki.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tarakan34.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taran.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -142760,12 +142442,10 @@
     { "name": "tulsafathers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tunnelise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "turkscaicos.villas", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tursa.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tusic.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tysseminilager.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ucmultrasonics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ucmultrasuoni.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "uggonlinestoreofficialol.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ulog.ba", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "umbraco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uniglobalintijaya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -142838,7 +142518,6 @@
     { "name": "westvirginiatitlesearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wewacard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "whatagreg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "whatismesothelioma.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "whitespi.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "whoisfreaks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wiidatabase.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -142884,7 +142563,6 @@
     { "name": "youwillnever.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yttrium.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yu.nm.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yumetsuki.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yunxinfoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yxo.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yxo.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -143476,8 +143154,6 @@
     { "name": "aqualectra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aquarestaurantobx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aquinyoga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "arab-drama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "arab-drama.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arab-dream.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arabfcn.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aradex.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -143532,7 +143208,6 @@
     { "name": "artapardaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artgalleryar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arthurcox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "articlebuzz.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artipoppe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artistreplugged.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artlurker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -143830,7 +143505,6 @@
     { "name": "beaconcapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beam.mw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bearly.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "beas.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beatcanning.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beatitudes.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beatthestreet.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -143935,13 +143609,11 @@
     { "name": "bi-file.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "biancapaulphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bibbvoice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bible-help.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bibliodiversity.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bibox.schule", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bichl.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "biddr.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bidswitch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bidtraffic.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "biergartenjockel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "biesbosch.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "big.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -144220,7 +143892,6 @@
     { "name": "brokeronline.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bromcomvle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bronsonsmarketplace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "brossard.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brothers.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brouage.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brouwerijdehemel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -144518,7 +144189,6 @@
     { "name": "celsa.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cembra.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cement-co2-protocol.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cemes.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "centerami.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "centogene.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "centralcranetrucks.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -144690,7 +144360,6 @@
     { "name": "clearpointcreditcounselingsolutions.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clearviewinstitute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cledepeaubeaute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "clementinepoetry.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clerkie.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clevelandskatingclub.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cleverdialer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -144753,7 +144422,6 @@
     { "name": "codecs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "codeocean.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "codeseek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "codesync.sa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "codeunderground.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "codewills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "codewing.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -145510,7 +145178,6 @@
     { "name": "dvrpc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dwavgs888.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dwqr.scot", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dyln.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dynarex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dysnomia.studio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dz-hip.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -145724,7 +145391,6 @@
     { "name": "electricblockaloo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "electricpulp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "electroiq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "electronicshelpcare.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "electrum-mona.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elefantcms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elejido.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -145917,7 +145583,6 @@
     { "name": "esl.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "espabox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "espbimbel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "especes.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "essence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "essenglish.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "essexapartmenthomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -145998,7 +145663,6 @@
     { "name": "ewboo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eweb.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ewg-garching.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ewgalerie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exabeam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exabytes.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exadel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -146149,7 +145813,6 @@
     { "name": "finbuzz.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "finccam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "findby.co.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "findlaws.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "findpwa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "findyourinfluence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "finearchitecturedesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -146537,7 +146200,6 @@
     { "name": "getliberty.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getmywellness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getnexar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "getpayever.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getpuravive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getraenke-hoffmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getsmileapi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -146663,7 +146325,6 @@
     { "name": "gomaywood.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gong.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gonvarri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "good-life-pt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goodbeast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goodlovelies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goodold.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147180,7 +146841,6 @@
     { "name": "hypolink.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hypolive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hytravel.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "i-click.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "i-r-t.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "i-sprint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "i4i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147233,7 +146893,6 @@
     { "name": "icrea.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "icuc.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iculture.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "id-strategies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "id.et", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "idahofarmbureauinsurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "idahohde.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147271,7 +146930,6 @@
     { "name": "ijceo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ijk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ijsj.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ikacode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ikbear.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ikecosta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iket.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147367,7 +147025,6 @@
     { "name": "inforisktoday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "informadb.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inforver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "infragard.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infragardnational.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infraredproductions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infrony.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147756,7 +147413,6 @@
     { "name": "kafshetebi.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaia-health.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaiserburg-nuernberg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kaldi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kalhotkomat.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaliartistry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kall.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148370,7 +148026,6 @@
     { "name": "ludlowcub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "luenepost.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "luggagent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lukhachdem.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lula.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lumafestival.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lumapartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148623,7 +148278,6 @@
     { "name": "mdbuyline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mdhelicopters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mdirector.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mdsny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mdxhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meacsports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meadowmere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148683,7 +148337,6 @@
     { "name": "mensium.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mental-navi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mentorly.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "meppel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mera25.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "merata.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mercatotime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148985,7 +148638,6 @@
     { "name": "muncyt.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mundoguatemalteco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "munique.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mupdf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muranoglassitaly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "murphyphotos.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "murraygrove.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149078,7 +148730,6 @@
     { "name": "mzadqatar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mzalaat-hail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mzuther.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nacds.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nacelle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nachhaltig-in-graz.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nachrichten-heute.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149281,7 +148932,6 @@
     { "name": "nij.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nijigen.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nikahgeh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nikeoutletshoes.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nikolaiknows.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nikolastefanovic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nilupul.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149479,7 +149129,6 @@
     { "name": "officeconceptdesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "offshore-technology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ofi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ofzenandcomputing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ohiostatepress.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ohsoperfectproposal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oja50.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149790,7 +149439,6 @@
     { "name": "payback.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "payback.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paydollar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "paye.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "payfacto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paym.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paypo.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150366,7 +150014,6 @@
     { "name": "realbluesmagazine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "realclearlife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "realestatebydawn.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "realestatelegalupdate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reallove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "realtruth.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "realtybymonica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150509,7 +150156,6 @@
     { "name": "rhizmall.pk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rho.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rhonni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rhtube.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "riauwebhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rib-software.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ric-sb.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150528,7 +150174,6 @@
     { "name": "ricp.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rideneuron.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rideology.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rie.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "riepe-online.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rightathomeinteriors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rightsign.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150634,7 +150279,6 @@
     { "name": "royalmarine.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "royalsblue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "royaltyrange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rozemuller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rpgresearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rpirents.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rpmrecords.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150728,7 +150372,6 @@
     { "name": "sakraworldhospital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "salalgrano.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "salamkisan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "salemcountynj.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "salesagility.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "salesforcebenefits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "salinecountysheriff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151041,7 +150684,6 @@
     { "name": "siblondelegandesc.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sicaf.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sicblox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sicilyactivities.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sicklyio.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "siddhalepa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sidechannel.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151144,7 +150786,6 @@
     { "name": "skogsstyrelsen.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skoleforeningen.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skolid.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "skolverket.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skrill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skvot.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skyderby.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151249,7 +150890,6 @@
     { "name": "solix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sollishealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sololearn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "solskin-art.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "solve360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sommerrodelbahn-gutach.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "somosmasa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151712,7 +151352,6 @@
     { "name": "techcombank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "techdracula.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "techexeter.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "techjeny.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "techjournal.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "technikforum-backnang.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "technologies-ebusiness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151826,7 +151465,6 @@
     { "name": "theater-essen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theaterdevest.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theatermania.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "theatrebeanfield.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theatrelalicorne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theatrewolfpodcast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theauthoritarians.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151894,7 +151532,6 @@
     { "name": "thefanscotian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thefirehouse.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thefix.media", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "theflowerapothecary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theflyexpress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thefordhamram.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theformtool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152076,7 +151713,6 @@
     { "name": "thrillng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thrive-gyms.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thunderclient.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "thunderlotusgames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thuprai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tib.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tic.gal", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152234,7 +151870,6 @@
     { "name": "trainingleadersinternational.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trainocate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trak74.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "trames.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trangcadobongda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "transalta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "transamerica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152384,13 +152019,11 @@
     { "name": "ucandles.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ucertify.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uchiha.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "uckg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ucmcomponents.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ucollege.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ucsdguardian.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uct.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ucware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ueberzwerg.myftp.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uefs.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uerkheim.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ufcw175.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152581,7 +152214,6 @@
     { "name": "vedantatoronto.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vedettesdeparis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vegaawards.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vegaforeducation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "veganfoodandliving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "veganku.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "veganmainstream.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152901,7 +152533,6 @@
     { "name": "westexec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "westonfoundation.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "westpack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "westpapua.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "westsoundwildlife.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "westwing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "westwoodhorizon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153026,7 +152657,6 @@
     { "name": "wordandnote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wordforword.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "workin.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "workingplace.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "workingreporter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "workiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "workleap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153150,11 +152780,9 @@
     { "name": "yesilparke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yianniswine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yiitzee.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yiyeqing.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ykc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ykkim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ymcago.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ymcaokc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ymere.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yoasobi-music.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yocto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153198,7 +152826,6 @@
     { "name": "zdrowie-na-widelcu.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zeamerseagerbeavers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zefir.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zekvc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zelda.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zen-garden.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zenduit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153297,7 +152924,6 @@
     { "name": "5h.wtf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5moe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5starhvaccontractors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "7kb.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "7matic.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "a2zbabyname.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aa-security.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153445,8 +153071,6 @@
     { "name": "antiagingdietideas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anticip8.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "antidotehealth.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "antocom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "antocom.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "antoniusquartier-plankstadt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anurawebdevelopment.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anydownloader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153572,7 +153196,6 @@
     { "name": "axonov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ay-daily.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ayindayoga.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ayurvedawiki.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "az-servisoken.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "azgaragedoorsrepair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "azraxiel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153624,7 +153247,6 @@
     { "name": "bebra.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bebra.cm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bebra.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "becojo.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bedb2-snowflake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bedb2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beddenscout24.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153658,7 +153280,6 @@
     { "name": "bestfidgettoysforadhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestill.foundation", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestindiahotels.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bestoffunny.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestpracticesleidraad.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestpricelovers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "betteridge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153893,7 +153514,6 @@
     { "name": "chezfalco.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chinainluxury.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chita-news.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "chokesngags.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chosentrends.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chrigi.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "christian-garo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153956,7 +153576,6 @@
     { "name": "cointotaal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cokoli.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coldraven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "colinemadral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "colinknapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "colisso.band", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "collaberotica.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154105,7 +153724,6 @@
     { "name": "datelelectrical.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "datera-solutions.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "datingdocsales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "davidemasoni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "davidgroup.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "davidheineman.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "davidroker.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154177,7 +153795,6 @@
     { "name": "dforceplatform.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dgo52i78h9vgm.cloudfront.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dgrj.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dgsdh.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dhawayurakyoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dhdk7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dialogantes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154405,7 +154022,6 @@
     { "name": "enjoytrip.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ennovationtech.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enterspor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "entruempelungsfirma.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "entschieden-besser-finanziert.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "entschieden-besser-finanziert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "entschieden-besser-finanziert.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154487,7 +154103,6 @@
     { "name": "ezygrowth.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "f3franklin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fabio-lanzieri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fablabchemnitz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "facilities.gd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "factnsoftware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "factsiknow.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154524,7 +154139,6 @@
     { "name": "feiertage-ferien.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "feifandaily2024.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "felicitysolar.com.mm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "femarelle.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fepg.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fernandocanales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ferrynitzsche.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154606,7 +154220,6 @@
     { "name": "frankpeoples.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "frauenarztzentrum-am-see.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "frauenpraxislaufental.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "freedommunitions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freedomsanctuary.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fretvuio.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154659,7 +154272,6 @@
     { "name": "gassafetycerts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gav.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gavinwhite.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gay.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gazbit.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gcchelp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gcclsa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154707,7 +154319,6 @@
     { "name": "ghe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ghostshieldfilm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gidc.gd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gifini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gift.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "giftbasketswindsor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gigwise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154907,7 +154518,6 @@
     { "name": "htn.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "htpower.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "huanglee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "huarantee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hubermanlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hubmark.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "huez.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154934,14 +154544,12 @@
     { "name": "hyzure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hzuuuz.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "i2forensicmasters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "i3c6d0s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iamexperts.consulting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iapprev.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ias.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ibaclofen.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ibm.iobb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iboplayer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "icanrelateto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "icl-growingsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "icolabo.yokohama", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "icpamerica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155005,15 +154613,12 @@
     { "name": "ineedtocheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inet.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inetis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "infolinks.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inforeole.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "informdio.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infortuni.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ing-holzbau.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inga-renner.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ingelnook.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ingo-struck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ingo-struck.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ingushetiya-news.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inkadr.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inkedindarkness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155054,7 +154659,6 @@
     { "name": "ionescu.sexy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ionescuvlad.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ionescuvlad.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ipaddress.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ipo.inf.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ippis.rw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iptv-germany.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155319,7 +154923,6 @@
     { "name": "lawassociationtt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lawinform.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lawkwk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "laxammo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "layx.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lc-cloud.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lc-home.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155340,7 +154943,6 @@
     { "name": "level-assist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lexplicite.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lexzyne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lgo4d.boats", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liberalia-conseil.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "librariansteach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "libre.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155376,7 +154978,6 @@
     { "name": "liveregistratie.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livetec.show", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ljdesign.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "llamasshop.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lmb-cars.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lmb-gruppe.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ln.gl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155558,7 +155159,6 @@
     { "name": "mentorsinchief.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mercedeservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mereclay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "meridianrhum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "merrettsurvey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mersinodak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meshsmasher.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155615,7 +155215,6 @@
     { "name": "moawards.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mobile-retter.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mobilegameslist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mobilehub.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mobilepricepk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mobiler-musikservice.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mocdltraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155668,13 +155267,10 @@
     { "name": "mrwebb.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mryayapapaya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "msg.org.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mshkz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "msk-news.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "msrusset.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "msxi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mt-international.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mtbwanderers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mtgims.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mu.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mudanzasacuna.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mudanzashorizonte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155948,7 +155544,6 @@
     { "name": "otimo.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "otnij.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ouders-uit-elkaar.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ouestlabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ouestlebug.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ourodaestrela.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ouroestrela.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -156511,7 +156106,6 @@
     { "name": "setis.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sevastopol-news.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sevastopol-news.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sevvven.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sexi.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seymourpowell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sf-kladow.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -156550,7 +156144,6 @@
     { "name": "silentdisco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "silhak-automation.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "silkdnb.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "silvanaweb.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "simplex-q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "simplex-rm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "simplifyem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -156676,7 +156269,6 @@
     { "name": "srvhome.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stabila.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stacylight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "stadtfabrikanten.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stakecalc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stampix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stankaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -156782,7 +156374,6 @@
     { "name": "synchrodogs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "synerionagile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "synerionenterprise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "synthroidsl.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "systemhaus-ehst.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "syuumi.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "szkolaoddechu.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157017,7 +156608,6 @@
     { "name": "tvm.events", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tvnr.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tvyvideo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tw-analytics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "twinlimousine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "twistedservers.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tycom.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157036,7 +156626,6 @@
     { "name": "umkdd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unalma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "undertake.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "unexplainedthings.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unibank.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unifiedworld.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unihifi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157139,7 +156728,6 @@
     { "name": "visitmurrumbidgee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "visitpembrokenc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "visruth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "visva.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vitalis.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vitastic.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vithor.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157157,7 +156745,6 @@
     { "name": "vntyper.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vocalaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "voda-nadom.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "voicimonavis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "voidnya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "volgograd-news.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "volkswagendirectsales.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157191,7 +156778,6 @@
     { "name": "vr-realestate.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vr-realestate.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vr-realestate.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vratix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vrhyp.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vrhyp.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vrhyp.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157259,7 +156845,6 @@
     { "name": "wastedaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wastefulaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "watches-of-switzerland.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "watchesofswitzerland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "waterfedpole.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "waterwatcherseducation.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "watrd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157271,7 +156856,6 @@
     { "name": "wdmn.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weakaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wearableaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wearevanity.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "web-cloud.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "web-design-cape-town.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webaccessportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157390,7 +156974,6 @@
     { "name": "xsauto.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xsport.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y337.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yabit.org.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yachats.photos", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yachatsunderground.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yachiyo-cl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157403,7 +156986,6 @@
     { "name": "yaroslavl-news.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yasarteknik.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ycatsh.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ydia.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yeeted.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yenhughes.law", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yeschef.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157820,7 +157402,6 @@
     { "name": "drskinmedspa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "duck.tel", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dunlopracing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dustygameportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dyedurham.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dzhypo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "e-beyanname.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158072,7 +157653,6 @@
     { "name": "journeyplanner.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jrelsawy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "judjas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jvenglishtutor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kampkoetter.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kancriaura.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kanshuluo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158105,7 +157685,6 @@
     { "name": "koffer-schweiz.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koivukangas.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "korabbio.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kotelsales.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kraftochbalans.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kross1308.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158418,7 +157997,6 @@
     { "name": "rankingbyseo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "raumgestaltung-sassermann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rayann.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "raybans-outlet.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rbtcpas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "readaster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rebecca.blackfriday", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158601,7 +158179,6 @@
     { "name": "ti-electronic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tictac.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "timerway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "timotielens.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "titlecan.us.kg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tobi-matrix.goip.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tobi-server.goip.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158669,8 +158246,6 @@
     { "name": "vetter.family", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vfinancialgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "victoriavets.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vidlen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vidlen.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "viesaholiday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "viesakompressor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "viesaworkair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159065,7 +158640,6 @@
     { "name": "davinci.guide", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dctech.events", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "decimalpointanalytics.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "deepbluecozumel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "degreeverify.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "degreeverify.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "degreeverify.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159414,7 +158988,6 @@
     { "name": "lurlur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "luxtransfer.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lynx.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "m-idav.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "m3eng.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maderaslamision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magazinhaberajansi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159907,7 +159480,6 @@
     { "name": "trackiq.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tracksideintelligence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tracksideintelligence.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tradingfuturos.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "transamer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "transcriptcenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "transcriptcenter.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159980,7 +159552,6 @@
     { "name": "whiteandprivileged.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wildschuetz-gmbh.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wildwill.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "winkracht.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wip-tideplatform.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wiredandwovenrestoration.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wisteriahotel.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160035,7 +159606,6 @@
     { "name": "119sh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1b.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1bar.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1plus1tv.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2rings.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2to.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "345404.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160216,7 +159786,6 @@
     { "name": "bulsec.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bulwarkhealth.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bunnysear.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "businessnews.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buswell-familie.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buzzseminar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bvcf.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160258,7 +159827,6 @@
     { "name": "chenilles-processionnaires-idf.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chiconyitd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chillywhite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "chinavicharana-mole.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chinesedanceschool.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "churchcapital.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ciclosis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160334,7 +159902,6 @@
     { "name": "detus.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dg-pberon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diamondinterestcoffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "diboochi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dichanho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dina.wtf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dineatbuca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160509,7 +160076,6 @@
     { "name": "grace.money", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gracefuljourneys.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "graduationsupplies.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "greatriverig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "groupeleriverain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "guccigame.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "guerande-cosmetiques.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160518,7 +160084,6 @@
     { "name": "h4kr.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hackhit.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "haesoolee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "handcraftedinvirginia.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "handwfenceco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hannahandnick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "haoskin.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160526,7 +160091,6 @@
     { "name": "happypixeldesigns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "harbingergroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hashti.tn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hatsthings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "haveko-vv.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hayesfusion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hayesindustrialsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160668,7 +160232,6 @@
     { "name": "libertesassociatives.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lifeofpromotion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lifestylecityspa.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "likeyesterdaysjam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lincolmlabs.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "link2fleet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liorizik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160817,7 +160380,6 @@
     { "name": "noteapp.icu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nrb06.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ntangledstate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ntns.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nutriflex.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nutritea.com.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nutriwell.com.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161050,7 +160612,6 @@
     { "name": "smotrowrelated.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smssalesforce.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "societe-france-irlande.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sokb.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "solid.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "souqfriday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sourcecredit.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161109,7 +160670,6 @@
     { "name": "tcl-foundation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tcvafrica.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tdk.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "technologic.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teknoparkistanbul.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "temanbelanja.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "terra-di-mezzo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161219,7 +160779,6 @@
     { "name": "vision-ridge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vivekmalipatel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vmvinskin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vogue-lotus.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "volantinando.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vorxdigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vumea.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161426,7 +160985,6 @@
     { "name": "beemdata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "belegstelle-glashuette.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bellylaughliving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "berget.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bertolinoengineering.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "berufszertifikate-und-diplome.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beskar.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161617,7 +161175,6 @@
     { "name": "diobrasperu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "discoverx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "discuss.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "disobey.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dissention.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dobremedia.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dobrenoviny.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161654,7 +161211,6 @@
     { "name": "elhombreinvierno.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emailassist.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "embassyindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "empowerhealpt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "encentfit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enduro-center.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "energiaelcorteingles.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161739,7 +161295,6 @@
     { "name": "get2career.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gilribeirofit.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ginesenergy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "glascentro-gmbh.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "glascentro.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "glastuershop24.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "global-inwest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161796,7 +161351,6 @@
     { "name": "heartcodelabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "heatwrap.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "heike-koltermann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "heliguy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hellonest.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "helpguru.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "henrimalhas.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161850,7 +161404,6 @@
     { "name": "inovigo.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inphima.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inspiresandinnovate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "io-markets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iotrasloco.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ipadresse.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ippudo.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162121,7 +161674,6 @@
     { "name": "nuevayork.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "numericolor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nuuls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nyb.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nylonova.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "o-o.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "o00o.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162256,7 +161808,6 @@
     { "name": "safetytools.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saginawtx.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sahilten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "saltedfishes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "samina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "samisallinen.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "samsat.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162275,7 +161826,6 @@
     { "name": "searx.party", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seavisiongroup.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sebastianwyder.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sebeobjevovat.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seecdn.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sefareshpardeh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sejambemvindosaofuturo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162540,7 +162090,6 @@
     { "name": "wildhealth.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "willows.uk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "winn.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wolvex.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "womenleadingwomen.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "woof.blue", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "workwides.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162581,6 +162130,1709 @@
     { "name": "zofoke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zongzi.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zrampage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "022.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0iq.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0x0.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0x58.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "10mb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "13gustafwasa.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1688zp.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1a-umzugsprofis.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1coast.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1tpt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1viemeilleure.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "25genomes.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "25genomes.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2wth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "31fss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3xceler.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4marry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a-bio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aa.cx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aayamresorts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abortionfaq.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abualhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abulhuda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aca.gov.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acadlly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "accesstive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acegear.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acsense.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aditumconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adminsbscdev.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advantagecapital.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aezone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "affectnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "afriqiyah.aero", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agendamotor.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agender.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agentur-haas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agerton.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agrimet.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agro-parts.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agrosantos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ahlstrandsbegravning.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ahnastro.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ahorroenergeticoenhogares.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aicredit.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aimvancouver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ajpappas.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "akaphonelink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "akhalahija.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aktmedurna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aktmedurna.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alchemicallabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alfarisi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alhayes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alisecure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aliwuliu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aljeel.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alkibiades-gc.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alleventsrentals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alphaenglish.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alphaplastic.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alredaldaem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alriyada.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "altaef-group.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "am-pool.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amalgrp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ambience.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amibistro.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amotive.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amperwatt.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "analisichimica.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anco.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "andreasfotakis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "androidham.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "angioclinic.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anihime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anklepainclinic.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "annovasolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anshulg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antie.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antinfortunistica.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antitarlo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apicoltore.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apixconvex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apoioterapeutico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "appetto.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "approvedbynemko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aprosoftwaresolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aramleisure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ariebassie.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "armorcoatings.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aronra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artapisserie.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arttempo.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "as1030.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiaferguson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "askfoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aspacedesignstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "assistenzamedica.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "assistlink.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atelierica.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atheismappreciationday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atheismeverywhere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atheismfaq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atheismhalloffame.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atheistappreciationday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atheistblogroll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atheistdoctrine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atheisthalloffame.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atheisthelpline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atheistwisdom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "attorneygeneral.gov.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atumfire.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aucc.com.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "audio-arte.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "audioaidynamics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "audit.gov.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aufiowilauf.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ausl.mo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "austinrifleclub.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autocorea.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoevolution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autohunt.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autops.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avci.org.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avci.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avestabegravningsbyra.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avow.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avpny.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "awqaf.gov.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ax.ax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "axelyum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ayari-yassine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b-m-druck.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "babynamesdirect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bakeneko.academy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bakenekoacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "balleagues.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "balsoftware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bangingtoolbox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "barnesmoregapgreenway.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "basicblock.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bb-es.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bcsconsulting.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beatbikers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bedrocksoftware.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningaristockholm.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningdirekt.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningikyrkan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningikyrkan.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningmedkista.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningmedkista.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningmedurna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningmedurna.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningsbil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningsbil.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningsbilar.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningsbolaget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningsbolaget.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningsbolaget.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningsbolaget.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningsbyra-stockholm.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningsbyrahuddinge.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningsbyranhumana.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningsbyrauppsala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningspaket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningspaket.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningsradgivare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begravningsradgivare.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "benaddi.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bentermail.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "benzo-master.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "besthomegenerator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestproductreviews.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestratedremovals.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestviolin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beyondbell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bezbednostnaradu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bgadget.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bh.sb", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bharat.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biblemobile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biharujala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bijzonderondernemen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "billigbegravning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "billigbegravningsbyra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "billyimmo.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "binas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bintelligence.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biodiversitygenomics.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biodiversitygenomicsconference.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biolibre.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biolibre.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biolibre.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biolibre.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biolibre.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biolibre.uy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biolivre.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "birgitkratz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bitteksolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biz1.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bladweg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bladweg.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bladweg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blindsportssa.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bloggizmo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blomsbegravning.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blondeangels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blood.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bloor.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blu.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bnames.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bodumo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bohaishibei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bokni.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bonificareambiente.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bonitrust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "booking.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bookultra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bookyoursmog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "borgerligabegravningsbyran.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "borglig.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "borgligbegravning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bosvenssonbegravning.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bouppteckningdalarna.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bouppteckningstockholm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bouzalegal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brainstreams.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "braverytechnology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brega.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brightcrest.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "broad-path.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brokensofa.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bsg-mag.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bsgmag.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bt-kc.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "budgetglasscranbourne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buenosairesrunway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buergerinitiative-pronatur.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bugbyebye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "burn.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "burningro.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buurtpreventiewaalwijk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "c-a-c.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "c.sv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caa.gov.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caballeros-smerald.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cabinetvoyance.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cache22.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cache22.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caduceuslane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "calcworkshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "calibarber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "call-plumbers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "callertech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "calliari.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "calliope.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "calverley.church", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "camargoprime.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "canadianatheist.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "canadianemail.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cancerrxgene.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cane.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caravanwise.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carbcleantrucktest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carlowsouthernreliefroad.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carmagazine.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carpentry-shop.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carrotbase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carsiceland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caseflowmanager.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cashify.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "catalyzr.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "catrepeller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cautela.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cautela.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cawsandbayguitarfest.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cct1d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cctld.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cctld.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cctldnames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cctldnames.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cdmcalsace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ce43.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "celectricos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cellphonedb.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "celltypist.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "centrumpvp.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "certi.org.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ceskydj.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cesmet.mil.do", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cfotech.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cfotech.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cfotech.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cfotech.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cgeventoseturismo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chama.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "changeofownershipsmog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "channellife.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "channellife.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "channellife.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "channellife.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chatero.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chemengzone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cherished.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cherrypink.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chiefaircraft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "china.gs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinacolour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinamemo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "choufei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "choukou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "choushe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cicgroup.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cipherwizards.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "circle6maildrop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "circumcisionfaq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cisalpinatours.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cita-sepe.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "classifieds.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cleanpowerbg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cleared-4-takeoff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clickbizhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clickpharmacy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "climatizacionyeficiencia.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clinicelham.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clip-reisen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudfactory-sftp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudpractitionerhelp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudsvibe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cmotech.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cmotech.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cmotech.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cmotech.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cmotech.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cmx-survey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cn.fo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnsbordercellatlas.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cofidis-business.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coiga.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coin4hub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "collagenoriginal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "collectiontardivel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "colo.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "columbiatax.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "commeunprintemps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "commodore64.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "communityvision.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comparativadetarifasenergeticas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "compassintladv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "compuseguridad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "configcast.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "configcast.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "configcast.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "conseilsmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "consilium-ifa.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "consultar.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "contentcaching.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "contiinex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "contratasegurosalud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "convergenza.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coo.ooo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cooktiva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "copaint.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coppini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "core.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "corfman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "corn.ninja", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cornninja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "corpconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "costelcom.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "countyfarmcentre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "courseware.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coutelleriederibbes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "covid19cellatlas.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cowlculator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cpgdgs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "craftcenter.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "craftcentre.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "craigtodd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creativemood.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creditenonstop.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creditnonstop.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creepymemes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crestwoodmowing.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cretatratamento.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "criatsy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cristi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crmphenm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cronistadooculto.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crowdee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crownmutual.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crownmutualgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crypto-recovery.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cryptonewsz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crystalball.photo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "csco-compare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cuantusambiental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cupons360.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cure53.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "currencyroot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cv-generator-fe-eu.herokuapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cycleboss45.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyformatic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyklokoalicia.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "czjava.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dacadoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daftarpenginapanbatu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dailynk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dancenowportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dartijan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "data-fortress.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "data-fortress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "databiz.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datacenter.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datacenternews.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datacentrenews.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datacentrenews.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datacorp.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datascene.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dateable.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "davidbindel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "davidrichardson.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dbsm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ddduk.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deathnotice.irish", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "debridleech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demcon-bunova.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demcon-industrial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demolandia.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "denizgulerguitar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deoairport.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deppresion.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "derventzis.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "designscapessa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "desimachines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "destinovandelvira.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "devfixer.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "devopswow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diaocan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "die-sterntaufe.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diefreitagsfotografen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diefreitagsphotografen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diefreitagsphotographen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digitaloath.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digitell.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digivibe.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dimitri.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dippydiva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dipsis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dipsis.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dirtylifewheels.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "disc.uz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "discoveringmoroccotravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dismar.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ditte-destree.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dkengineeringwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dkern.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dkern.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dkern.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dkern.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dkm.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dmbvideo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dns.ooo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doctorrayaneh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domainbaron.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domestiq.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dongjing.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dontserveteens.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dorhandverkeren.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doritadata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dposit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dposit.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dposit.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dposit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dpsg-radolfzell.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dragnetcredit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dreabb.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dreamexperience.tur.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drsurvey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ds-bv.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dubiznes.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dysgeusia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e-commerce.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e-pi-log.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eaces.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eaglestccs.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easysmogglendora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eblesoft.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "echx.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eclipse-foundation.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecole-lepavillon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecommercenews.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecommercenews.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecommercenews.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecosurfsupply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecotone-tottori.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eddns.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eddns.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edi-app.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "educart.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eduyog.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eerlijkland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eerlijkland.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eerlijkland.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "egtv.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eigendeeg.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eino.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elementalwave.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elfinit.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elfland.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eliguli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ellianhasalon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emblemconstructions.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emsystems.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "encanstanne.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enfinnit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "engaugetools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "engehall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "englishlanguageclub.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ennekoops.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enovetic.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enphase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enrollmentverify.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "environment.gov.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eqnz.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "equinoxit.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "equinoxtraining.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "errsal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "escapegames.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "estrabota.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "et-xprojects.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "etme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurocarparks.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurocosmo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eutox.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "everettsbirthdayparty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "evnia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ewuraba.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "excelbusinessservices.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exits.partners", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "expanda.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "explohub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f.hk.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f0.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fa53.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "facchino.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fadiahmadwealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "failsguild.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fairclimate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "famiport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fangban.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fanjiong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "farmaciabarcelona.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "farmerbrossamples.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fastable.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fastbookings.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feedready.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ferienwohnung-schmitt.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fettrechner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fh-erfurt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fileshare.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "filesharing.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "find2career.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fintalks.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firehada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firstgenmc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fitfingers.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fitnessfreedomathletes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fiveclassauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fixtesisat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flender.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flexnet.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "florevit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flyten.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fmsautomocion.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fne-anjou.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foblesproject.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fondsvermittler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foo.fo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "food-n-force.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "footballhom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forfemalefounders.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foundryhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "francosud.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frankenpost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "free.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "free.tools", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freefemale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freeflybrake.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freeflybrake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freeyourself.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freform.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "french-fly.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freshrss.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freshrss.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "friendlydesigner.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "friomamut.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "froggienw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fromthesoul.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frostland.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frostland.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fs4is3y4sh5uhxgjj4yudjgpjaxwkkdqt64ztolrbvlw5pxesezsfvad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fs4is3y4sh5uhxgjj4yudjgpjaxwkkdqt64ztolrbvlw5pxesezsfvad.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fs4is7zrzcubrrfkhrx4miywpx3l5xk4vse2axsxbgetdlabe6gvvqyd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fs4is7zrzcubrrfkhrx4miywpx3l5xk4vse2axsxbgetdlabe6gvvqyd.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ftcunion.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fuhuiglobal-zhs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fujideclaration.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fungirecipes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fxv.pizza", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gambleinireland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gapo.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "garantikoza.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "garston-entertainment.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geekcircuit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geldnavigator.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gemdirt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genestho.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genome.gallery", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genomehubs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genomic-surveillance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genomic-surveillance.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genomic-surveillance.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genuwine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gettaxesright.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ggsmp.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ggza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gigadysk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "givewithclick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glassportal.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glendoracleantruckcheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glendoracleantrucktesting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "globalhubb.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glorysite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glosscosmetica.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goabonga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "godieng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldenhilltower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldenpreference.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldentravels.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodtasteofhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodtea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goostars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gootleeg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gootleeg.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gorillacamping.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gosekku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graphicsdeal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graureiher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graveconcerns.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grdxkn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greatgiftidea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "griffonwise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grimsey.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "groupml.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grundrauschen.pub", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grupopalmadorada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gshub.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gss.ind.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gta6wave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gtm.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gtmhosting.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guanquan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guc.ci", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gudao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guiadelautoconsumosolar.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guillaume-simonet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gulfdinar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guscanada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guteli.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gwaudiodesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h.hk.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h2ocustomers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ha.fo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haihuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hambot.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hamburger-reinigung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanabi.so", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanginman.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hansatransporte.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hardknocksacademy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hardwa.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "harmonyheadspa.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hatzbs.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haubrechts-peinture.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "health.gov.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "healthcare6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "healthybrewhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heatbyte.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heerlijkland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heerlijkland.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hekmah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "helenturkington.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "helpyourrobot.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hendersonhouse.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "herbosia.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hernanracciatti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hesab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hidemee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hidemyipaddress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hiyd.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hizakura.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hlc.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hlukh.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hofisat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hoofcareunltd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hostchina.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotelcoco.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotellocaldubai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotisp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotset.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "houseandhounddogwalkers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "howardconnected.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hs-shrewsbury.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "htbplc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "htbplc.uk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huakan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huanxu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huapont.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hudconstruction.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "humanembryo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "humaniora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "humaya.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hummingcat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hut-hashani.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hybrid-hippie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyperppl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ibilezakat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "idc.gov.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "idiga.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "idw.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ieji.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "igeeksblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "igotp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilkofis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iltze.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilustrart.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imanol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imenieto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "impacto.cw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "impress-connect.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "incrementx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "incrona.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "index.co.cr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infinity-area.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infomazeone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infyzterminals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inkandlise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inkjin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "innotech.com.bd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inp.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inregistrar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "insane.studio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inssb.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "intaqtapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "intechenviro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "integralthread.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inter-corporate.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "interativashop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "interiorservice-endego.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "internetverkstan.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "investbit.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "investegate.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "investhq.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ip3.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ipolski.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ironcleanse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iskndr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "islamophobia.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "isnadf.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itbrief.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itbrief.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itbrief.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itbrief.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iversionesdp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iwill.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "izitex.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j2.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j2software.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jackcon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jackschobergrealestate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jafisportcamp.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jainnatory.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jainnotary.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "janthemiraclehunter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jaydenrichardson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jessiekirk.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiangrun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jin-english.academy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jintao.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jirehcon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jix.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jldlawyers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jmmouilou.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jnana-yoga.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joezcool2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "johnmcc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jordywozniak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jtwo.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "juday99.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "judyrodman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "juffrouwtoertjes.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "julia0815.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "juliard.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jumbo33.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "justwebworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "k.hk.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kabbalah-events.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kairoscope.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kamyaraccount.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kanalsamochodowy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kankaimataji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kannegieser.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karabuk78.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karakurt.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karo.pc.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kayentatownship-nsn.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaylarichardson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kc-support.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kdt-lille.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kenkobox.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kesko.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kestrelconnect.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keyth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kg6wxc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kik-computer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kindersoldaten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingcute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingpie.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingroot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingtreasures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinkywood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kirtlandforcesupport.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kirtlandfss.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kitchenconverse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kittyclub.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "knarred.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kneepainclinic.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kollegier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kolshy.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kongedugnad.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koomaldreaming.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koop.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koots.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koyso.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kr1shna4garwal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "krieg-it.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ksiga.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuraraynoritake.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kyranis.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "l.nf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "l.wtf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "labour.org.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "labyrinth.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lacker-baugutachten.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laclub.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lagardere-tr.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lakecountryhouse.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lalimentari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landisit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landvaart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landvaart.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landvaart.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lasvegasfit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leafcreations.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leech.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "legality.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lemp.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lephone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "letsight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "letstop.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leuname.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leverosky.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leverosky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lfthoodies.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liangmian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liantao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liasecboard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libertyrxpharmacy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libmbr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "librewolf.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libyanwings.aero", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lidepla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lifescribe.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lifetimeguaranteedhousepainting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ligand-research.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lindapark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lindin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lineamagazin.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linefire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linelab.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lingnong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lingwa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linkai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linuos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lishizhen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "listcraft.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liyaozhen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lncorp.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "localai.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "logicmelon.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "logicmelon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "logicmelon.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "logsped.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "londynka.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lorenaandthetide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loughkeygreenway.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "louisianarecoveryauthority.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ltxhost.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lucieradosinska.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luciezimmerova.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luminateimpactlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luo.bo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luobo8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luziekurth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lvzui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lycaknight.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lyfeblud.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "m-tower.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "macawi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "madlenphotography.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magnoliaglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mahallekulturu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mahtarivandanayojana.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mailerhosting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mairaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "malariacellatlas.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mamy-blue.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mandraveselie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mangelot-hosting.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mantenimientodeinstalacioneselectricas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mantide.duckdns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manuelosorio.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mapailytics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marcus-mueller.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marijnroovers.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marlenarosa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marmorariaembh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marxists.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masefieldvets.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masonsrestaurant.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "master-zone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mattpetrie.music", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mattpetrie.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maxtire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maybankjobs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mcnavody.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mecexis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meinsite.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mejorcoberturamovil.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mejorestarifasmoviles.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "melia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mellingburgerschleuse.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meralda.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mercadoshops.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mercadoshops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mercadoshops.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mercadoshops.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mercadoshops.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mercadoshops.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mercadoshops.com.ve", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mercurylodge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mertonapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mertonapprentice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "metalab-vorstand.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meteotorun.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "metroscubicos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mhvs.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "michal-smahel.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "michalsmahel.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mijnstembureau-emmen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mijnstembureau-hilversum.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mijnstembureau-zaanstad.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mijntrined.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "milestoneinternet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mindgtc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mindthebridge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minimalytics.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minimalytics.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ministryhire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minoar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minorsurgery.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mitragacor.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mitre-bedford.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mitsuhashi.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mnpl.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mobilesmokeopacityglendora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mobilesmokeopacitytesting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mobilesmokeopacitytestinglosangeles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mocasa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mochiai.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "modfor.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "modperl.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moevps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moguchat.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moltenplastic.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "momo.moda", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "monstertraxstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "montajtamirmobilya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moonglancecareer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mooo.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mopsly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mostynlaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "motorcyclenews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "movilesconfibra.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "movilysinpermanencia.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mpcenter.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mputra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "msc-fivem.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "msnetworksetup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mspsocial.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mswww.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mtg-drafter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mtiga.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mulao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "multilateralfund.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myaeon.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myalpine.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mycalculators.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mycountylink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mydogsvax.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myeastrand.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myibmchq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myloplaza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mythicca.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myvoucher.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myvouchers.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mywellness360.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mzback.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "n4mullingartolongford.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nac-6.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nachos.stream", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nameabusiness.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nannostomus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nanoheal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "narcoticsindia.nic.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "narmsec.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "narrative-health.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nascenteseguros.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nationalbluebadge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nationalfuse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "natuurlijkbesteld.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba-2k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba.christmas", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba.com.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba.de.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba.download", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba.gd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba.gs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba.hosting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba.trade", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2k.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2k.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2k.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2k.download", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2k.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2k.mt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2k.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2k.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2kcn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2kmods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2kol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2konline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2konlinex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2kqq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nba2kx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nbadancers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nbade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nbagirls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nbaim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nbaimg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nbalive.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nbalivecn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nbalivex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nbasky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nchirumbolo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nclpagamentos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ndeoye.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nemko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nemko.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nemko.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nemko.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neoxam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "new-flyer-institute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsprinters.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nexiam.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nexocap.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nextcal.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nextcal.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nica.org.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nickkatie.wedding", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nightinvasion.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nightowl.consulting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nikinterior2018.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "noc.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nomadwallets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "norion.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "northbaytechnical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "notaiomenghini.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "notes4z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "noticiasdebrasiliaonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "noticiasdeminasgerais.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "noticiasdesp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "noticiasdoriodejaneiro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "novavistawindows.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "novento.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "npliga.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nsimobilewatersolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nugeopend.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nzlp.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oakhill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ocun.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oddtx.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "odebouchage.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "officereg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "offnet.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ofsuchsounds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ojos.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "okynot.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "olympsec.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "omolines.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onecellatatime.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onfo.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onformative.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinecasinozed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onmyodev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onsatv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oompf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo.ooo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opcteknoloji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "open-ibd.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "openspf.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "operadorescon5g.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "operadoreslowcost.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optim-wise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optimumfinancier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optimumre.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optimumre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "osterzopf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ouipharma.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ousho.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ow.ls", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oxypteros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pacegenerative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pageuk.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "palatofrisco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "palian.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paragon-access.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "partik.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pasteanon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pasterial.hopto.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "patentmatik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pathforworldpeace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paultymoshenko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pazaracik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcbmilling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcbprototyping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pensionsmyndigheten.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pentescope.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peopleubeda.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peridoc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "perlaphotography.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "persiandevelopers.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pharos-labs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "philosophyofatheism.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phishup.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "piedmontpacific.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "piefed.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pierugo.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pinksolution.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pinksolutions.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pinksolutions.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pixellibre.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pixelpartyplay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pixon-chemie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "planit-inc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plannerap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plantennatuurlijk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plasmoth.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plasticeyesurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pleasure.box", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ploppis.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pluginuri-wordpress.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plus.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pneumogen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pocomo.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polarsy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polskieogloszenia.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polynoob.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "portalinmobiliario.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pp-performance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prachidigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "precitaj.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "premiersalesaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "premium-leech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prime-likes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "primeleech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "primetal.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "printstudio.kiev.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prism-glass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prodapt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "produweb.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "profoodgroup.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "promail.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "promina.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prontopaga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prontoprint.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prostatecellatlas.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "proxiel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psychoco.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ptks.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "publicjustice.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "puffinvapes.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "puffverse.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pup-riley.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pver.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pwtchemicals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pzasa.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qde.rip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qdzx.net.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qingshanasd.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quadrijet.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quadroadvertising.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quail.ink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quaily.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quantumpartyrentals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quantumsportscenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "queerlinq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "queermerk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "queermerk.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "queermerk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "queerwerk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "queerwerk.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "queerwerk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qwqjsq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qwqjsq9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "r7w7m4p0w1r2t8k6y3x4j5q2z8b4d.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radcanton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rafes.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raidtcg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "railmarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raincoastherapeutic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raincoastherapy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raincoastmassage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raincoasttherapeutic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raincoasttherapy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "randolfrichardson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raquest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raspinerd.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ratiotechnik-milde.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "readydesign.studio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redeyecare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redteamabseiling.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redwoodshop.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "registroparteviajeros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reimu.mom", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reliablegun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rem.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "remedium.net.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "renaissanceklc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "renovationbm.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "renovationbm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rentalcar.com.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "repall.com.sa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "repinger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "repobox.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reproductivecellatlas.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reprook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reroboto.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "restaurants-reunion.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reversec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rewardmagnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rhsc.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ripitout.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ripitout.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ripvip.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "risen.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "robox.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rocketlabcorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rockler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rocklerpro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rodapies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roelkoops.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roltech.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "romankondratev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rombey.capital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rota.te.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rotential.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rpa1.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rssatom.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rsshub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rssready.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rusticcreations.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rustwood.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sahabatsawit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sainaracademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samedayglendoracleantruckcheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sandhitransformer.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanithais.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanniescustoms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanpablo.go.cr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sarah-bundy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sarastan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saromile.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sashroyee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "savannahgraham.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sawayaka-hitachilaw.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scaffoldinghiresandton.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scaffoldingmidrand.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sccc.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sccellfie.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schengenerhaff.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schiermonnikoogshop.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schistosomulacellatlas.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schoolportalng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "science4everyone.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scm360.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scorpioguitars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scrapcarremovalmilton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "screenfox.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sdpp.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sdslandscaping.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seacowtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "searchbin.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "searx.stream", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "secondsightmgt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "securitybasegroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "securitybrief.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "securitybrief.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "securitybrief.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "securitybrief.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seguroscochedesustitucion.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "segurosdecochehistorico.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "segurosinternacionalcoche.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "segurosmatriculaextranjera.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "selsehcc.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seniorpremium.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serizon.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "servantsofgrace.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serviall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "service360group.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "servicii-wordpress.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "settle.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sevenseaslecarnival.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sexfirehub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sha.bi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shailendra.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shapps.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shelleyparts.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shiftscale.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shoerenew.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shorakagroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sibasiach.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sidrodrigues.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simelek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simplerandbetter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simsapras.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simsid-dev-adpapi.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simsid-dev-audit.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simsid-dev-oneroster.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simsid-dev-timetable.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simsid-partner-audit.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simsid-partner-oneroster.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simsid-partner-timetable.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "singlecellcourse.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sintaksenjadigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sirvoy.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sjukom.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skabour.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skendongpoetry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skeptichaven.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skepticsinthepub.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skillfloor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skilltory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skinarma.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sklexpert.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skolkavazka.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slidingright.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sllabonneetoile.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smahelova.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smartfusion.solutions", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smarthus-elektro.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smiledentalriverview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smokeopacitytestingglendora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smolsites.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smolyanvote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sn-tim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "snapewife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "snapfairs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "socosolarpower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "softwaregeek.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "solanawizard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "solar-projects.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "somtelecom.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sonciel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soraharu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soul2path.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spb-apple-helpgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spookhost.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spookysrv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sportsandgames.co.tt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spu.ac.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "srlconsult.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "standardsofexcellencelv.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "starryhometex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stay.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stayaka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stayksa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "steel.gov.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stelleflix.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stephaniefarbermd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stephanielantry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stonexbullion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "straightbeam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stratcat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stripperweb.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "strongmindjapan.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "studentclearinghouse.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "studyfurniture.lv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sudafri.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sugar-homes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sumesgutner.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swbruce.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sweetscrap.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sxhyjn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sysco.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sysi.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "systemsikkerhet.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t1movie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taiway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "talinhandmade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "talkhaled.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tarifasconroaming.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tarifasdegasnatural.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tarifasparapensionistas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tarifasprepago.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tarpin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taskido.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tastiquo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taufiqzainal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tcg.cards", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tcgprinter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tcust.edu.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "team-slicrown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techbridge.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techday.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techday.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techdayca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techharbor.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techharbor.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "technikoma.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tecscipro.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teerapatde.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telconews.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telconews.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telconews.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telconews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telconews.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telconews.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telecinesound.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teleflow.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "temaju.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tempoforce.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tennis-open.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tentrentals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tentsforsale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teraflop.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "testingthe.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thebanquethub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thebeaconng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thecultureclubhouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theendpoem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thegoldenpreference.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theisthelpline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thelansingjournal.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thenewsbullet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theorganicrecycler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theracket.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thermannconsult.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thetcellshow.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thirdroadconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thompsonmedicare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thorsteinsson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "threeloudcrows.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thrillux-event-hire.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thundr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tickerswatchandclock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tickerswatches.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tim-koop.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timah33.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiramisucake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tissueimmunecellatlas.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tissuestabilitycellatlas.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "titrespresse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tk8813.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tknc.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tme.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tnsolutions.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "todays-golfer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "todotelecom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "token2049.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tomstile.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tomtile.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tonalyca.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tonsilimmune.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "top10answer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topflightwildlife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topjumpmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toptier.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topwipers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toranm.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "totaleaseventures.co.ke", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tourbox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tp-newsclip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "traderbobsgeneralstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tradexbank.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tradu.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "traduttore.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "transgendereninterseksecollectief.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "transgendernetwerk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "transgendernetwerk.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "transgendernetwerk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "transgendernetwerk.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "translatorsglobal-languagespro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "treeofsex.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trevorwong.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tripperoo.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trit.services", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tritinity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "truenorthtalk.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "truenorthtalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "truthenforcers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tucarro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tulipzulip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tulipzulip.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tulipzulip.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tulipzulip.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tulipzulip.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tumoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "turntableexpertreviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tutorialtactic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tvleader.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tvleader.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "twinstore.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tzcdn.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tzcdn.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "udiparfum.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ugfzc3dvcmq6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uk10k.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uk10k.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "umhcc.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "underhentai.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "undesk.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unicodeart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uniformd.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urbanfront.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urbanstrategiesinc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urmx.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urmx.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urmx.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "usersnap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "usmc-mccs.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "utobrokers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uyghurian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v5x.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "valtlai.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vas-web.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vatcompliance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vaultify.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vehicledocs.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vehicleinforcheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vemtambem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vendordiagram.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vendordiagram.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vendordiagram.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vendordiagram.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "venice.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "venndor.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "venndordiagram.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "venndordiagram.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "venndordiagram.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "venndordiagram.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "veransadigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verdantnature.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vericura.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verifiedfirst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verifiedsol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verticalappliedcontrols.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "veuzconcepts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vexavium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "viagra911.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "victorieux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "videoclix.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vikyho.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vinarnaunas.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "viridismep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "virtualstaffhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "virtualtasksprout.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vitamins-and-minerals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vivasaludable.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "voks2025.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "voltiumlab.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vorotasam55.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vos-consultancy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "voyance-universelle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vpseu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vroomvroomvroom.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vwoensel.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w-graj.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waca.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waiga.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wam-tech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wancity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanilia.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wapin-colon.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wapwibowo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waste.domains", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wayakcomm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wdnmd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wearethecultureclub.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webbpedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webdevdes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webnword.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webprofi.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "website-prototyp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wecprojects.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weirdorks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weisstech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "welcaremall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wenzsecurity.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "westernguarantyfundservices.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wgfs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wholelogic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wildbillproductions.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wildstrait.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wildstrait.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wimasons.foundation", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wind-lindewitt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "windmusic.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "windrainflood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "winit.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "withwander.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wizardcompass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wizardshop.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wizzlinked.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wofosi.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "womenstalk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "workhardtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "worthyhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "woveniac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "writememos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wstore.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wwiliveportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wyiga.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wysoczanski.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x-guard.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xcdd.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xdgesports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xloveit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--begravningsbyrnonline-52b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--begravningsbyronline-9zb.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--begravningsentreprenr-0ec.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--billigbegravningsbyr-g0b.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--borlngebegravningsbyra-34b.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--boupptckning-lcb.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--boupptckningstockholm-b2b.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--brommabegravningsbyr-g0b.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--brtransport-x8a.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--mij-22a.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yapatriot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yawnbox.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yha.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yinghezhinan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ynon.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youexcell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youfi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourdnayoursay.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourfriendlyrecipes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourgenome.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourgenome.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourgenome.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourgenome.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youtransmarrakech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yurp.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zahnarztpraxis-cevikel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zendo.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zigloi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zillionparts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zoho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zonanonton.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zorntt.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     // END OF 1-YEAR BULK HSTS ENTRIES
 
     // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/quic/dedicated_web_transport_http3_client.cc b/net/quic/dedicated_web_transport_http3_client.cc
index 9879fd4..386e72ef 100644
--- a/net/quic/dedicated_web_transport_http3_client.cc
+++ b/net/quic/dedicated_web_transport_http3_client.cc
@@ -585,6 +585,7 @@
 
   IPEndPoint server_address =
       *resolve_host_request_->GetAddressResults()->begin();
+  visitor_->OnBeforeConnect(server_address);
   return socket_->ConnectAsync(
       server_address, base::BindOnce(&DedicatedWebTransportHttp3Client::DoLoop,
                                      base::Unretained(this)));
diff --git a/net/quic/dedicated_web_transport_http3_client_test.cc b/net/quic/dedicated_web_transport_http3_client_test.cc
index 0640cf9b..6a16be5 100644
--- a/net/quic/dedicated_web_transport_http3_client_test.cc
+++ b/net/quic/dedicated_web_transport_http3_client_test.cc
@@ -49,6 +49,7 @@
               (scoped_refptr<HttpResponseHeaders>),
               (override));
   MOCK_METHOD(void, OnConnectionFailed, (const WebTransportError&), (override));
+  MOCK_METHOD(void, OnBeforeConnect, (const IPEndPoint&), (override));
   MOCK_METHOD(void,
               OnClosed,
               (const std::optional<WebTransportCloseInfo>&),
@@ -211,6 +212,7 @@
       GetURL("/echo"), origin_, &visitor_, anonymization_key_, context_.get(),
       WebTransportParameters());
 
+  EXPECT_CALL(visitor_, OnBeforeConnect);
   EXPECT_CALL(visitor_, OnConnected).WillOnce(StopRunning());
   client_->Connect();
   Run();
@@ -252,6 +254,7 @@
       GetURL("/echo"), origin_, &visitor_, anonymization_key_, context_.get(),
       WebTransportParameters());
 
+  EXPECT_CALL(visitor_, OnBeforeConnect);
   EXPECT_CALL(visitor_, OnConnected).WillOnce(StopRunning());
   client_->Connect();
   Run();
@@ -278,6 +281,7 @@
       GetURL("/session-close"), origin_, &visitor_, anonymization_key_,
       context_.get(), WebTransportParameters());
 
+  EXPECT_CALL(visitor_, OnBeforeConnect);
   EXPECT_CALL(visitor_, OnConnected).WillOnce(StopRunning());
   client_->Connect();
   Run();
diff --git a/net/quic/web_transport_client.h b/net/quic/web_transport_client.h
index 7b7e187..d67e90f 100644
--- a/net/quic/web_transport_client.h
+++ b/net/quic/web_transport_client.h
@@ -22,6 +22,7 @@
 
 class HttpResponseHeaders;
 class URLRequestContext;
+class IPEndPoint;
 
 // Diagram of allowed state transitions:
 //
@@ -75,6 +76,7 @@
 
   // State change notifiers.
   // CONNECTING -> CONNECTED
+  virtual void OnBeforeConnect(const IPEndPoint& server_address) = 0;
   virtual void OnConnected(
       scoped_refptr<HttpResponseHeaders> response_headers) = 0;
   // CONNECTING -> FAILED
diff --git a/remoting/host/clipboard_mac.mm b/remoting/host/clipboard_mac.mm
index 6902ee26..8f72664 100644
--- a/remoting/host/clipboard_mac.mm
+++ b/remoting/host/clipboard_mac.mm
@@ -10,23 +10,18 @@
 #include <memory>
 #include <utility>
 
+#include "base/callback_list.h"
+#include "base/functional/bind.h"
 #include "base/logging.h"
+#include "base/mac/pasteboard_changed_observation.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/timer/timer.h"
 #include "remoting/base/constants.h"
 #include "remoting/base/util.h"
 #include "remoting/proto/event.pb.h"
 #include "remoting/protocol/clipboard_stub.h"
 
-namespace {
-
-// Clipboard polling interval in milliseconds.
-const int64_t kClipboardPollingIntervalMs = 500;
-
-}  // namespace
-
 namespace remoting {
 
 class ClipboardMac : public Clipboard {
@@ -43,10 +38,10 @@
   void InjectClipboardEvent(const protocol::ClipboardEvent& event) override;
 
  private:
-  void CheckClipboardForChanges();
+  void ClipboardChanged();
 
   std::unique_ptr<protocol::ClipboardStub> client_clipboard_;
-  std::unique_ptr<base::RepeatingTimer> clipboard_polling_timer_;
+  base::CallbackListSubscription clipboard_change_subscription_;
   NSInteger current_change_count_ = 0;
 };
 
@@ -57,17 +52,13 @@
 void ClipboardMac::Start(
     std::unique_ptr<protocol::ClipboardStub> client_clipboard) {
   client_clipboard_ = std::move(client_clipboard);
-
-  // Synchronize local change-count with the pasteboard's. The change-count is
-  // used to detect clipboard changes.
   current_change_count_ = NSPasteboard.generalPasteboard.changeCount;
 
-  // macOS doesn't provide a clipboard-changed notification. The only way to
-  // detect clipboard changes is by polling.
-  clipboard_polling_timer_ = std::make_unique<base::RepeatingTimer>();
-  clipboard_polling_timer_->Start(
-      FROM_HERE, base::Milliseconds(kClipboardPollingIntervalMs), this,
-      &ClipboardMac::CheckClipboardForChanges);
+  // Unretained is safe because the subscription's lifetime is scoped to the
+  // lifetime of this object.
+  clipboard_change_subscription_ =
+      base::RegisterPasteboardChangedCallback(base::BindRepeating(
+          &ClipboardMac::ClipboardChanged, base::Unretained(this)));
 }
 
 void ClipboardMac::InjectClipboardEvent(const protocol::ClipboardEvent& event) {
@@ -87,21 +78,20 @@
   [pasteboard writeObjects:@[ text ]];
 
   // Update local change-count to prevent this change from being picked up by
-  // CheckClipboardForChanges.
+  // ClipboardChanged().
   current_change_count_ = NSPasteboard.generalPasteboard.changeCount;
 }
 
-void ClipboardMac::CheckClipboardForChanges() {
+void ClipboardMac::ClipboardChanged() {
   NSPasteboard* pasteboard = NSPasteboard.generalPasteboard;
   NSInteger change_count = pasteboard.changeCount;
   if (change_count == current_change_count_) {
     return;
   }
-  current_change_count_ = change_count;
 
   NSArray* objects = [pasteboard readObjectsForClasses:@[ [NSString class] ]
                                                options:nil];
-  if (![objects count]) {
+  if (!objects.count) {
     return;
   }
 
diff --git a/services/network/public/BUILD.gn b/services/network/public/BUILD.gn
index aa41f28..cd5c926d 100644
--- a/services/network/public/BUILD.gn
+++ b/services/network/public/BUILD.gn
@@ -9,7 +9,7 @@
     # External code should depend on ":features_java" instead.
     visibility = [ ":*" ]
     sources = [ "cpp/features.cc" ]
-    template = "java/src/org/chromium/services/network/public/NetworkServiceFeatures.java.tmpl"
+    class_name = "org.chromium.services.network.NetworkServiceFeatures"
   }
 
   android_library("features_java") {
diff --git a/services/network/public/java/src/org/chromium/services/network/public/NetworkServiceFeatures.java.tmpl b/services/network/public/java/src/org/chromium/services/network/public/NetworkServiceFeatures.java.tmpl
deleted file mode 100644
index 5cd717e4..0000000
--- a/services/network/public/java/src/org/chromium/services/network/public/NetworkServiceFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.services.network;
-
-/**
- * Contains features that are specific to Network Service.
- */
-public final class NetworkServiceFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Do not instantiate this class.
-    private NetworkServiceFeatures() {{}}
-}}
diff --git a/services/network/public/mojom/web_transport.mojom b/services/network/public/mojom/web_transport.mojom
index 04c98923..8721626 100644
--- a/services/network/public/mojom/web_transport.mojom
+++ b/services/network/public/mojom/web_transport.mojom
@@ -6,6 +6,7 @@
 
 import "mojo/public/mojom/base/read_only_buffer.mojom";
 import "mojo/public/mojom/base/time.mojom";
+import "services/network/public/mojom/ip_endpoint.mojom";
 import "services/network/public/mojom/network_param.mojom";
 
 // Represents a WebTransport error.
@@ -180,6 +181,11 @@
 // which ensures that a WebTransportHandshakeClient implemented in renderers
 // doesn't see such information.
 interface WebTransportHandshakeClient {
+  // Called before the handshake starts, to collect information about the
+  // target server that can be used later for implementing throttling
+  // strategies.
+  OnBeforeConnect(IPEndPoint server_address);
+
   // Called when the handshake succeeds.
   OnConnectionEstablished(pending_remote<WebTransport> transport,
                           pending_receiver<WebTransportClient> client,
diff --git a/services/network/web_transport.cc b/services/network/web_transport.cc
index c9f92dfe..b2111c0 100644
--- a/services/network/web_transport.cc
+++ b/services/network/web_transport.cc
@@ -568,6 +568,18 @@
   transport_->CloseIfNonceMatches(nonce);
 }
 
+void WebTransport::OnBeforeConnect(const net::IPEndPoint& server_address) {
+  if (torn_down_ || closing_) {
+    return;
+  }
+
+  DCHECK(handshake_client_);
+
+  // Here we assume that the server_address is not going to handed to the
+  // initiator renderer.
+  handshake_client_->OnBeforeConnect(server_address);
+}
+
 void WebTransport::OnConnected(
     scoped_refptr<net::HttpResponseHeaders> response_headers) {
   if (torn_down_ || closing_) {
diff --git a/services/network/web_transport.h b/services/network/web_transport.h
index 4e82421a..55455a4 100644
--- a/services/network/web_transport.h
+++ b/services/network/web_transport.h
@@ -72,6 +72,7 @@
   void Close(mojom::WebTransportCloseInfoPtr close_info) override;
 
   // WebTransportClientVisitor implementation:
+  void OnBeforeConnect(const net::IPEndPoint& server_address) override;
   void OnConnected(
       scoped_refptr<net::HttpResponseHeaders> response_headers) override;
   void OnConnectionFailed(const net::WebTransportError& error) override;
diff --git a/services/network/web_transport_unittest.cc b/services/network/web_transport_unittest.cc
index 71de20e..88b405b5 100644
--- a/services/network/web_transport_unittest.cc
+++ b/services/network/web_transport_unittest.cc
@@ -147,6 +147,8 @@
   }
   ~TestHandshakeClient() override = default;
 
+  void OnBeforeConnect(const net::IPEndPoint& server_address) override {}
+
   void OnConnectionEstablished(
       mojo::PendingRemote<mojom::WebTransport> transport,
       mojo::PendingReceiver<mojom::WebTransportClient> client_receiver,
diff --git a/services/on_device_model/public/cpp/model_assets.cc b/services/on_device_model/public/cpp/model_assets.cc
index 7a5509f..64a20a9a 100644
--- a/services/on_device_model/public/cpp/model_assets.cc
+++ b/services/on_device_model/public/cpp/model_assets.cc
@@ -36,7 +36,6 @@
     base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_ASYNC |
     base::File::FLAG_WIN_SEQUENTIAL_SCAN;
 constexpr uint32_t kCacheFlags = base::File::FLAG_OPEN | base::File::FLAG_READ |
-                                 base::File::FLAG_ASYNC |
                                  base::File::FLAG_WRITE;
 #endif
 
diff --git a/services/tracing/public/BUILD.gn b/services/tracing/public/BUILD.gn
index e4d1225..183ab66 100644
--- a/services/tracing/public/BUILD.gn
+++ b/services/tracing/public/BUILD.gn
@@ -9,7 +9,7 @@
     # External code should depend on ":features_java" instead.
     visibility = [ ":*" ]
     sources = [ "cpp/tracing_features.cc" ]
-    template = "java/src/org/chromium/services/network/public/TracingServiceFeatures.java.tmpl"
+    class_name = "org.chromium.services.tracing.TracingServiceFeatures"
   }
 
   android_library("features_java") {
diff --git a/services/tracing/public/java/src/org/chromium/services/network/public/TracingServiceFeatures.java.tmpl b/services/tracing/public/java/src/org/chromium/services/network/public/TracingServiceFeatures.java.tmpl
deleted file mode 100644
index 695a218..0000000
--- a/services/tracing/public/java/src/org/chromium/services/network/public/TracingServiceFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.services.tracing;
-
-/**
- * Contains features that are specific to Tracing Service.
- */
-public final class TracingServiceFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Do not instantiate this class.
-    private TracingServiceFeatures() {{}}
-}}
diff --git a/services/viz/public/mojom/compositing/layer.mojom b/services/viz/public/mojom/compositing/layer.mojom
index ef7e0f9..d3f4248 100644
--- a/services/viz/public/mojom/compositing/layer.mojom
+++ b/services/viz/public/mojom/compositing/layer.mojom
@@ -112,6 +112,12 @@
 
   // Will be set to true for PictureLayers that are backdrop filter masks.
   bool is_backdrop_filter_mask;
+
+  // Will be set to true for PictureLayers that are directly composited images.
+  bool is_directly_composited_image;
+
+  // Will be set to true for PictureLayers that use nearest neighbor filtering.
+  bool nearest_neighbor;
 };
 
 // Extra fields in a cc::ScrollbarLayerImplBase that has been added
diff --git a/storage/browser/file_system/copy_or_move_hook_delegate_composite_unittest.cc b/storage/browser/file_system/copy_or_move_hook_delegate_composite_unittest.cc
index c72b1c82..e7f7cf6 100644
--- a/storage/browser/file_system/copy_or_move_hook_delegate_composite_unittest.cc
+++ b/storage/browser/file_system/copy_or_move_hook_delegate_composite_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_forward.h"
+#include "base/functional/callback_helpers.h"
 #include "base/memory/ptr_util.h"
 #include "base/test/bind.h"
 #include "storage/browser/file_system/copy_or_move_hook_delegate.h"
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 2cbb3c6..9ca82f6 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -769,21 +769,6 @@
             ]
         }
     ],
-    "AndroidNativePagesInNewTab": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "AndroidNativePagesInNewTab"
-                    ]
-                }
-            ]
-        }
-    ],
     "AndroidPdfSummarization": [
         {
             "platforms": [
@@ -6475,9 +6460,9 @@
             ],
             "experiments": [
                 {
-                    "name": "Enabled_NoAutoFocus_PdfChunking_20250527_10pc",
+                    "name": "Enabled_AutoFocus_ApcOnly_UiUpdates_20250613",
                     "params": {
-                        "auto-focus-searchbox": "false",
+                        "auto-focus-searchbox": "true",
                         "page-content-request-id-fix": "true",
                         "pdf-text-character-limit": "5000",
                         "send-page-url-for-contextualization": "true",
@@ -6485,7 +6470,7 @@
                         "update-viewport-each-query": "true",
                         "use-apc-as-context": "true",
                         "use-inner-html-as-context": "false",
-                        "use-inner-text-as-context": "true",
+                        "use-inner-text-as-context": "false",
                         "use-pdf-interaction-type": "true",
                         "use-pdf-vit-param": "true",
                         "use-pdfs-as-context": "true",
@@ -6494,8 +6479,7 @@
                         "use-webpage-vit-param": "true"
                     },
                     "enable_features": [
-                        "LensOverlayContextualSearchbox",
-                        "LensOverlayUploadChunking"
+                        "LensOverlayContextualSearchbox"
                     ]
                 }
             ]
@@ -7480,6 +7464,25 @@
             ]
         }
     ],
+    "DbdRevampDesktop": [
+        {
+            "platforms": [
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "DbdRevampDesktop"
+                    ]
+                }
+            ]
+        }
+    ],
     "DbscPhase1aStudy": [
         {
             "platforms": [
@@ -12104,6 +12107,21 @@
             ]
         }
     ],
+    "IOSAutofillReportFormSubmissionErrors": [
+        {
+            "platforms": [
+                "ios"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "AutofillReportFormSubmissionErrors"
+                    ]
+                }
+            ]
+        }
+    ],
     "IOSAutofillThrottleDocumentFormScan": [
         {
             "platforms": [
@@ -16326,6 +16344,21 @@
             ]
         }
     ],
+    "OnDeviceStorage": [
+        {
+            "platforms": [
+                "ios"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "OnDeviceStorage"
+                    ]
+                }
+            ]
+        }
+    ],
     "OneGroupPerRenderer": [
         {
             "platforms": [
@@ -23557,21 +23590,6 @@
             ]
         }
     ],
-    "SkipParentAccessCodeForReauth": [
-        {
-            "platforms": [
-                "chromeos"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "SkipParentAccessCodeForReauth"
-                    ]
-                }
-            ]
-        }
-    ],
     "SkyVaultGA": [
         {
             "platforms": [
diff --git a/third_party/angle b/third_party/angle
index 2fd033d..0a47f44 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit 2fd033d0976456dc5baa4f7612192a7c3c8e2ae2
+Subproject commit 0a47f441faebb6286116e0503c4152719e9047ee
diff --git a/third_party/blink/common/navigation/navigation_params.cc b/third_party/blink/common/navigation/navigation_params.cc
index e19878a..d5d0e145 100644
--- a/third_party/blink/common/navigation/navigation_params.cc
+++ b/third_party/blink/common/navigation/navigation_params.cc
@@ -11,6 +11,7 @@
 mojom::CommonNavigationParamsPtr CreateCommonNavigationParams() {
   auto common_params = mojom::CommonNavigationParams::New();
   common_params->referrer = mojom::Referrer::New();
+  common_params->actual_navigation_start = base::TimeTicks::Now();
   common_params->navigation_start = base::TimeTicks::Now();
   common_params->source_location = network::mojom::SourceLocation::New();
 
diff --git a/third_party/blink/perf_tests/accessibility/many-nested-click-listeners.html b/third_party/blink/perf_tests/accessibility/many-nested-click-listeners.html
new file mode 100644
index 0000000..b5aef69
--- /dev/null
+++ b/third_party/blink/perf_tests/accessibility/many-nested-click-listeners.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <script src="../resources/runner.js"></script>
+</head>
+<body tabindex="-1">
+</body>
+
+<script>
+var isDone = false;
+var startTime;
+
+function runTest() {
+  if (startTime) {
+    PerfTestRunner.measureValueAsync(PerfTestRunner.now() - startTime);
+    PerfTestRunner.addRunTestEndMarker();
+  }
+  if (!isDone) {
+    PerfTestRunner.addRunTestStartMarker();
+    startTime = PerfTestRunner.now();
+
+    document.body.outerHTML = '';
+    appendManyElements(document.body, 6);
+
+    // Re-run the same test.
+    // Wait to allow the asynchronous accessibility code that's
+    // covered by traceEventsToMeasure to have a chance to run.
+    setTimeout(runTest, 2500);
+  }
+}
+
+// Recursively add layers of descendants.
+function appendManyElements(start, depth) {
+  if (depth == 0) {
+    start.innerHTML = '<leaf>A</leaf>';
+  }
+  else {
+    // Add a click listener to every other layer in the tree.
+    if (depth % 2 == 0) {
+      start.addEventListener('click', () => {}, true);
+      start.setAttribute('role', 'group');
+    }
+
+    // Each element receives 3 new children.
+    for (let count = 0; count < 3; count++) {
+      let newContainer = document.createElement('container');
+      appendManyElements(start.appendChild(newContainer), depth - 1);
+    }
+  }
+}
+
+
+PerfTestRunner.startMeasureValuesAsync({
+  description: 'Test accessibility performance when building trees with nested click listeners which may require hit testing.',
+  unit: 'ms',
+  done: function () {
+    isDone = true;
+  },
+  run: function() {
+    runTest();
+  },
+  iterationCount: 6,
+  tracingCategories: 'accessibility',
+  traceEventsToMeasure: [
+    'TotalAccessibilityCleanLayoutLifecycleStages',
+    'ProcessDeferredUpdatesLifecycleStage',
+    'FinalizingTreeLifecycleStage',
+    'SerializeLifecycleStage',
+    'RenderAccessibilityImpl::SendPendingAccessibilityEvents',
+    'BrowserAccessibilityManager::OnAccessibilityEvents',
+    'SerializeLocationChanges',
+    "BrowserAccessibilityManager::OnLocationChanges"
+  ]
+});
+</script>
+
+</html>
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h
index 22272e6..eee2a8d 100644
--- a/third_party/blink/public/platform/platform.h
+++ b/third_party/blink/public/platform/platform.h
@@ -751,6 +751,21 @@
       scoped_refptr<base::SingleThreadTaskRunner> owner_task_runner,
       bool is_on_worker);
 
+  // Navigation Metrics --------------------------------------------------
+
+  // Record the start/end time when creating a set of child RemoteFrames/proxies
+  // for a particular frame tree. `navigation_metrics_token` identifies the
+  // navigation responsible for creating the remote children, if any. This is
+  // used for tracing, to construct a holistic view of events pertaining to a
+  // navigation. If a navigation requires proxies to be created for several
+  // frame trees (such as with openers), this may be called several times for
+  // the same navigation token. In this case, multiple trace events will be
+  // created, each representing one processed IPC.
+  virtual void AddCreateRemoteChildrenEvent(
+      const std::optional<base::UnguessableToken>& navigation_metrics_token,
+      const base::TimeTicks& start_time,
+      const base::TimeDelta& elapsed_time) {}
+
   // GpuVideoAcceleratorFactories --------------------------------------
 
   virtual media::GpuVideoAcceleratorFactories* GetGpuFactories() {
diff --git a/third_party/blink/renderer/build/scripts/templates/runtime_feature_state_read_context.h.tmpl b/third_party/blink/renderer/build/scripts/templates/runtime_feature_state_read_context.h.tmpl
index a8e510f..2da8181 100644
--- a/third_party/blink/renderer/build/scripts/templates/runtime_feature_state_read_context.h.tmpl
+++ b/third_party/blink/renderer/build/scripts/templates/runtime_feature_state_read_context.h.tmpl
@@ -9,6 +9,7 @@
 #include "base/containers/flat_map.h"
 #include "base/containers/span.h"
 #include "base/notreached.h"
+#include "base/types/pass_key.h"
 #include "third_party/blink/public/common/common_export.h"
 #include "third_party/blink/public/common/origin_trials/origin_trials.h"
 #include "third_party/blink/public/common/origin_trials/trial_token_result.h"
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.cc b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
index 04893c3..d18ffc3 100644
--- a/third_party/blink/renderer/core/css/resolver/style_cascade.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
@@ -1703,20 +1703,13 @@
   // a bit further down in the function.
   HeapHashMap<String, Member<CSSVariableData>> function_arguments;
   HeapHashMap<String, Member<CSSVariableData>> unresolved_defaults;
-  HashMap<String, const CSSSyntaxDefinition*> default_types;
-
-  auto insert_default = [&unresolved_defaults, &default_types](
-                            const StyleRuleFunction::Parameter& parameter) {
-    DCHECK(parameter.default_value);
-    unresolved_defaults.insert(parameter.name, parameter.default_value);
-    if (!parameter.type.IsUniversal()) {
-      default_types.insert(parameter.name, &parameter.type);
-    }
-  };
+  HashMap<String, const CSSSyntaxDefinition*> local_types;
 
   bool first_parameter = true;
   for (const StyleRuleFunction::Parameter& parameter :
        function->GetParameters()) {
+    local_types.insert(parameter.name, &parameter.type);
+
     stream.ConsumeWhitespace();
 
     if (!stream.AtEnd() &&
@@ -1754,8 +1747,8 @@
       // twice. This is wasteful, and it's possible that we should do something
       // about it if it proves to be a common case.
       argument_data =
-          ResolveFunctionExpression(*argument_data, tree_scope, &parameter.type,
-                                    resolver, context, function_context);
+          ResolveTypedExpression(*argument_data, tree_scope, &parameter.type,
+                                 resolver, context, function_context);
 
       // An argument generally "captures" a failed resolution, without
       // propagation to the outer declaration; if e.g. a var() reference fails,
@@ -1763,7 +1756,7 @@
       if (argument_data) {
         function_arguments.insert(parameter.name, argument_data);
       } else if (parameter.default_value) {
-        insert_default(parameter);
+        unresolved_defaults.insert(parameter.name, parameter.default_value);
       } else {
         // An explicit nullptr is needed for shadowing; even if an argument
         // did not resolve successfully, we should not be able to reach
@@ -1771,7 +1764,7 @@
         function_arguments.insert(parameter.name, nullptr);
       }
     } else if (parameter.default_value) {
-      insert_default(parameter);
+      unresolved_defaults.insert(parameter.name, parameter.default_value);
     } else {
       // Argument was missing, with no default.
       return false;
@@ -1800,7 +1793,7 @@
         .arguments = function_arguments,
         .locals = {},  // Populated by ApplyLocalVariables.
         .unresolved_locals = unresolved_defaults,
-        .local_types = default_types,
+        .local_types = local_types,
         .parent = function_context};
 
     ApplyLocalVariables(resolver, context, default_context);
@@ -1833,9 +1826,6 @@
     return false;
   }
 
-  // Always empty; local variables are untyped.
-  HashMap<String, const CSSSyntaxDefinition*> local_types;
-
   FunctionContext local_function_context{
       .function = *function,
       .tree_scope = function_tree_scope,
@@ -1852,12 +1842,13 @@
     return false;
   }
 
-  CSSVariableData* ret_data = ResolveFunctionExpression(
+  CSSVariableData* ret_data = ResolveTypedExpression(
       *unresolved_result, function_tree_scope, &function->GetReturnType(),
       resolver, context, &local_function_context);
   if (ret_data == nullptr) {
     return false;
   }
+
   DCHECK(!ret_data->NeedsVariableResolution());
   return out.Append(ret_data, ret_data->IsAttrTainted(),
                     CSSVariableData::kMaxVariableBytes);
@@ -1913,7 +1904,7 @@
   return false;
 }
 
-// Resolves an expression within a function; in practice, either a function
+// Resolves a typed expression; in practice, either a function
 // argument or its return value. In practice, this is about taking a string
 // and coercing it into the given type -- and then the caller will convert it
 // right back to a string again. This is pretty suboptimal, but it's the way
@@ -1921,7 +1912,7 @@
 // (which needs a type), we would not be able to collapse calc() expressions
 // and similar, which could cause massive blowup as the values are passed
 // through a large tree of function calls.
-CSSVariableData* StyleCascade::ResolveFunctionExpression(
+CSSVariableData* StyleCascade::ResolveTypedExpression(
     CSSVariableData& unresolved,
     const TreeScope* tree_scope,
     const CSSSyntaxDefinition* type,
@@ -1955,6 +1946,23 @@
       *value, data->IsAnimationTainted(), data->IsAttrTainted());
 }
 
+const CSSSyntaxDefinition* StyleCascade::FindVariableType(
+    const AtomicString& name,
+    FunctionContext* function_context) {
+  for (FunctionContext* frame = function_context; frame;
+       frame = frame->parent) {
+    if (const CSSSyntaxDefinition* type =
+            FindOrNull(frame->local_types, name)) {
+      return type;
+    }
+  }
+  if (const PropertyRegistration* registration = PropertyRegistration::From(
+          GetDocument().GetExecutionContext(), name)) {
+    return &registration->Syntax();
+  }
+  return nullptr;
+}
+
 void StyleCascade::ApplyLocalVariables(CascadeResolver& resolver,
                                        const CSSParserContext& context,
                                        FunctionContext& function_context) {
@@ -2016,8 +2024,8 @@
   }
   CascadeResolver::AutoLock lock(cycle_node, resolver);
   CSSVariableData* resolved =
-      ResolveFunctionExpression(unresolved, function_context.tree_scope, type,
-                                resolver, context, &function_context);
+      ResolveTypedExpression(unresolved, function_context.tree_scope, type,
+                             resolver, context, &function_context);
 
   if (!resolved) {
     return nullptr;
@@ -2030,16 +2038,8 @@
   //
   // https://drafts.csswg.org/css-mixins-1/#resolve-function-styles
   if (const CSSValue* css_wide = ParseAsCSSWideKeyword(*resolved)) {
-    if (css_wide->IsInitialValue()) {
-      return FindOrNullopt(function_context.arguments, name).value_or(nullptr);
-    }
-    if (css_wide->IsInheritedValue()) {
-      // The inherited value is whatever var(`name`) would resolve to
-      // in the parent stack frame.
-      return ResolveLikeVar(name, resolver, context, function_context.parent);
-    }
-    // Other CSS-wide keywords (e.g. 'revert') are invalid.
-    return nullptr;
+    return GetKeywordVariableData(name, *css_wide, resolver, context,
+                                  &function_context);
   }
 
   return resolved;
@@ -2285,53 +2285,57 @@
                            /* stop_type */ kCommaToken, out);
 }
 
-bool StyleCascade::EvalIfInitial(CSSVariableData* value,
-                                 const CustomProperty& property) {
-  if (!property.IsRegistered()) {
-    return !value;
-  }
+CSSVariableData* StyleCascade::GetInitialVariableData(
+    const CustomProperty& property) {
   const StyleInitialData* initial_data = state_.StyleBuilder().InitialData();
   DCHECK(initial_data);
-  CSSVariableData* initial_variable_data =
-      initial_data->GetVariableData(property.GetPropertyNameAtomicString());
-  return value->EqualsIgnoringAttrTainting(*initial_variable_data);
+  return initial_data->GetVariableData(property.GetPropertyNameAtomicString());
 }
 
-bool StyleCascade::EvalIfInherit(CSSVariableData* value,
-                                 const CustomProperty& property) {
+CSSVariableData* StyleCascade::GetInheritedVariableData(
+    const CustomProperty& property) {
   if (!state_.ParentStyle()) {
-    return EvalIfInitial(value, property);
+    return GetInitialVariableData(property);
   }
-
-  bool is_inherited_property = property.IsInherited();
-
-  CSSVariableData* parent_data = state_.ParentStyle()->GetVariableData(
-      property.GetPropertyNameAtomicString(), is_inherited_property);
-
-  return value->EqualsIgnoringAttrTainting(*parent_data);
+  return state_.ParentStyle()->GetVariableData(
+      property.GetPropertyNameAtomicString());
 }
 
-bool StyleCascade::EvalIfKeyword(const CSSValue& keyword_value,
-                                 CSSVariableData* value,
-                                 const CustomProperty& property) {
-  if (keyword_value.IsInitialValue()) {
-    return EvalIfInitial(value, property);
-  }
-
-  if (keyword_value.IsInheritedValue()) {
-    return EvalIfInherit(value, property);
-  }
-
-  if (keyword_value.IsUnsetValue()) {
-    if (state_.IsInheritedForUnset(property)) {
-      return EvalIfInherit(value, property);
-    } else {
-      return EvalIfInitial(value, property);
+CSSVariableData* StyleCascade::GetKeywordVariableData(
+    const AtomicString& name,
+    const CSSValue& keyword_value,
+    CascadeResolver& resolver,
+    const CSSParserContext& context,
+    FunctionContext* function_context) {
+  if (function_context) {
+    // https://drafts.csswg.org/css-mixins-1/#resolve-function-styles
+    if (keyword_value.IsInitialValue()) {
+      return FindOrNullopt(function_context->arguments, name).value_or(nullptr);
+    }
+    if (keyword_value.IsInheritedValue()) {
+      // The inherited value is whatever var(`name`) would resolve to
+      // in the parent stack frame.
+      return ResolveLikeVar(name, resolver, context, function_context->parent);
+    }
+    // "All other CSS-wide keywords resolve to the guaranteed-invalid value."
+  } else {
+    CustomProperty property(name, GetDocument());
+    if (keyword_value.IsInitialValue()) {
+      return GetInitialVariableData(property);
+    }
+    if (keyword_value.IsInheritedValue()) {
+      return GetInheritedVariableData(property);
+    }
+    if (keyword_value.IsUnsetValue()) {
+      if (state_.IsInheritedForUnset(property)) {
+        return GetInheritedVariableData(property);
+      } else {
+        return GetInitialVariableData(property);
+      }
     }
   }
-
   // revert and revert-layer keywords
-  return false;
+  return nullptr;
 }
 
 const CSSValue* StyleCascade::CoerceIntoNumericValue(
@@ -2482,7 +2486,6 @@
   DCHECK(bounds.right.op == MediaQueryOperator::kNone);
 
   AtomicString property_name(feature.Name());
-  CustomProperty property(property_name, GetDocument());
 
   CSSVariableData* computed_data =
       ResolveLikeVar(property_name, resolver, context, function_context);
@@ -2501,44 +2504,33 @@
 
   const CSSValue& query_specified = bounds.right.value.GetCSSValue();
 
+  CSSVariableData* computed_query_data = nullptr;
+
   if (query_specified.IsCSSWideKeyword()) {
-    return EvalIfKeyword(query_specified, computed_data, property)
-               ? KleeneValue::kTrue
-               : KleeneValue::kFalse;
-  }
-
-  if (!computed_data) {
-    return KleeneValue::kFalse;
-  }
-
-  const auto& decl_value = To<CSSUnparsedDeclarationValue>(query_specified);
-
-  CSSParserTokenStream decl_value_stream(
-      decl_value.VariableDataValue()->OriginalText());
-  TokenSequence substituted_token_sequence;
-  if (!ResolveTokensInto(
-          decl_value_stream, tree_scope, resolver, context, function_context,
-          /* stop_type */ kEOFToken, substituted_token_sequence)) {
-    return KleeneValue::kFalse;
-  }
-
-  CSSVariableData* computed_query_data =
-      substituted_token_sequence.BuildVariableData();
-
-  if (property.IsRegistered()) {
-    const CSSValue* parsed_value =
-        property.Parse(substituted_token_sequence.OriginalText(), context,
-                       CSSParserLocalContext());
-    if (!parsed_value) {
+    // Cascade-dependent keywords are not valid here.
+    // https://drafts.csswg.org/css-cascade-5/#cascade-dependent-keyword
+    if (query_specified.IsRevertValue() ||
+        query_specified.IsRevertLayerValue()) {
       return KleeneValue::kFalse;
     }
-    const CSSValue& computed_query_value =
-        StyleBuilderConverter::ConvertRegisteredPropertyValue(
-            state_, *parsed_value, decl_value.ParserContext());
+    computed_query_data = GetKeywordVariableData(
+        property_name, query_specified, resolver, context, function_context);
+    if (!computed_data && !computed_query_data) {
+      // A CSS-wide keyword was used to query for <guaranteed-invalid>,
+      // e.g. style(--x:initial).
+      return KleeneValue::kTrue;
+    }
+  } else {
+    const auto& decl_value = To<CSSUnparsedDeclarationValue>(query_specified);
+    const CSSSyntaxDefinition* type =
+        FindVariableType(property_name, function_context);
     computed_query_data =
-        StyleBuilderConverter::ConvertRegisteredPropertyVariableData(
-            computed_query_value, /* is_animation_tainted */ false,
-            computed_query_data->IsAttrTainted());
+        ResolveTypedExpression(*decl_value.VariableDataValue(), tree_scope,
+                               type, resolver, context, function_context);
+  }
+
+  if (!computed_data || !computed_query_data) {
+    return KleeneValue::kFalse;
   }
 
   if (computed_query_data->IsAttrTainted()) {
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.h b/third_party/blink/renderer/core/css/resolver/style_cascade.h
index 835af88..c55eb2c 100644
--- a/third_party/blink/renderer/core/css/resolver/style_cascade.h
+++ b/third_party/blink/renderer/core/css/resolver/style_cascade.h
@@ -549,11 +549,20 @@
                                  const CSSParserContext& context,
                                  FunctionContext*,
                                  bool& is_attr_tainted);
-  bool EvalIfKeyword(const CSSValue& value,
-                     CSSVariableData* query_value,
-                     const CustomProperty& property);
-  bool EvalIfInitial(CSSVariableData* value, const CustomProperty& property);
-  bool EvalIfInherit(CSSVariableData* value, const CustomProperty& property);
+
+  CSSVariableData* GetInitialVariableData(const CustomProperty&);
+  CSSVariableData* GetInheritedVariableData(const CustomProperty&);
+  // For a given variable name (which may either be a local variable or a custom
+  // property), get the value corresponding to the specified CSS-wide keyword.
+  // For example, passing a parameter name of '--x' and keyword_value
+  // of 'inherit' results in the inherited value of '--x'.
+  // Returns nullptr for cascade-dependent keywords (revert/revert-layer).
+  CSSVariableData* GetKeywordVariableData(const AtomicString& name,
+                                          const CSSValue& keyword_value,
+                                          CascadeResolver&,
+                                          const CSSParserContext&,
+                                          FunctionContext*);
+
   const CSSValue* CoerceIntoNumericValueInternal(
       const CSSUnparsedDeclarationValue&,
       const TreeScope*,
@@ -593,12 +602,18 @@
                               FunctionContext*,
                               TokenSequence& out);
 
-  CSSVariableData* ResolveFunctionExpression(CSSVariableData& unresolved,
-                                             const TreeScope*,
-                                             const CSSSyntaxDefinition* type,
-                                             CascadeResolver&,
-                                             const CSSParserContext&,
-                                             FunctionContext*);
+  CSSVariableData* ResolveTypedExpression(CSSVariableData& unresolved,
+                                          const TreeScope*,
+                                          const CSSSyntaxDefinition* type,
+                                          CascadeResolver&,
+                                          const CSSParserContext&,
+                                          FunctionContext*);
+
+  // Find the type associated with a given local variable (or custom property).
+  // The return value may be a pointer directly into a PropertyRegistration;
+  // registrations must remain stable while that pointer is held.
+  const CSSSyntaxDefinition* FindVariableType(const AtomicString& name,
+                                              FunctionContext*);
 
   // Application of Local Variables
   // ==============================
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.h b/third_party/blink/renderer/core/frame/local_dom_window.h
index 28640c3a..da73e12 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.h
+++ b/third_party/blink/renderer/core/frame/local_dom_window.h
@@ -335,10 +335,7 @@
   void scrollBy(const ScrollToOptions*) const;
   void scrollTo(double x, double y) const;
   void scrollTo(const ScrollToOptions*) const;
-  void scroll(double x, double y) const { scrollTo(x, y); }
-  void scroll(const ScrollToOptions* scroll_to_options) const {
-    scrollTo(scroll_to_options);
-  }
+
   void moveBy(int x, int y) const;
   void moveTo(int x, int y) const;
 
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc
index b2c0a2f7..38ec4afa 100644
--- a/third_party/blink/renderer/core/frame/remote_frame.cc
+++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/frame/remote_frame.h"
 
+#include "base/timer/elapsed_timer.h"
 #include "base/types/optional_util.h"
 #include "cc/layers/surface_layer.h"
 #include "services/network/public/cpp/permissions_policy/permissions_policy_declaration.h"
@@ -1168,7 +1169,11 @@
 void RemoteFrame::CreateRemoteChildren(
     Vector<mojom::blink::CreateRemoteChildParamsPtr> params,
     const std::optional<base::UnguessableToken>& navigation_metrics_token) {
+  base::ElapsedTimer timer;
   Client()->CreateRemoteChildren(params);
+  Platform::Current()->AddCreateRemoteChildrenEvent(
+      navigation_metrics_token, timer.start_time(), timer.Elapsed());
+  // Add any new code above the AddCreateRemoteChildrenEvent call.
 }
 
 void RemoteFrame::ForwardFencedFrameEventToEmbedder(
diff --git a/third_party/blink/renderer/core/frame/window.idl b/third_party/blink/renderer/core/frame/window.idl
index 1e47b0e..32d0245 100644
--- a/third_party/blink/renderer/core/frame/window.idl
+++ b/third_party/blink/renderer/core/frame/window.idl
@@ -135,8 +135,8 @@
     [HighEntropy=Direct, MeasureAs=WindowPageXOffset, Replaceable] readonly attribute double pageXOffset;
     [HighEntropy=Direct, MeasureAs=WindowScrollY, Replaceable] readonly attribute double scrollY;
     [HighEntropy=Direct, MeasureAs=WindowPageYOffset, Replaceable] readonly attribute double pageYOffset;
-    void scroll(optional ScrollToOptions options = {});
-    void scroll(unrestricted double x, unrestricted double y);
+    [ImplementedAs=scrollTo] void scroll(optional ScrollToOptions options = {});
+    [ImplementedAs=scrollTo] void scroll(unrestricted double x, unrestricted double y);
     void scrollTo(optional ScrollToOptions options = {});
     void scrollTo(unrestricted double x, unrestricted double y);
     void scrollBy(optional ScrollToOptions options = {});
diff --git a/third_party/blink/renderer/core/html/html_permission_element.cc b/third_party/blink/renderer/core/html/html_permission_element.cc
index 33dc8d6..43204f7 100644
--- a/third_party/blink/renderer/core/html/html_permission_element.cc
+++ b/third_party/blink/renderer/core/html/html_permission_element.cc
@@ -842,6 +842,11 @@
     builder.SetWordSpacing(0);
   }
 
+  if (builder.GetDisplayStyle().Display() != EDisplay::kNone &&
+      builder.GetDisplayStyle().Display() != EDisplay::kInlineBlock) {
+    builder.SetDisplay(EDisplay::kInlineBlock);
+  }
+
   if (builder.GetFontDescription().LetterSpacing() >
       kMaximumLetterSpacingToFontSizeRatio * builder.FontSize()) {
     builder.SetLetterSpacing(Length::Fixed(
@@ -1495,26 +1500,14 @@
 }
 
 bool HTMLPermissionElement::IsStyleValid() {
-  const ComputedStyle* style = GetComputedStyle();
-
   // No computed style when using `display: none`.
-  if (!style) {
+  if (!GetComputedStyle()) {
     base::UmaHistogramEnumeration("Blink.PermissionElement.InvalidStyleReason",
                                   InvalidStyleReason::kNoComputedStyle);
     return false;
   }
 
-  if (style->GetDisplayStyle().Display() != EDisplay::kNone &&
-      style->GetDisplayStyle().Display() != EDisplay::kInlineBlock) {
-    AddConsoleWarning(StrCat(
-        {"Invalid display style of the permission element ", GetType(),
-         ". Only 'display: inline-block' or 'display: none' is allowed"}));
-    base::UmaHistogramEnumeration("Blink.PermissionElement.InvalidStyleReason",
-                                  InvalidStyleReason::kInvalidDisplayProperty);
-    return false;
-  }
-
-  if (AreColorsNonOpaque(style)) {
+  if (AreColorsNonOpaque(GetComputedStyle())) {
     AddConsoleWarning(
         StrCat({"Color or background color of the permission element '",
                 GetType(), "' is non-opaque"}));
@@ -1524,7 +1517,8 @@
     return false;
   }
 
-  if (ContrastBetweenColorAndBackgroundColor(style) < kMinimumAllowedContrast) {
+  if (ContrastBetweenColorAndBackgroundColor(GetComputedStyle()) <
+      kMinimumAllowedContrast) {
     AddConsoleWarning(
         StrCat({"Contrast between color and background color of the permission "
                 "element '",
@@ -1547,9 +1541,11 @@
       GetDocument().GetFrame()->LocalFrameRoot().LayoutZoomFactor() /
       GetDocument().GetFrame()->LocalFrameRoot().CssZoomFactor();
 
-  float font_size_dip = style->ComputedFontSize() / non_css_layout_zoom_factor;
+  float font_size_dip =
+      GetComputedStyle()->ComputedFontSize() / non_css_layout_zoom_factor;
 
-  bool is_font_monospace = style->GetFontDescription().IsMonospace();
+  bool is_font_monospace =
+      GetComputedStyle()->GetFontDescription().IsMonospace();
 
   // The min size is what `font-size:small` looks like when rendered in the
   // document element of the local root frame, without any intervening
diff --git a/third_party/blink/renderer/core/html/html_permission_element.h b/third_party/blink/renderer/core/html/html_permission_element.h
index eeae583..a11440e6 100644
--- a/third_party/blink/renderer/core/html/html_permission_element.h
+++ b/third_party/blink/renderer/core/html/html_permission_element.h
@@ -214,9 +214,8 @@
     kLowConstrastColorAndBackgroundColor = 1,
     kTooSmallFontSize = 3,
     kTooLargeFontSize = 4,
-    kInvalidDisplayProperty = 5,
 
-    kMaxValue = kInvalidDisplayProperty,
+    kMaxValue = kTooLargeFontSize,
   };
   // LINT.ThenChange(//tools/metrics/histograms/metadata/blink/enums.xml:PermissionElementInvalidStyleReason)
 
diff --git a/third_party/blink/renderer/core/html/html_permission_element_test.cc b/third_party/blink/renderer/core/html/html_permission_element_test.cc
index be16ea0..69199e62 100644
--- a/third_party/blink/renderer/core/html/html_permission_element_test.cc
+++ b/third_party/blink/renderer/core/html/html_permission_element_test.cc
@@ -1117,31 +1117,6 @@
   checker.CheckClickingEnabled(/*enabled=*/true);
 }
 
-TEST_F(HTMLPermissionElementSimTest, InvalidDisplayStyleElement) {
-  auto* permission_element = CreatePermissionElement(GetDocument(), "camera");
-  DeferredChecker checker(permission_element);
-  permission_element->setAttribute(
-      html_names::kStyleAttr,
-      AtomicString("display: block; position: absolute;"));
-  GetDocument().UpdateStyleAndLayout(DocumentUpdateReason::kTest);
-  checker.CheckClickingEnabled(/*enabled=*/false);
-  checker.CheckClickingEnabledAfterDelay(kDefaultTimeout,
-                                         /*expected_enabled=*/false);
-  EXPECT_TRUE(To<HTMLPermissionElement>(
-                  GetDocument().QuerySelector(AtomicString("permission")))
-                  ->matches(AtomicString(":invalid-style")));
-
-  permission_element->setAttribute(html_names::kStyleAttr,
-                                   AtomicString("display: inline-block;"));
-  GetDocument().UpdateStyleAndLayout(DocumentUpdateReason::kTest);
-  checker.CheckClickingEnabled(/*enabled=*/false);
-  checker.CheckClickingEnabledAfterDelay(kDefaultTimeout,
-                                         /*expected_enabled=*/true);
-  EXPECT_FALSE(To<HTMLPermissionElement>(
-                   GetDocument().QuerySelector(AtomicString("permission")))
-                   ->matches(AtomicString(":invalid-style")));
-}
-
 TEST_F(HTMLPermissionElementSimTest, BadContrastDisablesElement) {
   auto* permission_element = CreatePermissionElement(GetDocument(), "camera");
   DeferredChecker checker(permission_element);
diff --git a/third_party/blink/renderer/core/layout/build.gni b/third_party/blink/renderer/core/layout/build.gni
index da73bae..28822365 100644
--- a/third_party/blink/renderer/core/layout/build.gni
+++ b/third_party/blink/renderer/core/layout/build.gni
@@ -202,6 +202,8 @@
   "grid/grid_track_sizing_algorithm.h",
   "grid/layout_grid.cc",
   "grid/layout_grid.h",
+  "grid/grid_layout_utils.cc",
+  "grid/grid_layout_utils.h",
   "grid/subgrid_min_max_sizes_cache.h",
   "hit_test_cache.cc",
   "hit_test_cache.h",
diff --git a/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm.cc b/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm.cc
index 84168eb..1d9fc53 100644
--- a/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/grid/grid_layout_algorithm.cc
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/core/layout/fragmentation_utils.h"
 #include "third_party/blink/renderer/core/layout/grid/grid_break_token_data.h"
 #include "third_party/blink/renderer/core/layout/grid/grid_item.h"
+#include "third_party/blink/renderer/core/layout/grid/grid_layout_utils.h"
 #include "third_party/blink/renderer/core/layout/grid/grid_track_sizing_algorithm.h"
 #include "third_party/blink/renderer/core/layout/layout_utils.h"
 #include "third_party/blink/renderer/core/layout/length_utils.h"
@@ -24,65 +25,32 @@
 
   const auto& node = Node();
   const auto& constraint_space = GetConstraintSpace();
+  const auto border_scrollbar_padding = BorderScrollbarPadding();
 
   // At various stages of the algorithm we need to know the grid available-size.
   // If it's initially indefinite, we need to know the min/max sizes as well.
   // Initialize all these to the same value.
   grid_available_size_ = grid_min_available_size_ = grid_max_available_size_ =
       ChildAvailableSize();
+  ComputeAvailableSizes(border_scrollbar_padding, node, constraint_space,
+                        container_builder_, grid_available_size_,
+                        grid_min_available_size_, grid_max_available_size_);
 
-  // If our inline-size is indefinite, compute the min/max inline-sizes.
-  if (grid_available_size_.inline_size == kIndefiniteSize) {
-    const LayoutUnit border_scrollbar_padding =
-        BorderScrollbarPadding().InlineSum();
+  // If block-size containment applies compute the block-size ignoring
+  // children (just based on the row definitions).
+  if (grid_available_size_.block_size == kIndefiniteSize &&
+      node.ShouldApplyBlockSizeContainment()) {
+    contain_intrinsic_block_size_ = ComputeIntrinsicBlockSizeIgnoringChildren();
 
-    const MinMaxSizes sizes = ComputeMinMaxInlineSizes(
-        constraint_space, node, container_builder_.BorderPadding(),
-        /* auto_min_length */ nullptr, [](SizeType) -> MinMaxSizesResult {
-          // If we've reached here we are inside the |ComputeMinMaxSizes| pass,
-          // and also have something like "min-width: min-content". This is
-          // cyclic. Just return indefinite.
-          return {{kIndefiniteSize, kIndefiniteSize},
-                  /* depends_on_block_constraints */ false};
-        });
+    // Resolve the block-size, and set the available sizes.
+    const LayoutUnit block_size = ComputeBlockSizeForFragment(
+        constraint_space, node, BorderPadding(), *contain_intrinsic_block_size_,
+        container_builder_.InlineSize());
 
-    grid_min_available_size_.inline_size =
-        (sizes.min_size - border_scrollbar_padding).ClampNegativeToZero();
-    grid_max_available_size_.inline_size =
-        (sizes.max_size == LayoutUnit::Max())
-            ? sizes.max_size
-            : (sizes.max_size - border_scrollbar_padding).ClampNegativeToZero();
-  }
-
-  // And similar for the min/max block-sizes.
-  if (grid_available_size_.block_size == kIndefiniteSize) {
-    const LayoutUnit border_scrollbar_padding =
-        BorderScrollbarPadding().BlockSum();
-    const MinMaxSizes sizes = ComputeInitialMinMaxBlockSizes(
-        constraint_space, node, container_builder_.BorderPadding());
-
-    grid_min_available_size_.block_size =
-        (sizes.min_size - border_scrollbar_padding).ClampNegativeToZero();
-    grid_max_available_size_.block_size =
-        (sizes.max_size == LayoutUnit::Max())
-            ? sizes.max_size
-            : (sizes.max_size - border_scrollbar_padding).ClampNegativeToZero();
-
-    // If block-size containment applies compute the block-size ignoring
-    // children (just based on the row definitions).
-    if (node.ShouldApplyBlockSizeContainment()) {
-      contain_intrinsic_block_size_ =
-          ComputeIntrinsicBlockSizeIgnoringChildren();
-
-      // Resolve the block-size, and set the available sizes.
-      const LayoutUnit block_size = ComputeBlockSizeForFragment(
-          constraint_space, node, BorderPadding(),
-          *contain_intrinsic_block_size_, container_builder_.InlineSize());
-
-      grid_available_size_.block_size = grid_min_available_size_.block_size =
-          grid_max_available_size_.block_size =
-              (block_size - border_scrollbar_padding).ClampNegativeToZero();
-    }
+    grid_available_size_.block_size = grid_min_available_size_.block_size =
+        grid_max_available_size_.block_size =
+            (block_size - border_scrollbar_padding.BlockSum())
+                .ClampNegativeToZero();
   }
 }
 
@@ -1171,110 +1139,17 @@
                                                  track_direction);
   }
 
-  LayoutUnit available_size = is_for_columns ? grid_available_size_.inline_size
-                                             : grid_available_size_.block_size;
-  LayoutUnit max_available_size = available_size;
-
-  if (available_size == kIndefiniteSize) {
-    max_available_size = is_for_columns ? grid_max_available_size_.inline_size
-                                        : grid_max_available_size_.block_size;
-    available_size = is_for_columns ? grid_min_available_size_.inline_size
-                                    : grid_min_available_size_.block_size;
-  }
-
-  LayoutUnit auto_repeater_size;
-  LayoutUnit non_auto_specified_size;
-  const auto gutter_size = GridTrackSizingAlgorithm::CalculateGutterSize(
+  const LayoutUnit gutter_size = GridTrackSizingAlgorithm::CalculateGutterSize(
       style, grid_available_size_, track_direction);
 
-  for (wtf_size_t repeater_index = 0;
-       repeater_index < track_list.RepeaterCount(); ++repeater_index) {
-    const auto repeat_type = track_list.RepeatType(repeater_index);
-    const bool is_auto_repeater =
-        repeat_type == NGGridTrackRepeater::kAutoFill ||
-        repeat_type == NGGridTrackRepeater::kAutoFit;
-
-    LayoutUnit repeater_size;
-    const wtf_size_t repeater_track_count =
-        track_list.RepeatSize(repeater_index);
-
-    for (wtf_size_t i = 0; i < repeater_track_count; ++i) {
-      const auto& track_size = track_list.RepeatTrackSize(repeater_index, i);
-
-      std::optional<LayoutUnit> fixed_min_track_breadth;
-      if (track_size.HasFixedMinTrackBreadth()) {
-        fixed_min_track_breadth.emplace(MinimumValueForLength(
-            track_size.MinTrackBreadth(), available_size));
-      }
-
-      std::optional<LayoutUnit> fixed_max_track_breadth;
-      if (track_size.HasFixedMaxTrackBreadth()) {
-        fixed_max_track_breadth.emplace(MinimumValueForLength(
-            track_size.MaxTrackBreadth(), available_size));
-      }
-
-      LayoutUnit track_contribution;
-      if (fixed_max_track_breadth && fixed_min_track_breadth) {
-        track_contribution =
-            std::max(*fixed_max_track_breadth, *fixed_min_track_breadth);
-      } else if (fixed_max_track_breadth) {
-        track_contribution = *fixed_max_track_breadth;
-      } else if (fixed_min_track_breadth) {
-        track_contribution = *fixed_min_track_breadth;
-      }
-
-      // For the purpose of finding the number of auto-repeated tracks in a
-      // standalone axis, the UA must floor the track size to a UA-specified
-      // value to avoid division by zero. It is suggested that this floor be
-      // 1px.
-      if (is_auto_repeater)
-        track_contribution = std::max(LayoutUnit(1), track_contribution);
-
-      repeater_size += track_contribution + gutter_size;
-    }
-
-    if (!is_auto_repeater) {
-      non_auto_specified_size +=
-          repeater_size * track_list.RepeatCount(repeater_index, 0);
-    } else {
-      DCHECK_EQ(0, auto_repeater_size);
-      auto_repeater_size = repeater_size;
-    }
-  }
-
-  DCHECK_GT(auto_repeater_size, 0);
-
-  // We can compute the number of repetitions by satisfying the expression
-  // below. Notice that we subtract an extra |gutter_size| since it was included
-  // in the contribution for the last set in the collection.
-  //   available_size =
-  //       (repetitions * auto_repeater_size) +
-  //       non_auto_specified_size - gutter_size
-  //
-  // Solving for repetitions we have:
-  //   repetitions =
-  //       available_size - (non_auto_specified_size - gutter_size) /
-  //       auto_repeater_size
-  non_auto_specified_size -= gutter_size;
-
-  // First we want to allow as many repetitions as possible, up to the max
-  // available-size. Only do this if we have a definite max-size.
-  // If a definite available-size was provided, |max_available_size| will be
-  // set to that value.
-  if (max_available_size != LayoutUnit::Max()) {
-    // Use floor to ensure that the auto repeater sizes goes under the max
-    // available-size.
-    const int count = FloorToInt(
-        (max_available_size - non_auto_specified_size) / auto_repeater_size);
-    return (count <= 0) ? 1u : count;
-  }
-
-  // Next, consider the min available-size, which was already used to floor
-  // |available_size|. Use ceil to ensure that the auto repeater size goes
-  // above this min available-size.
-  const int count = CeilToInt((available_size - non_auto_specified_size) /
-                              auto_repeater_size);
-  return (count <= 0) ? 1u : count;
+  return CalculateAutomaticRepetitions(
+      track_list, gutter_size,
+      is_for_columns ? grid_available_size_.inline_size
+                     : grid_available_size_.block_size,
+      is_for_columns ? grid_min_available_size_.inline_size
+                     : grid_min_available_size_.block_size,
+      is_for_columns ? grid_max_available_size_.inline_size
+                     : grid_max_available_size_.block_size);
 }
 
 wtf_size_t GridLayoutAlgorithm::ComputeAutomaticRepetitionsForSubgrid(
diff --git a/third_party/blink/renderer/core/layout/grid/grid_layout_utils.cc b/third_party/blink/renderer/core/layout/grid/grid_layout_utils.cc
new file mode 100644
index 0000000..4d919634
--- /dev/null
+++ b/third_party/blink/renderer/core/layout/grid/grid_layout_utils.cc
@@ -0,0 +1,173 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/core/layout/grid/grid_layout_utils.h"
+
+#include "third_party/blink/renderer/core/layout/block_node.h"
+#include "third_party/blink/renderer/core/layout/box_fragment_builder.h"
+#include "third_party/blink/renderer/core/layout/constraint_space.h"
+#include "third_party/blink/renderer/core/layout/geometry/box_strut.h"
+#include "third_party/blink/renderer/core/layout/geometry/logical_size.h"
+#include "third_party/blink/renderer/core/layout/length_utils.h"
+#include "third_party/blink/renderer/core/style/grid_track_list.h"
+
+namespace blink {
+
+void ComputeAvailableSizes(const BoxStrut& border_scrollbar_padding,
+                           const BlockNode& node,
+                           const ConstraintSpace& constraint_space,
+                           const BoxFragmentBuilder& container_builder,
+                           LogicalSize& available_size,
+                           LogicalSize& min_available_size,
+                           LogicalSize& max_available_size) {
+  // If our inline-size is indefinite, compute the min/max inline-sizes.
+  if (available_size.inline_size == kIndefiniteSize) {
+    const LayoutUnit border_scrollbar_padding_sum =
+        border_scrollbar_padding.InlineSum();
+
+    const MinMaxSizes sizes = ComputeMinMaxInlineSizes(
+        constraint_space, node, container_builder.BorderPadding(),
+        /*auto_min_length=*/nullptr, [](SizeType) -> MinMaxSizesResult {
+          // If we've reached here we are inside the `ComputeMinMaxSizes` pass,
+          // and also have something like "min-width: min-content". This is
+          // cyclic. Just return indefinite.
+          return {{kIndefiniteSize, kIndefiniteSize},
+                  /* depends_on_block_constraints */ false};
+        });
+
+    min_available_size.inline_size =
+        (sizes.min_size - border_scrollbar_padding_sum).ClampNegativeToZero();
+    max_available_size.inline_size =
+        (sizes.max_size == LayoutUnit::Max())
+            ? sizes.max_size
+            : (sizes.max_size - border_scrollbar_padding_sum)
+                  .ClampNegativeToZero();
+  }
+
+  // And similar for the min/max block-sizes.
+  if (available_size.block_size == kIndefiniteSize) {
+    const LayoutUnit border_scrollbar_padding_sum =
+        border_scrollbar_padding.BlockSum();
+    const MinMaxSizes sizes = ComputeInitialMinMaxBlockSizes(
+        constraint_space, node, container_builder.BorderPadding());
+
+    min_available_size.block_size =
+        (sizes.min_size - border_scrollbar_padding_sum).ClampNegativeToZero();
+    max_available_size.block_size =
+        (sizes.max_size == LayoutUnit::Max())
+            ? sizes.max_size
+            : (sizes.max_size - border_scrollbar_padding_sum)
+                  .ClampNegativeToZero();
+  }
+}
+
+wtf_size_t CalculateAutomaticRepetitions(const NGGridTrackList& track_list,
+                                         const LayoutUnit gutter_size,
+                                         LayoutUnit available_size,
+                                         LayoutUnit min_available_size,
+                                         LayoutUnit max_available_size) {
+  DCHECK(track_list.HasAutoRepeater());
+
+  if (available_size == kIndefiniteSize) {
+    available_size = min_available_size;
+  } else {
+    max_available_size = available_size;
+  }
+
+  LayoutUnit auto_repeater_size;
+  LayoutUnit non_auto_specified_size;
+  for (wtf_size_t repeater_index = 0;
+       repeater_index < track_list.RepeaterCount(); ++repeater_index) {
+    const NGGridTrackRepeater::RepeatType repeat_type =
+        track_list.RepeatType(repeater_index);
+    const bool is_auto_repeater =
+        repeat_type == NGGridTrackRepeater::kAutoFill ||
+        repeat_type == NGGridTrackRepeater::kAutoFit;
+
+    LayoutUnit repeater_size;
+    const wtf_size_t repeater_track_count =
+        track_list.RepeatSize(repeater_index);
+
+    for (wtf_size_t i = 0; i < repeater_track_count; ++i) {
+      const GridTrackSize& track_size =
+          track_list.RepeatTrackSize(repeater_index, i);
+
+      std::optional<LayoutUnit> fixed_min_track_breadth;
+      if (track_size.HasFixedMinTrackBreadth()) {
+        fixed_min_track_breadth.emplace(MinimumValueForLength(
+            track_size.MinTrackBreadth(), available_size));
+      }
+
+      std::optional<LayoutUnit> fixed_max_track_breadth;
+      if (track_size.HasFixedMaxTrackBreadth()) {
+        fixed_max_track_breadth.emplace(MinimumValueForLength(
+            track_size.MaxTrackBreadth(), available_size));
+      }
+
+      LayoutUnit track_contribution;
+      if (fixed_max_track_breadth && fixed_min_track_breadth) {
+        track_contribution =
+            std::max(*fixed_max_track_breadth, *fixed_min_track_breadth);
+      } else if (fixed_max_track_breadth) {
+        track_contribution = *fixed_max_track_breadth;
+      } else if (fixed_min_track_breadth) {
+        track_contribution = *fixed_min_track_breadth;
+      }
+
+      // For the purpose of finding the number of auto-repeated tracks in a
+      // standalone axis, the UA must floor the track size to a UA-specified
+      // value to avoid division by zero. It is suggested that this floor be
+      // 1px.
+      if (is_auto_repeater) {
+        track_contribution = std::max(LayoutUnit(1), track_contribution);
+      }
+
+      repeater_size += track_contribution + gutter_size;
+    }
+
+    if (!is_auto_repeater) {
+      non_auto_specified_size +=
+          repeater_size * track_list.RepeatCount(repeater_index, 0);
+    } else {
+      DCHECK_EQ(0, auto_repeater_size);
+      auto_repeater_size = repeater_size;
+    }
+  }
+
+  DCHECK_GT(auto_repeater_size, 0);
+
+  // We can compute the number of repetitions by satisfying the expression
+  // below. Notice that we subtract an extra |gutter_size| since it was included
+  // in the contribution for the last set in the collection.
+  //   available_size =
+  //       (repetitions * auto_repeater_size) +
+  //       non_auto_specified_size - gutter_size
+  //
+  // Solving for repetitions we have:
+  //   repetitions =
+  //       available_size - (non_auto_specified_size - gutter_size) /
+  //       auto_repeater_size
+  non_auto_specified_size -= gutter_size;
+
+  // First we want to allow as many repetitions as possible, up to the max
+  // available-size. Only do this if we have a definite max-size.
+  // If a definite available-size was provided, |max_available_size| will be
+  // set to that value.
+  if (max_available_size != LayoutUnit::Max()) {
+    // Use floor to ensure that the auto repeater sizes goes under the max
+    // available-size.
+    const int count = FloorToInt(
+        (max_available_size - non_auto_specified_size) / auto_repeater_size);
+    return (count <= 0) ? 1u : count;
+  }
+
+  // Next, consider the min available-size, which was already used to floor
+  // |available_size|. Use ceil to ensure that the auto repeater size goes
+  // above this min available-size.
+  const int count = CeilToInt((available_size - non_auto_specified_size) /
+                              auto_repeater_size);
+  return (count <= 0) ? 1u : count;
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/grid/grid_layout_utils.h b/third_party/blink/renderer/core/layout/grid/grid_layout_utils.h
new file mode 100644
index 0000000..8f8fd991
--- /dev/null
+++ b/third_party/blink/renderer/core/layout/grid/grid_layout_utils.h
@@ -0,0 +1,42 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_GRID_GRID_LAYOUT_UTILS_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_GRID_GRID_LAYOUT_UTILS_H_
+
+#include "third_party/blink/renderer/platform/geometry/layout_unit.h"
+#include "third_party/blink/renderer/platform/wtf/wtf_size_t.h"
+
+namespace blink {
+
+class BlockNode;
+class BoxFragmentBuilder;
+class ConstraintSpace;
+class NGGridTrackList;
+
+struct BoxStrut;
+struct LogicalSize;
+
+// Update the provided `available_size`, `min_available_size`, and
+// `max_available_size` to their appropriate values.
+void ComputeAvailableSizes(const BoxStrut& border_scrollbar_padding,
+                           const BlockNode& node,
+                           const ConstraintSpace& constraint_space,
+                           const BoxFragmentBuilder& container_builder,
+                           LogicalSize& available_size,
+                           LogicalSize& min_available_size,
+                           LogicalSize& max_available_size);
+
+// https://drafts.csswg.org/css-grid-2/#auto-repeat
+//
+// This method assumes that the track list provided has an auto repeater.
+wtf_size_t CalculateAutomaticRepetitions(const NGGridTrackList& track_list,
+                                         const LayoutUnit gutter_size,
+                                         LayoutUnit available_size,
+                                         LayoutUnit min_available_size,
+                                         LayoutUnit max_available_size);
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_GRID_GRID_LAYOUT_UTILS_H_
diff --git a/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.cc b/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.cc
index ee8bfed6..c6d4ba1 100644
--- a/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.cc
@@ -7,6 +7,7 @@
 #include "base/notreached.h"
 #include "third_party/blink/renderer/core/layout/disable_layout_side_effects_scope.h"
 #include "third_party/blink/renderer/core/layout/grid/grid_item.h"
+#include "third_party/blink/renderer/core/layout/grid/grid_layout_utils.h"
 #include "third_party/blink/renderer/core/layout/grid/grid_track_collection.h"
 #include "third_party/blink/renderer/core/layout/grid/grid_track_sizing_algorithm.h"
 #include "third_party/blink/renderer/core/layout/layout_utils.h"
@@ -19,6 +20,18 @@
     const LayoutAlgorithmParams& params)
     : LayoutAlgorithm(params) {
   DCHECK(params.space.IsNewFormattingContext());
+
+  // At various stages of the algorithm we need to know the masonry
+  // available-size. If it's initially indefinite, we need to know the min/max
+  // sizes as well. Initialize all these to the same value.
+  masonry_available_size_ = masonry_min_available_size_ =
+      masonry_max_available_size_ = ChildAvailableSize();
+  ComputeAvailableSizes(BorderScrollbarPadding(), Node(), GetConstraintSpace(),
+                        container_builder_, masonry_available_size_,
+                        masonry_min_available_size_,
+                        masonry_max_available_size_);
+
+  // TODO(almaher): Apply block-size containment.
 }
 
 MinMaxSizesResult MasonryLayoutAlgorithm::ComputeMinMaxSizes(
@@ -48,7 +61,7 @@
 
       MasonryRunningPositions running_positions(
           track_collection.EndLineOfImplicitGrid(), LayoutUnit(),
-          ResolveItemToleranceForMasonry(Style(), ChildAvailableSize()));
+          ResolveItemToleranceForMasonry(Style(), masonry_available_size_));
       PlaceMasonryItems(track_collection, masonry_items, start_offset,
                         running_positions);
       // `stacking_axis_gap` represents the space between each of the items
@@ -57,7 +70,7 @@
       // addition should be deleted as there is no item after it.
       const auto stacking_axis_gap =
           GridTrackSizingAlgorithm::CalculateGutterSize(
-              Style(), ChildAvailableSize(), kForColumns);
+              Style(), masonry_available_size_, kForColumns);
       return running_positions.GetMaxPositionForSpan(
                  GridSpan::TranslatedDefiniteGridSpan(
                      /*start_line=*/0,
@@ -88,7 +101,7 @@
   if (!masonry_items.IsEmpty()) {
     MasonryRunningPositions running_positions(
         track_collection.EndLineOfImplicitGrid(), LayoutUnit(),
-        ResolveItemToleranceForMasonry(Style(), ChildAvailableSize()));
+        ResolveItemToleranceForMasonry(Style(), masonry_available_size_));
     PlaceMasonryItems(track_collection, masonry_items, start_offset,
                       running_positions);
   }
@@ -136,7 +149,6 @@
     GridItems& masonry_items,
     wtf_size_t start_offset,
     MasonryRunningPositions& running_positions) {
-  const auto& available_size = ChildAvailableSize();
   const auto& border_scrollbar_padding = BorderScrollbarPadding();
   const auto& container_space = GetConstraintSpace();
   const auto& style = Style();
@@ -146,9 +158,8 @@
   const auto grid_axis_direction = track_collection.Direction();
   const bool is_for_columns = grid_axis_direction == kForColumns;
 
-
   const auto stacking_axis_gap = GridTrackSizingAlgorithm::CalculateGutterSize(
-      style, available_size, is_for_columns ? kForRows : kForColumns);
+      style, masonry_available_size_, is_for_columns ? kForRows : kForColumns);
 
   for (auto& masonry_item : masonry_items) {
     // Find the definite span that the masonry items should be placed in.
@@ -419,18 +430,16 @@
     return range_builder.FinalizeRanges();
   };
 
-  const auto& available_size = ChildAvailableSize();
   GridSizingTrackCollection track_collection(BuildRanges(),
                                              grid_axis_direction);
-  track_collection.BuildSets(style, available_size);
+  track_collection.BuildSets(style, masonry_available_size_);
 
   if (track_collection.HasNonDefiniteTrack()) {
     GridTrackSizingAlgorithm::CacheGridItemsProperties(track_collection,
                                                        &virtual_items);
 
-    // TODO(ethavar): Compute the min available size and use it here.
     const GridTrackSizingAlgorithm track_sizing_algorithm(
-        style, available_size, /*container_min_available_size=*/LogicalSize(),
+        style, masonry_available_size_, masonry_min_available_size_,
         sizing_constraint);
 
     track_sizing_algorithm.ComputeUsedTrackSizes(
@@ -438,16 +447,46 @@
   }
 
   auto first_set_geometry = GridTrackSizingAlgorithm::ComputeFirstSetGeometry(
-      track_collection, style, available_size, BorderScrollbarPadding());
+      track_collection, style, masonry_available_size_,
+      BorderScrollbarPadding());
 
   track_collection.FinalizeSetsGeometry(first_set_geometry.start_offset,
                                         first_set_geometry.gutter_size);
   return track_collection;
 }
 
+// https://drafts.csswg.org/css-grid-2/#auto-repeat
 wtf_size_t MasonryLayoutAlgorithm::ComputeAutomaticRepetitions() const {
-  // TODO(ethavar): Compute the actual number of automatic repetitions.
-  return 1;
+  const ComputedStyle& style = Style();
+  GridTrackSizingDirection masonry_track_sizing_direction =
+      style.MasonryTrackSizingDirection();
+  const bool is_for_columns = masonry_track_sizing_direction == kForColumns;
+
+  // TODO(almaher): Update the name of NGGridTrackList to GridTrackList.
+  const NGGridTrackList& track_list =
+      is_for_columns ? style.GridTemplateColumns().track_list
+                     : style.GridTemplateRows().track_list;
+
+  if (!track_list.HasAutoRepeater()) {
+    return 0;
+  }
+
+  // TODO(almaher): We will need special computation of automatic repetitions
+  // for submasonry (see ComputeAutomaticRepetitionsForSubgrid()). Once this is
+  // supported, we can move more of this method to the helper in
+  // grid_layout_utils.cc.
+
+  const LayoutUnit gutter_size = GridTrackSizingAlgorithm::CalculateGutterSize(
+      style, masonry_available_size_, masonry_track_sizing_direction);
+
+  return CalculateAutomaticRepetitions(
+      track_list, gutter_size,
+      is_for_columns ? masonry_available_size_.inline_size
+                     : masonry_available_size_.block_size,
+      is_for_columns ? masonry_min_available_size_.inline_size
+                     : masonry_min_available_size_.block_size,
+      is_for_columns ? masonry_max_available_size_.inline_size
+                     : masonry_max_available_size_.block_size);
 }
 
 ConstraintSpace MasonryLayoutAlgorithm::CreateConstraintSpace(
@@ -491,7 +530,7 @@
     LogicalRect* containing_rect) const {
   const bool is_for_columns = track_collection.Direction() == kForColumns;
 
-  auto containing_size = ChildAvailableSize();
+  auto containing_size = masonry_available_size_;
   auto& grid_axis_size =
       is_for_columns ? containing_size.inline_size : containing_size.block_size;
 
@@ -515,7 +554,7 @@
 ConstraintSpace MasonryLayoutAlgorithm::CreateConstraintSpaceForMeasure(
     const GridItemData& masonry_item,
     std::optional<LayoutUnit> opt_fixed_inline_size) const {
-  LogicalSize containing_size = ChildAvailableSize();
+  LogicalSize containing_size = masonry_available_size_;
   const auto writing_mode = GetConstraintSpace().GetWritingMode();
   const auto grid_axis_direction = Style().MasonryTrackSizingDirection();
 
diff --git a/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.h b/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.h
index faf8c553..3fca50c4 100644
--- a/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/masonry/masonry_layout_algorithm.h
@@ -84,6 +84,10 @@
       std::optional<LayoutUnit> opt_fixed_inline_size = std::nullopt) const;
 
   LayoutUnit intrinsic_block_size_;
+
+  LogicalSize masonry_available_size_;
+  LogicalSize masonry_min_available_size_;
+  LogicalSize masonry_max_available_size_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/DEPS b/third_party/blink/renderer/modules/DEPS
index 26620f88..66a62d0 100644
--- a/third_party/blink/renderer/modules/DEPS
+++ b/third_party/blink/renderer/modules/DEPS
@@ -71,6 +71,9 @@
     ".*_stream_wrapper.cc": [
         "+net/base/ip_endpoint.h",
     ],
+    ".*_web_transport.cc": [
+        "+net/base/ip_endpoint.h",
+    ],
     ".*socket.cc": [
         "+base/functional/identity.h",
     ],
diff --git a/third_party/blink/renderer/modules/webtransport/web_transport.cc b/third_party/blink/renderer/modules/webtransport/web_transport.cc
index 3108d17..8117846 100644
--- a/third_party/blink/renderer/modules/webtransport/web_transport.cc
+++ b/third_party/blink/renderer/modules/webtransport/web_transport.cc
@@ -1014,6 +1014,11 @@
 
 WebTransport::~WebTransport() = default;
 
+void WebTransport::OnBeforeConnect(const net::IPEndPoint& server_address) {
+  // |server_address| should be invalid from security/privacy reasons.
+  DCHECK_EQ(server_address, net::IPEndPoint());
+}
+
 void WebTransport::OnHandshakeFailed(
     network::mojom::blink::WebTransportErrorPtr error) {
   // |error| should be null from security/privacy reasons.
diff --git a/third_party/blink/renderer/modules/webtransport/web_transport.h b/third_party/blink/renderer/modules/webtransport/web_transport.h
index baf9eca..07ed6163 100644
--- a/third_party/blink/renderer/modules/webtransport/web_transport.h
+++ b/third_party/blink/renderer/modules/webtransport/web_transport.h
@@ -87,6 +87,7 @@
   ScriptPromise<WebTransportConnectionStats> getStats(ScriptState*);
 
   // WebTransportHandshakeClient implementation
+  void OnBeforeConnect(const net::IPEndPoint& server_address) override;
   void OnConnectionEstablished(
       mojo::PendingRemote<network::mojom::blink::WebTransport>,
       mojo::PendingReceiver<network::mojom::blink::WebTransportClient>,
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
index c72713e4..acc48c8 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
@@ -2112,8 +2112,7 @@
   // The timestamp is set later in EncodeOneFrame().
   auto frame = media::VideoFrame::WrapExternalData(
       media::PIXEL_FORMAT_I420, input_frame_coded_size_,
-      gfx::Rect(input_visible_size_), input_visible_size_,
-      static_cast<uint8_t*>(mapping.memory()), mapping.size(),
+      gfx::Rect(input_visible_size_), input_visible_size_, mapping,
       base::TimeDelta());
   if (!frame) {
     NotifyErrorStatus({media::EncoderStatus::Codes::kEncoderFailedEncode,
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 7fcbc348..3b0b8e5e 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -4371,7 +4371,7 @@
     },
     {
       name: "SecurePaymentConfirmationAvailabilityAPI",
-      status: "experimental",
+      status: "stable",
     },
     {
       name: "SecurePaymentConfirmationBrowserBoundKeys",
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index bce92e7..692b6c46 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -2197,6 +2197,15 @@
         ]
     },
     {
+        'paths': [
+            'third_party/blink/renderer/modules/webtransport/',
+        ],
+        'allowed': [
+            'net::Error',
+            'net::IPEndPoint',
+        ]
+    },
+    {
         'paths': ['third_party/blink/renderer/modules/manifest/'],
         'allowed': [
             'net::IsValidTopLevelMimeType',
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 15b15b3..0d867659 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1125,11 +1125,16 @@
 crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-006.html [ Failure ]
 crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/item-placement/masonry-item-placement-007.html [ Failure ]
 # Masonry sizing test failures
-crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/* [ Crash Failure Skip ]
-crbug.com/1076027 wpt_internal/css/css-masonry/column-explicit-placement-002.html [ Failure ]
-crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/order/masonry-order-001.html [ Failure ]
 crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/gap/masonry-gap-002.html [ Failure ]
+crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/* [ Crash Failure Skip ]
+crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/order/masonry-order-001.html [ Failure ]
+crbug.com/1076027 wpt_internal/css/css-masonry/column-auto-repeat-015.html [ Failure ]
+crbug.com/1076027 wpt_internal/css/css-masonry/column-explicit-placement-002.html [ Failure ]
 crbug.com/1076027 wpt_internal/css/css-masonry/row-explicit-placement-006.html [ Failure ]
+crbug.com/1076027 wpt_internal/css/css-masonry/row-auto-repeat-003.html [ Failure ]
+crbug.com/1076027 wpt_internal/css/css-masonry/row-auto-repeat-006.html [ Failure ]
+crbug.com/1076027 wpt_internal/css/css-masonry/row-auto-repeat-012.html [ Failure ]
+crbug.com/1076027 wpt_internal/css/css-masonry/row-auto-repeat-014.html [ Failure ]
 # Masonry named line failures
 crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/grid-placement/masonry-grid-placement-named-lines-001.html [ Crash Failure ]
 crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/grid-placement/masonry-grid-placement-named-lines-002.html [ Crash Failure ]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-mixins/local-if-substitution.html b/third_party/blink/web_tests/external/wpt/css/css-mixins/local-if-substitution.html
index 9e816c8..e2aed59 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-mixins/local-if-substitution.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-mixins/local-if-substitution.html
@@ -218,6 +218,87 @@
   </style>
 </template>
 
+<template data-name="CSS-wide keywords are interpreted locally (initial)">
+  <style>
+    @function --f(--c: green) {
+      result: if(style(--c: initial): PASS; else: FAIL);
+    }
+    @function --g() {
+      --c: red;
+      result: --f();
+    }
+    #target {
+      --actual: --g();
+      --expected: PASS;
+    }
+  </style>
+</template>
+
+<template data-name="CSS-wide keywords are interpreted locally (inherit)">
+  <style>
+    @function --f(--c: red) {
+      --c: green;
+      result: if(style(--c: inherit): PASS; else: FAIL);
+    }
+    @function --g() {
+      --c: green;
+      result: --f();
+    }
+    #target {
+      --actual: --g();
+      --expected: PASS;
+    }
+  </style>
+</template>
+
+<template data-name="CSS-wide keywords are interpreted locally (guaranteed-invalid, initial)">
+  <style>
+    @function --f() {
+      result: if(style(--c: initial): PASS; else: FAIL);
+    }
+    #target {
+      --actual: --f();
+      --expected: PASS;
+    }
+  </style>
+</template>
+
+<template data-name="CSS-wide keywords are interpreted locally (guaranteed-invalid, unset)">
+  <style>
+    @function --f() {
+      result: if(style(--c: unset): PASS; else: FAIL);
+    }
+    #target {
+      --actual: --f();
+      --expected: PASS;
+    }
+  </style>
+</template>
+
+<template data-name="CSS-wide keywords are interpreted locally (revert)">
+  <style>
+    @function --f() {
+      result: if(style(--c: revert): FAIL; else: PASS);
+    }
+    #target {
+      --actual: --f();
+      --expected: PASS;
+    }
+  </style>
+</template>
+
+<template data-name="CSS-wide keywords are interpreted locally (revert-layer)">
+  <style>
+    @function --f() {
+      result: if(style(--c: revert-layer): FAIL; else: PASS);
+    }
+    #target {
+      --actual: --f();
+      --expected: PASS;
+    }
+  </style>
+</template>
+
 <script>
   test_all_templates();
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-mixins/parameter-types.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-mixins/parameter-types.tentative.html
new file mode 100644
index 0000000..0b6fcf74
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-mixins/parameter-types.tentative.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<title>Custom Functions: Typed parameters</title>
+<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/12315">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/utils.js"></script>
+
+<div id=target></div>
+<div id=main></div>
+
+<!-- To pass, a test must produce matching computed values for --actual and
+     --expected on #target. -->
+
+<template data-name="A parameter retains its type">
+  <style>
+    @function --f(--c <color>) {
+      result: if(
+        style(--c:red): PASS;
+        else: FAIL);
+    }
+    #target {
+      --actual: --f(#f00);
+      --expected: PASS;
+    }
+  </style>
+</template>
+
+<template data-name="A parameter type acts as a local registration">
+  <style>
+    @function --f(--c <color>) {
+      --c:#00f; /* <color> */
+      result: if(
+        style(--c:blue): PASS;
+        else: FAIL);
+    }
+    #target {
+      --actual: --f(#000);
+      --expected: PASS;
+    }
+  </style>
+</template>
+
+<template data-name="A parameter retains its type (parent stack frame)">
+  <style>
+    @function --f() {
+      result: if(
+        style(--c:red): PASS;
+        else: FAIL);
+    }
+    @function --g(--c <color>) {
+      result: --f();
+    }
+    #target {
+      --actual: --g(#f00);
+      --expected: PASS;
+    }
+  </style>
+</template>
+
+<template data-name="A parameter type acts as a local registration (parent stack frame)">
+  <style>
+    @function --f() {
+      result: if(
+        style(--c:blue): PASS;
+        else: FAIL);
+    }
+    @function --g(--c <color>) {
+      --c:#00f; /* <color> */
+      result: --f();
+    }
+    #target {
+      --actual: --g(#f00);
+      --expected: PASS;
+    }
+  </style>
+</template>
+
+<template data-name="Universally typed parameter can shadow other parameters">
+  <style>
+    @function --f(--c type(*)) {
+      result: if(
+        style(--c:red): FAIL1;
+        style(--c:#f00): FAIL2;
+        style(--c:lime): FAIL3;
+        style(--c:#0f0): PASS;
+        else: FAIL4);
+    }
+    @function --g(--c <color>) {
+      result: --f(#0f0);
+    }
+    #target {
+      --actual: --g(#f00);
+      --expected: PASS;
+    }
+  </style>
+</template>
+
+<template data-name="Invalid value for typed local becomes IACVT">
+  <style>
+    @function --f(--c <color>) {
+      --c: 3;
+      result: var(--c, PASS);
+    }
+    #target {
+      --actual: --f(#f00);
+      --expected: PASS;
+    }
+  </style>
+</template>
+
+<template data-name="if() within @function can query registered custom property">
+  <style>
+    @property --c {
+      syntax: "<color>";
+      inherits: false;
+      initial-value: black;
+    }
+    @function --f() {
+      result: if(style(--c:#f00): PASS; else: FAIL);
+    }
+    #target {
+      --c: red;
+      --actual: --f();
+      --expected: PASS;
+    }
+  </style>
+</template>
+
+<script>
+  test_all_templates();
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/permission-element/display-css-property-reftest-ref.html b/third_party/blink/web_tests/external/wpt/html/semantics/permission-element/display-css-property-reftest-ref.html
new file mode 100644
index 0000000..aa5ffe0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/permission-element/display-css-property-reftest-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<body>
+  <div>
+    The permission element should either be display 'none' or 'inline-block'
+  </div>
+
+<style>
+  #id1 {
+    display: inline-block;
+  }
+</style>
+
+<permission id="id1" type="geolocation"></permission>
+<span>After element</span>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/permission-element/display-css-property-reftest.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/permission-element/display-css-property-reftest.tentative.html
new file mode 100644
index 0000000..e4288ca
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/permission-element/display-css-property-reftest.tentative.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<link rel="match" href="display-css-property-reftest-ref.html">
+<link rel="help" href="https://github.com/WICG/PEPC/blob/main/explainer.md#locking-the-pepc-style">
+<body>
+  <div>
+    The permission element should either be display 'none' or 'inline-block'
+  </div>
+
+<style>
+  #id1 {
+    display: flex;
+  }
+  #id2 {
+    display: none;
+  }
+</style>
+
+<permission id="id1" type="geolocation"></permission>
+<permission id="id2" type="camera"></permission>
+<span>After element</span>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/permission-element/display-css-property.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/permission-element/display-css-property.tentative.html
new file mode 100644
index 0000000..b87b6aa
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/permission-element/display-css-property.tentative.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<link rel="help" href="https://github.com/WICG/PEPC/blob/main/explainer.md#locking-the-pepc-style">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<!--
+  'display' should either be 'none' or 'inline-block'
+-->
+<style>
+  #id1 {
+    display: inline-block;
+  }
+  #id2 {
+    display: block;
+  }
+  #id3 {
+    display: none;
+  }
+</style>
+
+
+<permission id="id1" type="geolocation"></permission>
+<permission id="id2" type="camera"></permission>
+<permission id="id3" type="microphone"></permission>
+
+<script>
+  test(function(){
+    assert_equals(getComputedStyle(document.getElementById("id1")).display, "inline-block", "'inline-block' should be kept");
+    assert_equals(getComputedStyle(document.getElementById("id2")).display, "inline-block", "'block' should be changed to 'inline-block'");
+    assert_equals(getComputedStyle(document.getElementById("id3")).display, "none", "'none' should be kept");
+  }, "'display' should be either 'inline-block' or 'none'");
+</script>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
index edff33c..06536436 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -6634,6 +6634,7 @@
     getter methodName
     method constructor
 interface PaymentRequest : EventTarget
+    static method securePaymentConfirmationAvailability
     attribute @@toStringTag
     getter id
     getter onpaymentmethodchange
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-001-ref.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-001-ref.html
new file mode 100644
index 0000000..3bf88cce8
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-001-ref.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<style>
+.grid {
+    display: grid;
+    grid-template-columns: repeat(auto-fill, 100px);
+    grid-template-rows: 100px 100px 100px;
+    background: gray;
+    width: 300px;
+    height: 300px;
+}
+</style>
+<body>
+  <div class="grid">
+    <div style="background: lightskyblue;">
+      Number 1
+    </div>
+    <div style="background: lightcoral;">
+      Number 2
+    </div>
+    <div style="background: lightgreen;">
+      Number 3
+    </div>
+    <div style="background: lightpink;">
+      Number 4
+    </div>
+    <div style="background: orange;">
+      Number 5
+    </div>
+    <div style="grid-column: span 2; background: brown;">
+      Number 6
+    </div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-001.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-001.html
new file mode 100644
index 0000000..5489c65
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-001.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<title>Auto repeat tracks with fixed size</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="column-auto-repeat-001-ref.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: masonry;
+    background: gray;
+    item-tolerance: 0;
+    grid-template-columns: repeat(auto-fill, 100px);
+    width: 300px;
+    height: 300px;
+}
+
+.masonry > div {
+    width: 100%;
+    height: 100px;
+}
+</style>
+<body>
+  <div class="masonry">
+    <div style="background: lightskyblue;">
+      Number 1
+    </div>
+    <div style="background: lightcoral;">
+      Number 2
+    </div>
+    <div style="background: lightgreen;">
+      Number 3
+    </div>
+    <div style="background: lightpink;">
+      Number 4
+    </div>
+    <div style="background: orange;">
+      Number 5
+    </div>
+    <div style="grid-column: span 2; background: brown;">
+      Number 6
+    </div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-002-ref.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-002-ref.html
new file mode 100644
index 0000000..0ae80ef
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-002-ref.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<style>
+.grid {
+    display: grid;
+    grid-template-columns: repeat(auto-fill, 25%);
+    grid-template-rows: 100px 100px;
+    background: gray;
+    width: 300px;
+    height: 200px;
+}
+</style>
+<body>
+  <div class="grid">
+    <div style="background: lightskyblue;">
+      Number 1
+    </div>
+    <div style="background: lightcoral;">
+      Number 2
+    </div>
+    <div style="background: lightgreen;">
+      Number 3
+    </div>
+    <div style="background: lightpink;">
+      Number 4
+    </div>
+    <div style="background: orange;">
+      Number 5
+    </div>
+    <div style="grid-column: span 2; background: brown;">
+      Number 6
+    </div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-002.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-002.html
new file mode 100644
index 0000000..76cfd21
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-002.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<title>Auto repeat tracks with percentage track sizes</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="column-auto-repeat-002-ref.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: masonry;
+    background: gray;
+    item-tolerance: 0;
+    grid-template-columns: repeat(auto-fill, 25%);
+    width: 300px;
+    height: 200px;
+}
+
+.masonry > div {
+    width: 100%;
+    height: 100px;
+}
+</style>
+<body>
+  <div class="masonry">
+    <div style="background: lightskyblue;">
+      Number 1
+    </div>
+    <div style="background: lightcoral;">
+      Number 2
+    </div>
+    <div style="background: lightgreen;">
+      Number 3
+    </div>
+    <div style="background: lightpink;">
+      Number 4
+    </div>
+    <div style="background: orange;">
+      Number 5
+    </div>
+    <div style="grid-column: span 2; background: brown;">
+      Number 6
+    </div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-003.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-003.html
new file mode 100644
index 0000000..52b6b12
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-003.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>Checks that the min-height is reflected through the aspect-ratio for determining auto repeat tracks.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: inline-masonry;
+    background: green;
+    aspect-ratio: 1/1;
+    grid-template-columns: repeat(auto-fill, 50px);
+    min-height: 60px;
+}
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div class="masonry"></div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-004.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-004.html
new file mode 100644
index 0000000..4f1a6fa
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-004.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>Checks that the min-height is reflected through the aspect-ratio for determining auto repeat tracks.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: inline-masonry;
+    background: green;
+    aspect-ratio: 1/1;
+    grid-template-columns: repeat(auto-fill, 50px);
+    min-height: 60%;
+}
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div style="width: min-content; height: 100px; background: green;">
+  <div style="height: 100%;">
+    <div class="masonry"></div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-005.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-005.html
new file mode 100644
index 0000000..fbf8347
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-005.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>Auto repeater with minmax size.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: masonry;
+    width: 100px;
+    grid-template-columns: repeat(auto-fill, minmax(50px, 25px));
+}
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div class="masonry">
+  <div style="background: green; height: 50px; width: 100%;"></div>
+  <div style="background: green; height: 50px; width: 100%;"></div>
+  <div style="background: green; height: 50px; width: 100%;"></div>
+  <div style="background: green; height: 50px; width: 100%;"></div>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-006.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-006.html
new file mode 100644
index 0000000..85ff47b8
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-006.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<title>Checks that a dynamic change in containing block width changes the number of auto repeat tracks.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: inline-masonry;
+    background: green;
+    height: 100px;
+    min-width: 60%;
+    grid-template-columns: repeat(auto-fill, 50px);
+}
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div id="target" style="width: 0px; height: 100px;">
+  <div class="masonry"></div>
+</div>
+<script>
+  document.body.offsetTop;
+  document.getElementById('target').style.width = '100px';
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-007.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-007.html
new file mode 100644
index 0000000..4db1674
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-007.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<title>Checks that a dynamic change in containing block height changes the number of auto repeat tracks.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: inline-masonry;
+    background: green;
+    width: 100px;
+    min-height: 60%;
+    grid-template-columns: repeat(auto-fill, 50px);
+    aspect-ratio: 1/1;
+}
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div id="target" style="width: 0px; height: 100px;">
+  <div class="masonry"></div>
+</div>
+<script>
+  document.body.offsetTop;
+  document.getElementById('target').style.height = '100px';
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-008.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-008.html
new file mode 100644
index 0000000..fb45f74d
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-008.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks and min sizes</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<meta name="assert" content="This test checks that auto repeat tracks use min size when available to compute the number of tracks.">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    position: relative;
+    display: masonry;
+    grid-template-columns: repeat(auto-fill, 100px);
+    min-width: 300px;
+    min-height: 200px;
+    float: left;
+    background: pink;
+}
+.border {
+  border: 10px solid;
+}
+.border-box {
+  box-sizing: border-box;
+}
+.item {
+  background: lime;
+  /* Place item on the last column. */
+  grid-column: -2;
+  width: 100%;
+  height: 200px;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.masonry');">
+
+<div id="log"></div>
+
+<div class="masonry" data-expected-width="300" data-expected-height="200">
+  <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+</div>
+
+<div class="masonry" style="width: 200px; height: 100px;" data-expected-width="300" data-expected-height="200">
+  <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+</div>
+
+<div class="masonry" style="width: min-content; height: min-content;" data-expected-width="300" data-expected-height="200">
+  <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+</div>
+
+<div class="masonry" style="width: max-content; height: max-content;" data-expected-width="300" data-expected-height="200">
+  <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+</div>
+
+<div class="masonry border" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+</div>
+
+<div class="masonry border" style="width: 200px; height: 100px;" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+</div>
+
+<div class="masonry border" style="width: min-content; height: min-content;" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+</div>
+
+<div class="masonry border" style="width: max-content; height: max-content;" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+</div>
+
+<div class="masonry border border-box" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+</div>
+
+<div class="masonry border border-box" style="width: 200px; height: 100px;" data-expected-width="300" data-expected-height="200">
+  <div class="item" data-offset-x="100" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+</div>
+
+<div class="masonry border border-box" style="width: min-content; height: min-content;" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+</div>
+
+<div class="masonry border border-box" style="width: max-content; height: max-content;" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+</div>
+
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-009.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-009.html
new file mode 100644
index 0000000..8cfcfaf
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-009.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks and percentage min sizes</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<meta name="assert" content="This test checks that auto repeat tracks use percentage min size when available to compute the number of tracks.">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    position: relative;
+    display: masonry;
+    grid-template-columns: repeat(auto-fill, 100px);
+    min-width: 50%;
+    min-height: 80%;
+    float: left;
+    background: pink;
+}
+.wrapper {
+  width: 600px;
+  height: 250px;
+}
+.item {
+  background: lime;
+  /* Place item on the last column. */
+  grid-column: -2;
+  width: 100%;
+  height: 200px;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.masonry');">
+
+<div id="log"></div>
+
+<div class="wrapper">
+  <div class="masonry" style="width: 200px; height: 100px;" data-expected-width="300" data-expected-height="200">
+    <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+  </div>
+</div>
+
+<div class="wrapper">
+  <div class="masonry" style="width: min-content; height: min-content;" data-expected-width="300" data-expected-height="200">
+    <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+  </div>
+</div>
+
+<div class="wrapper">
+  <div class="masonry" style="width: max-content; height: max-content;" data-expected-width="300" data-expected-height="200">
+    <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+  </div>
+</div>
+
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-010.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-010.html
new file mode 100644
index 0000000..4a531f76
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-010.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks and percentage min sizes with percentage track sizes</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<meta name="assert"
+  content="This test checks that auto repeat tracks can use percentage track
+  size when only a min size is available to compute the number of tracks.">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    position: relative;
+    display: inline-masonry;
+    grid-template-columns: repeat(auto-fill, 25%);
+    min-width: 50%;
+    height: 200px;
+    float: left;
+    background: pink;
+}
+.wrapper {
+  width: 600px;
+}
+.item {
+  background: lime;
+  width: 100%;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.masonry');">
+
+  <div id="log"></div>
+
+  <div class="wrapper">
+    <div class="masonry" data-expected-width="300" data-expected-height="200">
+      <div class="item" data-expected-width="75">Cell 1</div>
+      <div class="item" data-expected-width="75">Cell 2</div>
+      <div class="item" data-expected-width="75">Cell 3</div>
+      <div class="item" data-expected-width="75">Cell 4</div>
+      <div class="item" data-expected-width="75">Cell 5</div>
+    </div>
+  </div>
+
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-011.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-011.html
new file mode 100644
index 0000000..993a843
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-011.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks and percentage max sizes</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<meta name="assert" content="This test checks that auto repeat tracks use percentage max size when size is indefinite to compute the number of tracks.">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    position: relative;
+    display: masonry;
+    grid-template-columns: repeat(auto-fill, 100px);
+    max-width: 50%;
+    max-height: 80%;
+    background: pink;
+}
+.wrapper {
+  width: 600px;
+  height: 250px;
+}
+.item {
+  background: lime;
+  /* Place item on the last column. */
+  grid-column: -2;
+  width: 100%;
+  height: 200px;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.masonry');">
+
+<div id="log"></div>
+
+<div class="wrapper">
+  <div class="masonry" data-expected-width="300" data-expected-height="200">
+    <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+  </div>
+</div>
+
+<div class="wrapper">
+  <div class="masonry" style="width: 200px; height: 100px;" data-expected-width="200" data-expected-height="100">
+    <div class="item" data-offset-x="100" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+  </div>
+</div>
+
+<div class="wrapper">
+  <div class="masonry" style="width: min-content; height: min-content;" data-expected-width="300" data-expected-height="200">
+    <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+  </div>
+</div>
+
+<div class="wrapper">
+  <div class="masonry" style="width: max-content; height: max-content;" data-expected-width="300" data-expected-height="200">
+    <div class="item" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
+  </div>
+</div>
+
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-012.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-012.html
new file mode 100644
index 0000000..eb6745ab
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-012.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks with min and max sizes</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<meta name="assert" content="This test checks that auto repeat tracks don't overflow the masonry container size when max size is definite, even if min size is bigger than that.">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    position: relative;
+    display: masonry;
+    grid-template-columns: repeat(auto-fill, 100px);
+    max-width: 100px;
+    min-width: 250px;
+    max-height: 50px;
+    min-height: 125px;
+    float: left;
+    background: pink;
+}
+.item {
+  background: lime;
+  /* Place item on the last column. */
+  grid-column: -2;
+  width: 100%;
+  height: 125px;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.masonry');">
+
+<div id="log"></div>
+
+<div class="masonry" data-expected-width="250" data-expected-height="125">
+  <div class="item" data-offset-x="100" data-offset-y="0" data-expected-width="100" data-expected-height="125"></div>
+</div>
+
+<div class="masonry" style="width: 200px; height: 100px;" data-expected-width="250" data-expected-height="125">
+  <div class="item" data-offset-x="100" data-offset-y="0" data-expected-width="100" data-expected-height="125"></div>
+</div>
+
+<div class="masonry" style="width: min-content; height: min-content;" data-expected-width="250" data-expected-height="125">
+  <div class="item" data-offset-x="100" data-offset-y="0" data-expected-width="100" data-expected-height="125"></div>
+</div>
+
+<div class="masonry" style="width: max-content; height: max-content;" data-expected-width="250" data-expected-height="125">
+  <div class="item" data-offset-x="100" data-offset-y="0" data-expected-width="100" data-expected-height="125"></div>
+</div>
+
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-013-ref.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-013-ref.html
new file mode 100644
index 0000000..ef70899
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-013-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<style>
+.grid {
+  display: grid;
+  border: solid thick;
+  margin: 10px;
+  grid-template-columns: repeat(auto-fill, 50px 50px);
+  grid-column-gap: 100px;
+  width: 300px;
+  background: pink;
+}
+.grid > div {
+  background: lime;
+  width: 100%;
+  height: 50px;
+}
+</style>
+<p>The test passes if it has the same visual effect as reference.</p>
+<div class="grid">
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-013.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-013.html
new file mode 100644
index 0000000..947779a
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-013.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks with multiple tracks and gutters.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="match" href="column-auto-repeat-013-ref.html">
+<style>
+.masonry {
+  display: masonry;
+  border: solid thick;
+  margin: 10px;
+  grid-template-columns: repeat(auto-fill, 50px 50px);
+  grid-column-gap: 100px;
+  width: 300px;
+  background: pink;
+}
+.masonry > div {
+  background: lime;
+  width: 100%;
+  height: 50px;
+}
+</style>
+<p>The test passes if it has the same visual effect as reference.</p>
+<div class="masonry">
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-014-ref.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-014-ref.html
new file mode 100644
index 0000000..10415eb
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-014-ref.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<style>
+.grid {
+  display: grid;
+  border: solid thick;
+  grid-template-columns: 10px 20px repeat(auto-fill, 30px 40px) 50px 60px;
+  width: 300px;
+  background: pink;
+}
+.grid > :nth-child(2n) {
+  background: sienna;
+}
+.grid > :nth-child(2n+1) {
+  background: orange;
+}
+.grid > div {
+  width: 100%;
+  height: 25px;
+}
+.holder {
+  height: 30px;
+  width: 300px;
+  border-bottom: 2px solid #cfbfcf;
+}
+</style>
+<p>The test passes if it has the same visual effect as reference.</p>
+<div class="holder">
+  <div class="grid">
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+  </div>
+</div>
+
+<div class="holder">
+  <div class="grid">
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div style="grid-column: 7;"></div>
+  </div>
+</div>
+
+<div class="holder">
+  <div class="grid">
+    <div style="grid-column: 2;"></div>
+    <div></div>
+    <div style="grid-column: 5;"></div>
+    <div></div>
+    <div></div>
+    <div></div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-014.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-014.html
new file mode 100644
index 0000000..015db4d
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-014.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks with multiple tracks.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="match" href="column-auto-repeat-014-ref.html">
+<style>
+.masonry {
+  display: masonry;
+  border: solid thick;
+  grid-template-columns: 10px 20px repeat(auto-fill, 30px 40px) 50px 60px;
+  width: 300px;
+  background: pink;
+}
+.masonry > :nth-child(2n) {
+  background: sienna;
+}
+.masonry > :nth-child(2n+1) {
+  background: orange;
+}
+.masonry > div {
+  width: 100%;
+  height: 25px;
+}
+.holder {
+  height: 30px;
+  width: 300px;
+  border-bottom: 2px solid #cfbfcf;
+}
+</style>
+<p>The test passes if it has the same visual effect as reference.</p>
+<div class="holder">
+  <div class="masonry">
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+  </div>
+</div>
+
+<div class="holder">
+  <div class="masonry">
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div style="grid-column: 7;"></div>
+  </div>
+</div>
+
+<div class="holder">
+  <div class="masonry">
+    <div style="grid-column: 2;"></div>
+    <div></div>
+    <div style="grid-column: 5;"></div>
+    <div></div>
+    <div></div>
+    <div></div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-015-ref.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-015-ref.html
new file mode 100644
index 0000000..d1ee197
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-015-ref.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html>
+<style>
+.grid {
+  display: inline-grid;
+  border: 1px solid black;
+  grid-template-columns: [u] repeat(auto-fill, [v] 10px [w] 10px [x] 10px [y]) [z];
+  grid-column-gap: 3px;
+  /* Does not fit a whole-number of repetitions */
+  width: 94px;
+  background: pink;
+}
+div > div {
+  background: blue;
+  width: 100%;
+  height: 25px;
+}
+</style>
+<body>
+    <!-- u -->
+    <div class="grid">
+        <div style="grid-column-start: u"></div>
+    </div>
+    <!-- non-existent line name -->
+    <div class="grid">
+        <div style="grid-column-start: nonesuch"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: u 1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: u -1"></div>
+    </div>
+    <!-- Also non-existent, there is only one u -->
+    <div class="grid">
+        <div style="grid-column-start: u 4"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: u 9"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: u 2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: u -2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: u -6"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: u -7"></div>
+    </div>
+    <!-- v -->
+    <div class="grid">
+        <div style="grid-column-start: v"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: v 1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: v 2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: v -1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: v -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two v's -->
+    <div class="grid">
+        <div style="grid-column-start: v 3"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: v -3"></div>
+    </div>
+    <!-- w -->
+    <div class="grid">
+        <div style="grid-column-start: w"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: w 1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: w 2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: w -1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: w -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two w's -->
+    <div class="grid">
+        <div style="grid-column-start: w 3"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: w -3"></div>
+    </div>
+    <!-- x -->
+    <div class="grid">
+        <div style="grid-column-start: x"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: x 1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: x 2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: x -1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: x -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two x's -->
+    <div class="grid">
+        <div style="grid-column-start: x 3"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: x -3"></div>
+    </div>
+    <!-- y -->
+    <div class="grid">
+        <div style="grid-column-start: y"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: y 1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: y 2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: y -1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: y -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two y's -->
+    <div class="grid">
+        <div style="grid-column-start: y -3"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: y 3"></div>
+    </div>
+    <!-- z -->
+    <div class="grid">
+        <div style="grid-column-start: z"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: z 1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: z -1"></div>
+    </div>
+    <!-- Also non-existent, there is only one z -->
+    <div class="grid">
+        <div style="grid-column-start: z 2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-column-start: z -2"></div>
+    </div>
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-015.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-015.html
new file mode 100644
index 0000000..7754e41
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-015.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks with multiple tracks and line names.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="match" href="column-auto-repeat-015-ref.html">
+<style>
+.masonry {
+  display: inline-masonry;
+  border: 1px solid black;
+  grid-template-columns: [u] repeat(auto-fill, [v] 10px [w] 10px [x] 10px [y]) [z];
+  grid-column-gap: 3px;
+  /* Does not fit a whole-number of repetitions */
+  width: 94px;
+  background: pink;
+}
+div > div {
+  background: blue;
+  width: 100%;
+  height: 25px;
+}
+</style>
+<body>
+    <!-- u -->
+    <div class="masonry">
+        <div style="grid-column-start: u"></div>
+    </div>
+    <!-- non-existent line name -->
+    <div class="masonry">
+        <div style="grid-column-start: nonesuch"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: u 1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: u -1"></div>
+    </div>
+    <!-- Also non-existent, there is only one u -->
+    <div class="masonry">
+        <div style="grid-column-start: u 4"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: u 9"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: u 2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: u -2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: u -6"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: u -7"></div>
+    </div>
+    <!-- v -->
+    <div class="masonry">
+        <div style="grid-column-start: v"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: v 1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: v 2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: v -1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: v -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two v's -->
+    <div class="masonry">
+        <div style="grid-column-start: v 3"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: v -3"></div>
+    </div>
+    <!-- w -->
+    <div class="masonry">
+        <div style="grid-column-start: w"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: w 1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: w 2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: w -1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: w -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two w's -->
+    <div class="masonry">
+        <div style="grid-column-start: w 3"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: w -3"></div>
+    </div>
+    <!-- x -->
+    <div class="masonry">
+        <div style="grid-column-start: x"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: x 1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: x 2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: x -1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: x -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two x's -->
+    <div class="masonry">
+        <div style="grid-column-start: x 3"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: x -3"></div>
+    </div>
+    <!-- y -->
+    <div class="masonry">
+        <div style="grid-column-start: y"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: y 1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: y 2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: y -1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: y -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two y's -->
+    <div class="masonry">
+        <div style="grid-column-start: y -3"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: y 3"></div>
+    </div>
+    <!-- z -->
+    <div class="masonry">
+        <div style="grid-column-start: z"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: z 1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: z -1"></div>
+    </div>
+    <!-- Also non-existent, there is only one z -->
+    <div class="masonry">
+        <div style="grid-column-start: z 2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-column-start: z -2"></div>
+    </div>
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-016-ref.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-016-ref.html
new file mode 100644
index 0000000..828f8a7
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-016-ref.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+<style>
+.grid {
+    display: grid;
+    grid-template-columns: repeat(auto-fit, 100px);
+    grid-template-rows: 100px 100px 100px;
+    background: gray;
+    height: 300px;
+}
+</style>
+<body>
+  <div class="grid">
+    <div style="background: lightskyblue;">
+      Number 1
+    </div>
+    <div style="background: lightcoral;">
+      Number 2
+    </div>
+    <div style="background: lightgreen;">
+      Number 3
+    </div>
+    <div style="background: lightpink;">
+      Number 4
+    </div>
+    <div style="background: orange;">
+      Number 5
+    </div>
+    <div style="grid-column: span 2; background: brown;">
+      Number 6
+    </div>
+    <div style="grid-column: span 3; background: blue;">
+      Number 7
+    </div>
+    <div style="grid-column: span 3; background: yellow;">
+      Number 8
+    </div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-016.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-016.html
new file mode 100644
index 0000000..56efc15
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/column-auto-repeat-016.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html>
+<title>Auto repeat tracks with fixed size</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="column-auto-repeat-016-ref.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: masonry;
+    background: gray;
+    item-tolerance: 0;
+    grid-template-columns: repeat(auto-fit, 100px);
+    height: 300px;
+}
+
+.masonry > div {
+    width: 100%;
+    height: 100px;
+}
+</style>
+<body>
+  <div class="masonry">
+    <div style="background: lightskyblue;">
+      Number 1
+    </div>
+    <div style="background: lightcoral;">
+      Number 2
+    </div>
+    <div style="background: lightgreen;">
+      Number 3
+    </div>
+    <div style="background: lightpink;">
+      Number 4
+    </div>
+    <div style="background: orange;">
+      Number 5
+    </div>
+    <div style="grid-column: span 2; background: brown;">
+      Number 6
+    </div>
+    <div style="grid-column: span 3; background: blue;">
+      Number 7
+    </div>
+    <div style="grid-column: span 3; background: yellow;">
+      Number 8
+    </div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-001-ref.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-001-ref.html
new file mode 100644
index 0000000..5586204
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-001-ref.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<style>
+.grid {
+    display: grid;
+    grid-template-rows: repeat(auto-fill, 100px);
+    grid-template-columns: 100px 100px 100px;
+    background: gray;
+    width: 300px;
+    height: 300px;
+}
+</style>
+<body>
+  <div class="grid">
+    <div style="background: lightskyblue;">
+      Number 1
+    </div>
+    <div style="background: lightcoral; grid-row: 2;">
+      Number 2
+    </div>
+    <div style="background: lightgreen; grid-row: 3;">
+      Number 3
+    </div>
+    <div style="background: lightpink;">
+      Number 4
+    </div>
+    <div style="background: orange; grid-row: 2;">
+      Number 5
+    </div>
+    <div style="grid-row: span 2; background: brown;">
+      Number 6
+    </div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-001.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-001.html
new file mode 100644
index 0000000..c5d7d9ee
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-001.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+<title>Auto repeat tracks with fixed size</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="row-auto-repeat-001-ref.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: masonry;
+    background: gray;
+    item-tolerance: 0;
+    masonry-direction: row;
+    grid-template-rows: repeat(auto-fill, 100px);
+    width: 300px;
+    height: 300px;
+}
+
+.masonry > div {
+    width: 100px;
+    height: 100%;
+}
+</style>
+<body>
+  <div class="masonry">
+    <div style="background: lightskyblue;">
+      Number 1
+    </div>
+    <div style="background: lightcoral;">
+      Number 2
+    </div>
+    <div style="background: lightgreen;">
+      Number 3
+    </div>
+    <div style="background: lightpink;">
+      Number 4
+    </div>
+    <div style="background: orange;">
+      Number 5
+    </div>
+    <div style="grid-row: span 2; background: brown;">
+      Number 6
+    </div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-002-ref.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-002-ref.html
new file mode 100644
index 0000000..0c4869d
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-002-ref.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<style>
+.grid {
+    display: grid;
+    grid-template-rows: repeat(auto-fill, 25%);
+    grid-template-columns: 100px 100px;
+    background: gray;
+    width: 200px;
+    height: 300px;
+}
+</style>
+<body>
+  <div class="grid">
+    <div style="background: lightskyblue;">
+      Number 1
+    </div>
+    <div style="background: lightcoral; grid-row: 2;">
+      Number 2
+    </div>
+    <div style="background: lightgreen; grid-row: 3;">
+      Number 3
+    </div>
+    <div style="background: lightpink; grid-row: 4;">
+      Number 4
+    </div>
+    <div style="background: orange;">
+      Number 5
+    </div>
+    <div style="grid-row: span 2; background: brown;">
+      Number 6
+    </div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-002.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-002.html
new file mode 100644
index 0000000..ea08ea29
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-002.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+<title>Auto repeat tracks with percentage track sizes</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="row-auto-repeat-002-ref.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: masonry;
+    background: gray;
+    item-tolerance: 0;
+    masonry-direction: row;
+    grid-template-rows: repeat(auto-fill, 25%);
+    width: 200px;
+    height: 300px;
+}
+
+.masonry > div {
+    width: 100px;
+    height: 100%;
+}
+</style>
+<body>
+  <div class="masonry">
+    <div style="background: lightskyblue;">
+      Number 1
+    </div>
+    <div style="background: lightcoral;">
+      Number 2
+    </div>
+    <div style="background: lightgreen;">
+      Number 3
+    </div>
+    <div style="background: lightpink;">
+      Number 4
+    </div>
+    <div style="background: orange;">
+      Number 5
+    </div>
+    <div style="grid-row: span 2; background: brown;">
+      Number 6
+    </div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-003.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-003.html
new file mode 100644
index 0000000..9bc62e2
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-003.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<title>Checks that the min-height is reflected through the aspect-ratio for determining auto repeat tracks.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: inline-masonry;
+    background: green;
+    aspect-ratio: 1/1;
+    masonry-direction: row;
+    grid-template-rows: repeat(auto-fill, 50px);
+    min-height: 60px;
+}
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div class="masonry"></div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-004.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-004.html
new file mode 100644
index 0000000..329bfb833
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-004.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>Checks that the min-height is reflected through the aspect-ratio for determining auto repeat tracks.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: inline-masonry;
+    background: green;
+    aspect-ratio: 1/1;
+    masonry-direction: row;
+    grid-template-rows: repeat(auto-fill, 50px);
+    min-height: 60%;
+}
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div style="width: 100px; height: 100px; background: green;">
+  <div style="height: 100%;">
+    <div class="masonry"></div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-005.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-005.html
new file mode 100644
index 0000000..a0df1c4
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-005.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>Auto repeater with minmax size.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: masonry;
+    masonry-direction: row;
+    height: 100px;
+    grid-template-rows: repeat(auto-fill, minmax(50px, 25px));
+}
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div class="masonry">
+  <div style="background: green; width: 50px; height: 100%;"></div>
+  <div style="background: green; width: 50px; height: 100%;"></div>
+  <div style="background: green; width: 50px; height: 100%;"></div>
+  <div style="background: green; width: 50px; height: 100%;"></div>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-006.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-006.html
new file mode 100644
index 0000000..816289b
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-006.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<title>Checks that a dynamic change in containing block height changes the number of auto repeat tracks.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    display: inline-masonry;
+    masonry-direction: row;
+    background: green;
+    width: 100px;
+    min-height: 60%;
+    grid-template-rows: repeat(auto-fill, 50px);
+}
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div id="target" style="width: 100px; height: 0px;">
+  <div class="masonry"></div>
+</div>
+<script>
+  document.body.offsetTop;
+  document.getElementById('target').style.height = '100px';
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-007.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-007.html
new file mode 100644
index 0000000..7177a6e
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-007.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks and min sizes</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<meta name="assert" content="This test checks that auto repeat tracks use min size when available to compute the number of tracks.">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    position: relative;
+    display: masonry;
+    masonry-direction: row;
+    grid-template-rows: repeat(auto-fill, 50px);
+    min-width: 300px;
+    min-height: 200px;
+    float: left;
+    background: pink;
+}
+.border {
+  border: 10px solid;
+}
+.border-box {
+  box-sizing: border-box;
+}
+.item {
+  background: lime;
+  /* Place item on the last row. */
+  grid-row: -2;
+  width: 300px;
+  height: 100%;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.masonry');">
+
+<div id="log"></div>
+
+<div class="masonry" data-expected-width="300" data-expected-height="200">
+  <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+</div>
+
+<div class="masonry" style="width: 200px; height: 100px;" data-expected-width="300" data-expected-height="200">
+  <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+</div>
+
+<div class="masonry" style="width: min-content; height: min-content;" data-expected-width="300" data-expected-height="200">
+  <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+</div>
+
+<div class="masonry" style="width: max-content; height: max-content;" data-expected-width="300" data-expected-height="200">
+  <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+</div>
+
+<div class="masonry border" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+</div>
+
+<div class="masonry border" style="width: 200px; height: 100px;" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+</div>
+
+<div class="masonry border" style="width: min-content; height: min-content;" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+</div>
+
+<div class="masonry border" style="width: max-content; height: max-content;" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+</div>
+
+<div class="masonry border border-box" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+</div>
+
+<div class="masonry border border-box" style="width: 200px; height: 100px;" data-expected-width="300" data-expected-height="200">
+  <div class="item" data-offset-x="0" data-offset-y="100" data-expected-width="300" data-expected-height="50"></div>
+</div>
+
+<div class="masonry border border-box" style="width: min-content; height: min-content;" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+</div>
+
+<div class="masonry border border-box" style="width: max-content; height: max-content;" data-expected-width="320" data-expected-height="220">
+  <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+</div>
+
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-008.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-008.html
new file mode 100644
index 0000000..f2564be
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-008.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks and percentage min sizes</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<meta name="assert" content="This test checks that auto repeat tracks use percentage min size when available to compute the number of tracks.">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    position: relative;
+    display: masonry;
+    masonry-direction: row;
+    grid-template-rows: repeat(auto-fill, 50px);
+    min-width: 50%;
+    min-height: 80%;
+    float: left;
+    background: pink;
+}
+.wrapper {
+  width: 600px;
+  height: 250px;
+}
+.item {
+  background: lime;
+  /* Place item on the last row. */
+  grid-row: -2;
+  width: 300px;
+  height: 100%;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.masonry');">
+
+<div id="log"></div>
+
+<div class="wrapper">
+  <div class="masonry" data-expected-width="300" data-expected-height="200">
+    <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+  </div>
+</div>
+
+<div class="wrapper">
+  <div class="masonry" style="width: 200px; height: 100px;" data-expected-width="300" data-expected-height="200">
+    <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+  </div>
+</div>
+
+<div class="wrapper">
+  <div class="masonry" style="width: min-content; height: min-content;" data-expected-width="300" data-expected-height="200">
+    <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+  </div>
+</div>
+
+<div class="wrapper">
+  <div class="masonry" style="width: max-content; height: max-content;" data-expected-width="300" data-expected-height="200">
+    <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+  </div>
+</div>
+
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-009.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-009.html
new file mode 100644
index 0000000..163abf6f
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-009.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks and percentage min sizes with percentage track sizes</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<meta name="assert"
+  content="This test checks that auto repeat tracks can use percentage track
+  size when only a min size is available to compute the number of tracks.">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    position: relative;
+    display: inline-masonry;
+    masonry-direction: row;
+    grid-template-rows: repeat(auto-fill, 20%);
+    min-height: 50%;
+    width: 100px;
+    float: left;
+    background: pink;
+}
+.wrapper {
+  height: 1000px;
+}
+.item {
+  background: lime;
+  height: 100%;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.masonry');">
+
+  <div id="log"></div>
+
+  <div class="wrapper">
+    <div class="masonry" data-expected-width="100" data-expected-height="500">
+      <div class="item" data-expected-width="100" data-expected-height="100">Cell 1</div>
+      <div class="item" data-expected-width="100" data-expected-height="100">Cell 2</div>
+      <div class="item" data-expected-width="100" data-expected-height="100">Cell 3</div>
+      <div class="item" data-expected-width="100" data-expected-height="100">Cell 4</div>
+      <div class="item" data-expected-width="100" data-expected-height="100">Cell 5</div>
+    </div>
+  </div>
+
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-010.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-010.html
new file mode 100644
index 0000000..ae04f7c
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-010.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks and percentage max sizes</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<meta name="assert" content="This test checks that auto repeat tracks use percentage max size when size is indefinite to compute the number of tracks.">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    position: relative;
+    display: masonry;
+    masonry-direction: row;
+    grid-template-rows: repeat(auto-fill, 50px);
+    max-width: 50%;
+    max-height: 80%;
+    background: pink;
+}
+.wrapper {
+  width: 600px;
+  height: 250px;
+}
+.item {
+  background: lime;
+  /* Place item on the last row. */
+  grid-row: -2;
+  width: 300px;
+  height: 100%;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.masonry');">
+
+<div id="log"></div>
+
+<div class="wrapper">
+  <div class="masonry" data-expected-width="300" data-expected-height="200">
+    <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+  </div>
+</div>
+
+<div class="wrapper">
+  <div class="masonry" style="width: 200px; height: 100px;" data-expected-width="200" data-expected-height="100">
+    <div class="item" data-offset-x="0" data-offset-y="50" data-expected-width="300" data-expected-height="50"></div>
+  </div>
+</div>
+
+<div class="wrapper">
+  <div class="masonry" style="width: min-content; height: min-content;" data-expected-width="300" data-expected-height="200">
+    <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+  </div>
+</div>
+
+<div class="wrapper">
+  <div class="masonry" style="width: max-content; height: max-content;" data-expected-width="300" data-expected-height="200">
+    <div class="item" data-offset-x="0" data-offset-y="150" data-expected-width="300" data-expected-height="50"></div>
+  </div>
+</div>
+
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-011.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-011.html
new file mode 100644
index 0000000..ee173d60
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-011.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks with min and max sizes</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<meta name="assert" content="This test checks that auto repeat tracks don't overflow the masonry container size when max size is definite, even if min size is bigger than that.">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<style>
+.masonry {
+    position: relative;
+    display: masonry;
+    grid-template-rows: repeat(auto-fill, 50px);
+    masonry-direction: row;
+    max-width: 100px;
+    min-width: 250px;
+    max-height: 50px;
+    min-height: 125px;
+    float: left;
+    background: pink;
+}
+.item {
+  background: lime;
+  /* Place item on the last row. */
+  grid-row: -2;
+  width: 250px;
+  height: 100%;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.masonry');">
+
+<div id="log"></div>
+
+<div class="masonry" data-expected-width="250" data-expected-height="125">
+  <div class="item" data-offset-x="0" data-offset-y="50" data-expected-width="250" data-expected-height="50"></div>
+</div>
+
+<div class="masonry" style="width: 200px; height: 100px;" data-expected-width="250" data-expected-height="125">
+  <div class="item" data-offset-x="0" data-offset-y="50" data-expected-width="250" data-expected-height="50"></div>
+</div>
+
+<div class="masonry" style="width: min-content; height: min-content;" data-expected-width="250" data-expected-height="125">
+  <div class="item" data-offset-x="0" data-offset-y="50" data-expected-width="250" data-expected-height="50"></div>
+</div>
+
+<div class="masonry" style="width: max-content; height: max-content;" data-expected-width="250" data-expected-height="125">
+  <div class="item" data-offset-x="0" data-offset-y="50" data-expected-width="250" data-expected-height="50"></div>
+</div>
+
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-012-ref.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-012-ref.html
new file mode 100644
index 0000000..a4f4f02
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-012-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<style>
+.grid {
+  display: grid;
+  border: solid thick;
+  margin: 10px;
+  grid-template-rows: repeat(auto-fill, 50px 50px);
+  grid-row-gap: 100px;
+  height: 300px;
+  width: min-content;
+  background: pink;
+}
+.grid > div {
+  background: lime;
+  width: 50px;
+  height: 100%;
+}
+</style>
+<p>The test passes if it has the same visual effect as reference.</p>
+<div class="grid">
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-012.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-012.html
new file mode 100644
index 0000000..90e355d
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-012.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks with multiple tracks and gutters.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="match" href="row-auto-repeat-012-ref.html">
+<style>
+.masonry {
+  display: masonry;
+  border: solid thick;
+  margin: 10px;
+  masonry-direction: row;
+  grid-template-rows: repeat(auto-fill, 50px 50px);
+  grid-row-gap: 100px;
+  height: 300px;
+  width: min-content;
+  background: pink;
+}
+.masonry > div {
+  background: lime;
+  width: 50px;
+  height: 100%;
+}
+</style>
+<p>The test passes if it has the same visual effect as reference.</p>
+<div class="masonry">
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-013-ref.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-013-ref.html
new file mode 100644
index 0000000..61ec6cc
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-013-ref.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<style>
+.grid {
+  display: grid;
+  border: solid thick;
+  grid-template-rows: 10px 20px repeat(auto-fill, 30px 40px) 50px 60px;
+  height: 300px;
+  background: pink;
+}
+.grid > :nth-child(2n) {
+  background: sienna;
+}
+.grid > :nth-child(2n+1) {
+  background: orange;
+}
+.grid > div {
+  width: 25px;
+  height: 100%;
+}
+.holder {
+  height: 300px;
+  width: 50px;
+  border-bottom: 2px solid #cfbfcf;
+}
+</style>
+<p>The test passes if it has the same visual effect as reference.</p>
+<div class="holder">
+  <div class="grid">
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+  </div>
+</div>
+
+<div class="holder">
+  <div class="grid">
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div style="grid-row: 7;"></div>
+  </div>
+</div>
+
+<div class="holder">
+  <div class="grid">
+    <div style="grid-row: 2;"></div>
+    <div></div>
+    <div style="grid-row: 5;"></div>
+    <div></div>
+    <div></div>
+    <div></div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-013.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-013.html
new file mode 100644
index 0000000..37bdfb0
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-013.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks with multiple tracks.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="match" href="row-auto-repeat-013-ref.html">
+<style>
+.masonry {
+  display: masonry;
+  border: solid thick;
+  masonry-direction: row;
+  grid-template-rows: 10px 20px repeat(auto-fill, 30px 40px) 50px 60px;
+  height: 300px;
+  background: pink;
+}
+.masonry > :nth-child(2n) {
+  background: sienna;
+}
+.masonry > :nth-child(2n+1) {
+  background: orange;
+}
+.masonry > div {
+  width: 25px;
+  height: 100%;
+}
+.holder {
+  height: 300px;
+  width: 50px;
+  border-bottom: 2px solid #cfbfcf;
+}
+</style>
+<p>The test passes if it has the same visual effect as reference.</p>
+<div class="holder">
+  <div class="masonry">
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+  </div>
+</div>
+
+<div class="holder">
+  <div class="masonry">
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div></div>
+    <div style="grid-row: 7;"></div>
+  </div>
+</div>
+
+<div class="holder">
+  <div class="masonry">
+    <div style="grid-row: 2;"></div>
+    <div></div>
+    <div style="grid-row: 5;"></div>
+    <div></div>
+    <div></div>
+    <div></div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-014-ref.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-014-ref.html
new file mode 100644
index 0000000..6c34d2f3
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-014-ref.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html>
+<style>
+.grid {
+  display: inline-grid;
+  border: 1px solid black;
+  grid-template-rows: [u] repeat(auto-fill, [v] 10px [w] 10px [x] 10px [y]) [z];
+  grid-row-gap: 3px;
+  width: min-content;
+  /* Does not fit a whole-number of repetitions */
+  height: 94px;
+  background: pink;
+}
+div > div {
+  background: blue;
+  width: 25px;
+  height: 100%;
+}
+</style>
+<body>
+    <!-- u -->
+    <div class="grid">
+        <div style="grid-row-start: u"></div>
+    </div>
+    <!-- non-existent line name -->
+    <div class="grid">
+        <div style="grid-row-start: nonesuch"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: u 1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: u -1"></div>
+    </div>
+    <!-- Also non-existent, there is only one u -->
+    <div class="grid">
+        <div style="grid-row-start: u 4"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: u 9"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: u 2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: u -2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: u -6"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: u -7"></div>
+    </div>
+    <!-- v -->
+    <div class="grid">
+        <div style="grid-row-start: v"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: v 1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: v 2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: v -1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: v -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two v's -->
+    <div class="grid">
+        <div style="grid-row-start: v 3"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: v -3"></div>
+    </div>
+    <!-- w -->
+    <div class="grid">
+        <div style="grid-row-start: w"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: w 1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: w 2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: w -1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: w -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two w's -->
+    <div class="grid">
+        <div style="grid-row-start: w 3"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: w -3"></div>
+    </div>
+    <!-- x -->
+    <div class="grid">
+        <div style="grid-row-start: x"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: x 1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: x 2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: x -1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: x -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two x's -->
+    <div class="grid">
+        <div style="grid-row-start: x 3"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: x -3"></div>
+    </div>
+    <!-- y -->
+    <div class="grid">
+        <div style="grid-row-start: y"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: y 1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: y 2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: y -1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: y -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two y's -->
+    <div class="grid">
+        <div style="grid-row-start: y -3"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: y 3"></div>
+    </div>
+    <!-- z -->
+    <div class="grid">
+        <div style="grid-row-start: z"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: z 1"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: z -1"></div>
+    </div>
+    <!-- Also non-existent, there is only one z -->
+    <div class="grid">
+        <div style="grid-row-start: z 2"></div>
+    </div>
+    <div class="grid">
+        <div style="grid-row-start: z -2"></div>
+    </div>
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-014.html b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-014.html
new file mode 100644
index 0000000..67d6c7d
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-masonry/row-auto-repeat-014.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html>
+<title>Auto repeat tracks with multiple tracks and line names.</title>
+<link rel="help" href="https://drafts.csswg.org/css-grid-3">
+<link rel="author" title="Alison Maher" href="mailto:almaher@microsoft.com">
+<link rel="match" href="row-auto-repeat-014-ref.html">
+<style>
+.masonry {
+  display: inline-masonry;
+  border: 1px solid black;
+  grid-template-rows: [u] repeat(auto-fill, [v] 10px [w] 10px [x] 10px [y]) [z];
+  masonry-direction: row;
+  grid-row-gap: 3px;
+  width: min-content;
+  /* Does not fit a whole-number of repetitions */
+  height: 94px;
+  background: pink;
+}
+div > div {
+  background: blue;
+  width: 25px;
+  height: 100%;
+}
+</style>
+<body>
+    <!-- u -->
+    <div class="masonry">
+        <div style="grid-row-start: u"></div>
+    </div>
+    <!-- non-existent line name -->
+    <div class="masonry">
+        <div style="grid-row-start: nonesuch"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: u 1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: u -1"></div>
+    </div>
+    <!-- Also non-existent, there is only one u -->
+    <div class="masonry">
+        <div style="grid-row-start: u 4"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: u 9"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: u 2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: u -2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: u -6"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: u -7"></div>
+    </div>
+    <!-- v -->
+    <div class="masonry">
+        <div style="grid-row-start: v"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: v 1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: v 2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: v -1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: v -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two v's -->
+    <div class="masonry">
+        <div style="grid-row-start: v 3"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: v -3"></div>
+    </div>
+    <!-- w -->
+    <div class="masonry">
+        <div style="grid-row-start: w"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: w 1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: w 2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: w -1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: w -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two w's -->
+    <div class="masonry">
+        <div style="grid-row-start: w 3"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: w -3"></div>
+    </div>
+    <!-- x -->
+    <div class="masonry">
+        <div style="grid-row-start: x"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: x 1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: x 2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: x -1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: x -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two x's -->
+    <div class="masonry">
+        <div style="grid-row-start: x 3"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: x -3"></div>
+    </div>
+    <!-- y -->
+    <div class="masonry">
+        <div style="grid-row-start: y"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: y 1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: y 2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: y -1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: y -2"></div>
+    </div>
+    <!-- Also non-existent, there are only two y's -->
+    <div class="masonry">
+        <div style="grid-row-start: y -3"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: y 3"></div>
+    </div>
+    <!-- z -->
+    <div class="masonry">
+        <div style="grid-row-start: z"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: z 1"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: z -1"></div>
+    </div>
+    <!-- Also non-existent, there is only one z -->
+    <div class="masonry">
+        <div style="grid-row-start: z 2"></div>
+    </div>
+    <div class="masonry">
+        <div style="grid-row-start: z -2"></div>
+    </div>
+</body>
diff --git a/third_party/boringssl/src b/third_party/boringssl/src
index f51d8b0..6f1a411 160000
--- a/third_party/boringssl/src
+++ b/third_party/boringssl/src
@@ -1 +1 @@
-Subproject commit f51d8b099832f805022a6ff2e9466dbcacdfb0ab
+Subproject commit 6f1a411710141bb3c0c3755bf3da38d99a3a9bfe
diff --git a/third_party/catapult b/third_party/catapult
index a03b709..43a00ab 160000
--- a/third_party/catapult
+++ b/third_party/catapult
@@ -1 +1 @@
-Subproject commit a03b70978cc52840b549947f0fb165f03764c700
+Subproject commit 43a00ab5a2b6f86c9eaeb00fef1cea6ba0e7db20
diff --git a/third_party/chromevox/BUILD.gn b/third_party/chromevox/BUILD.gn
deleted file mode 100644
index 7cc7b966..0000000
--- a/third_party/chromevox/BUILD.gn
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2014 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import("//build/config/chromeos/ui_mode.gni")
-import("//chromecast/chromecast.gni")
-
-assert(is_chromeos_ash || is_castos)
-
-chromevox_out_dir = "$root_out_dir/resources/chromeos/accessibility/chromevox"
-
-group("chromevox_third_party_resources") {
-  deps = [ ":chromevox_third_party_background_resources" ]
-}
-
-copy("chromevox_third_party_background_resources") {
-  sources = [ "third_party/sre/sre_browser.js" ]
-  outputs = [ "$chromevox_out_dir/third_party/sre/{{source_file_part}}" ]
-}
diff --git a/third_party/chromevox/third_party/sre/README.chromium b/third_party/chromevox/third_party/sre/README.chromium
index 4e69ae1..e4c7ce70f 100644
--- a/third_party/chromevox/third_party/sre/README.chromium
+++ b/third_party/chromevox/third_party/sre/README.chromium
@@ -19,3 +19,8 @@
 Local Modifications:
 - The lone js file is the packed browser version of SRE.
 - All XMLHttpRequest calls were removed.
+- One instance of `$jscomp.global` was changed to `globalThis` to avoid runtime
+errors.
+- We added a call to Object.defineProperty(d,"parentNode",...) to avoid runtime
+errors when setting the `parentNode` property.
+- SRE is explicitly exported since it is imported into ChromeVox as a module.
diff --git a/third_party/chromevox/third_party/sre/sre_browser.js b/third_party/chromevox/third_party/sre/sre_browser.js
index 198fad3..d4602a0 100644
--- a/third_party/chromevox/third_party/sre/sre_browser.js
+++ b/third_party/chromevox/third_party/sre/sre_browser.js
@@ -2,7 +2,11 @@
 $jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.symbolCounter_=0;$jscomp.Symbol=function(a){return $jscomp.SYMBOL_PREFIX+(a||"")+$jscomp.symbolCounter_++};
 $jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var a=$jscomp.global.Symbol.iterator;a||(a=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&$jscomp.defineProperty(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(a){var b=0;return $jscomp.iteratorPrototype(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})};
 $jscomp.iteratorPrototype=function(a){$jscomp.initSymbolIterator();a={next:a};a[$jscomp.global.Symbol.iterator]=function(){return this};return a};$jscomp.array=$jscomp.array||{};$jscomp.iteratorFromArray=function(a,b){$jscomp.initSymbolIterator();a instanceof String&&(a+="");var c=0,d={next:function(){if(c<a.length){var e=c++;return{value:b(e,a[e]),done:!1}}d.next=function(){return{done:!0,value:void 0}};return d.next()}};d[Symbol.iterator]=function(){return d};return d};
-$jscomp.polyfill=function(a,b,c,d){if(b){c=$jscomp.global;a=a.split(".");for(d=0;d<a.length-1;d++){var e=a[d];e in c||(c[e]={});c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&$jscomp.defineProperty(c,a,{configurable:!0,writable:!0,value:b})}};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var d=a.length,e=0;e<d;e++){var f=a[e];if(b.call(c,f,e,a))return{i:e,v:f}}return{i:-1,v:void 0}};
+$jscomp.polyfill=function(a,b,c,d){if(b){
+// Local modification.
+c=globalThis;
+// End local modification.
+a=a.split(".");for(d=0;d<a.length-1;d++){var e=a[d];e in c||(c[e]={});c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&$jscomp.defineProperty(c,a,{configurable:!0,writable:!0,value:b})}};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var d=a.length,e=0;e<d;e++){var f=a[e];if(b.call(c,f,e,a))return{i:e,v:f}}return{i:-1,v:void 0}};
 $jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(a,c){return $jscomp.findInternal(this,a,c).v}},"es6-impl","es3");$jscomp.checkStringArgs=function(a,b,c){if(null==a)throw new TypeError("The 'this' value for String.prototype."+c+" must not be null or undefined");if(b instanceof RegExp)throw new TypeError("First argument to String.prototype."+c+" must not be a regular expression");return a+""};var COMPILED=!0,goog=goog||{};goog.global=this;
 goog.isDef=function(a){return void 0!==a};goog.exportPath_=function(a,b,c){a=a.split(".");c=c||goog.global;a[0]in c||!c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]&&Object.prototype.hasOwnProperty.call(c,d)?c[d]:c[d]={}};
 goog.define=function(a,b){var c=b;COMPILED||(goog.global.CLOSURE_UNCOMPILED_DEFINES&&Object.prototype.hasOwnProperty.call(goog.global.CLOSURE_UNCOMPILED_DEFINES,a)?c=goog.global.CLOSURE_UNCOMPILED_DEFINES[a]:goog.global.CLOSURE_DEFINES&&Object.prototype.hasOwnProperty.call(goog.global.CLOSURE_DEFINES,a)&&(c=goog.global.CLOSURE_DEFINES[a]));goog.exportPath_(a,c)};goog.DEBUG=!0;goog.LOCALE="en";goog.TRUSTED_SITE=!0;goog.STRICT_MODE_COMPATIBLE=!1;goog.DISALLOW_TEST_ONLY_CODE=COMPILED&&!goog.DEBUG;
@@ -413,7 +417,11 @@
 sre.CaseEmbellished.prototype.getFencesMml_=function(){for(var a=this.semantic,b=Object.keys(this.ofenceMap),c=Object.keys(this.cfenceMap);!(this.ofenceMml&&this.cfenceMml||a===this.fenced);)-1===b.indexOf(a.fencePointer)||this.ofenceMml||(this.ofenceMml=a.mathmlTree),-1===c.indexOf(a.fencePointer)||this.cfenceMml||(this.cfenceMml=a.mathmlTree),a=a.childNodes[0];this.ofenceMml||(this.ofenceMml=this.ofence.mathmlTree);this.cfenceMml||(this.cfenceMml=this.cfence.mathmlTree);this.ofenceMml&&(this.ofenceMml=
 sre.EnrichMathml.ascendNewNode(this.ofenceMml));this.cfenceMml&&(this.cfenceMml=sre.EnrichMathml.ascendNewNode(this.cfenceMml))};
 sre.CaseEmbellished.prototype.rewrite_=function(){var a=this.semantic,b=null,c=this.introduceNewLayer_();for(sre.EnrichMathml.setAttributes(c,this.fenced.parent);a.type!==sre.SemanticAttr.Type.FENCED;){var d=a.mathmlTree,e=this.specialCase_(a,d);if(e)a=e;else{sre.EnrichMathml.setAttributes(d,a);for(var e=[],f=1,g;g=a.childNodes[f];f++)e.push(sre.EnrichMathml.walkTree(g));a=a.childNodes[0]}e=sre.DomUtil.createElement("dummy");f=c.parentNode;g=d.childNodes[0];sre.DomUtil.replaceNode(d,e);sre.DomUtil.replaceNode(c,
-d);sre.DomUtil.replaceNode(d.childNodes[0],c);sre.DomUtil.replaceNode(e,g);d.parentNode=f;c=d.childNodes[0];b||(b=d)}sre.EnrichMathml.walkTree(this.ofence);sre.EnrichMathml.walkTree(this.cfence);this.cleanupParents_();return b||c};
+d);sre.DomUtil.replaceNode(d.childNodes[0],c);sre.DomUtil.replaceNode(e,g);
+// Local modification.
+Object.defineProperty(d,"parentNode",{value:f,writable:true});
+// End local modification.
+d.parentNode=f;d.parentNode=f;c=d.childNodes[0];b||(b=d)}sre.EnrichMathml.walkTree(this.ofence);sre.EnrichMathml.walkTree(this.cfence);this.cleanupParents_();return b||c};
 sre.CaseEmbellished.prototype.specialCase_=function(a,b){var c=sre.DomUtil.tagName(b),d=null,e;"MSUBSUP"===c?(d=a.childNodes[0],e=sre.CaseDoubleScript):"MMULTISCRIPTS"===c&&(a.type===sre.SemanticAttr.Type.SUPERSCRIPT||a.type===sre.SemanticAttr.Type.SUBSCRIPT?e=sre.CaseMultiscripts:a.type===sre.SemanticAttr.Type.TENSOR&&(e=sre.CaseTensor),d=e&&a.childNodes[0]&&a.childNodes[0].role===sre.SemanticAttr.Role.SUBSUP?a.childNodes[0]:a);if(!d)return null;var c=d.childNodes[0],f=sre.CaseEmbellished.makeEmptyNode_(c.id);
 d.childNodes[0]=f;b=(new e(a)).getMathml();d.childNodes[0]=c;this.parentCleanup.push(b);return d.childNodes[0]};sre.CaseEmbellished.makeEmptyNode_=function(a){var b=sre.DomUtil.createElement("mrow");a=new sre.SemanticNode(a);a.type=sre.SemanticAttr.Type.EMPTY;a.mathmlTree=b;return a};
 sre.CaseEmbellished.prototype.introduceNewLayer_=function(){var a=this.fullFence(this.ofenceMml),b=this.fullFence(this.cfenceMml),c=sre.DomUtil.createElement("mrow");sre.DomUtil.replaceNode(this.fencedMml,c);c.appendChild(this.fencedMml);c.insertBefore(a,this.fencedMml);c.appendChild(b);if(!c.parentNode){for(a=sre.DomUtil.createElement("mrow");0<c.childNodes.length;)a.appendChild(c.childNodes[0]);c.appendChild(a);c=a}return c};
@@ -1153,3 +1161,6 @@
 sre.System.prototype.processFileAsync_=function(a,b,c){sre.System.getInstance().inputFileAsync_(b,goog.bind(function(b){b=a(b);c?sre.SystemExternal.fs.writeFile(c,b,function(a){if(a)throw new sre.System.Error("Can not write to file: "+c);}):console.log(b)},this))};
 sre.System.prototype.walk=function(a){var b=sre.SpeechGeneratorFactory.generator("Node");sre.System.LocalStorage_.getInstance().speechGenerator=b;var c=sre.HighlighterFactory.highlighter({color:"black"},{color:"white"},{renderer:"NativeMML"});a=sre.System.getInstance().toEnriched(a);var d=(new sre.SystemExternal.xmldom.XMLSerializer).serializeToString(a);sre.System.LocalStorage_.getInstance().walker=sre.WalkerFactory.walker(sre.Engine.getInstance().walker,a,b,c,d);return sre.System.LocalStorage_.getInstance().walker.speech()};
 sre.System.prototype.move=function(a){if(!sre.System.LocalStorage_.getInstance().walker)return null;var b="string"===typeof a?sre.EventUtil.KeyCode[a.toUpperCase()]:a;return!1===sre.System.LocalStorage_.getInstance().walker.move(b)?sre.AuralRendering.getInstance().error(a):sre.System.LocalStorage_.getInstance().walker.speech()};sre.Browser={};sre.System.getInstance().setupEngine({mode:sre.Engine.Mode.HTTP,domain:"mathspeak",style:"default",semantics:!0});var SRE=sre.System.getInstance();
+// Local modification.
+export {SRE};
+// End local modification.
diff --git a/third_party/chromite b/third_party/chromite
index f561aa9..341c29a 160000
--- a/third_party/chromite
+++ b/third_party/chromite
@@ -1 +1 @@
-Subproject commit f561aa984b9604d341687dba237ab5c11af171e4
+Subproject commit 341c29acc0a4e66ced602961622ad06a434de62d
diff --git a/third_party/crossbench b/third_party/crossbench
index c7a48f4..43e6d12 160000
--- a/third_party/crossbench
+++ b/third_party/crossbench
@@ -1 +1 @@
-Subproject commit c7a48f4524307e279ed2b82b97aa1a43cfa600f6
+Subproject commit 43e6d12f78b1e9132b9a153dc791488eb78c3fe8
diff --git a/third_party/dawn b/third_party/dawn
index 40b32e9..119b922 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit 40b32e94113dfd8da971f93adf46eafa7025b36d
+Subproject commit 119b9226d771fcb04a4154f7e686bd284b79cd94
diff --git a/third_party/depot_tools b/third_party/depot_tools
index 8f87843..ea7a0ba 160000
--- a/third_party/depot_tools
+++ b/third_party/depot_tools
@@ -1 +1 @@
-Subproject commit 8f878438075a8d5d76f57bd10ab866d58d706319
+Subproject commit ea7a0baff0d8554cf6d38f525b4e7882c2b4ec18
diff --git a/third_party/libyuv b/third_party/libyuv
index 61bdaee..88798bc 160000
--- a/third_party/libyuv
+++ b/third_party/libyuv
@@ -1 +1 @@
-Subproject commit 61bdaee13a701d2b52c6dc943ccc5c888077a591
+Subproject commit 88798bcd636a93e92d69242da914deb4cec1dfb6
diff --git a/third_party/perfetto b/third_party/perfetto
index 0028ac0..18d4fdc 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit 0028ac091740d391b1dfc6f7b0171a6c25ed5bbb
+Subproject commit 18d4fdc15d027a989db705592585b924f93f1d42
diff --git a/third_party/rust/autocfg/v1/BUILD.gn b/third_party/rust/autocfg/v1/BUILD.gn
index 88024b2..b4d715c 100644
--- a/third_party/rust/autocfg/v1/BUILD.gn
+++ b/third_party/rust/autocfg/v1/BUILD.gn
@@ -28,7 +28,7 @@
   cargo_pkg_authors = "Josh Stone <cuviper@gmail.com>"
   cargo_pkg_name = "autocfg"
   cargo_pkg_description = "Automatic cfg for Rust compiler features"
-  cargo_pkg_version = "1.4.0"
+  cargo_pkg_version = "1.5.0"
 
   allow_unsafe = false
 
diff --git a/third_party/rust/autocfg/v1/README.chromium b/third_party/rust/autocfg/v1/README.chromium
index 1be9b66..67b220f 100644
--- a/third_party/rust/autocfg/v1/README.chromium
+++ b/third_party/rust/autocfg/v1/README.chromium
@@ -1,7 +1,7 @@
 Name: autocfg
 URL: https://crates.io/crates/autocfg
-Version: 1.4.0
-Revision: d07df6624a4573803a29397c0ccf636aa0b3d153
+Version: 1.5.0
+Revision: d912169ed67977efe5a465269b0e73cb66060c49
 License: Apache-2.0
 License File: //third_party/rust/chromium_crates_io/vendor/autocfg-v1/LICENSE-APACHE
 Shipped: yes
diff --git a/third_party/rust/chromium_crates_io/Cargo.lock b/third_party/rust/chromium_crates_io/Cargo.lock
index 1b003f3..a62fb95 100644
--- a/third_party/rust/chromium_crates_io/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/Cargo.lock
@@ -27,7 +27,7 @@
 
 [[package]]
 name = "autocfg"
-version = "1.4.0"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
diff --git a/third_party/rust/chromium_crates_io/supply-chain/config.toml b/third_party/rust/chromium_crates_io/supply-chain/config.toml
index d1c4f95..dde3b7a 100644
--- a/third_party/rust/chromium_crates_io/supply-chain/config.toml
+++ b/third_party/rust/chromium_crates_io/supply-chain/config.toml
@@ -53,7 +53,7 @@
 [policy."arbitrary:1.4.1"]
 criteria = []
 
-[policy."autocfg:1.4.0"]
+[policy."autocfg:1.5.0"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
 [policy."base64:0.22.1"]
diff --git a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/.cargo_vcs_info.json
index 4764525..80087c7 100644
--- a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/.cargo_vcs_info.json
+++ b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/.cargo_vcs_info.json
@@ -1,6 +1,6 @@
 {
   "git": {
-    "sha1": "d07df6624a4573803a29397c0ccf636aa0b3d153"
+    "sha1": "d912169ed67977efe5a465269b0e73cb66060c49"
   },
   "path_in_vcs": ""
 }
\ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/Cargo.lock
index c6d558c0..45f1f18 100644
--- a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/Cargo.lock
@@ -2,5 +2,5 @@
 # It is not intended for manual editing.
 [[package]]
 name = "autocfg"
-version = "1.4.0"
+version = "1.5.0"
 
diff --git a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/Cargo.toml
index a1cbc7cb..005f56dc 100644
--- a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/Cargo.toml
@@ -12,10 +12,11 @@
 [package]
 rust-version = "1.0"
 name = "autocfg"
-version = "1.4.0"
+version = "1.5.0"
 authors = ["Josh Stone <cuviper@gmail.com>"]
 build = false
 exclude = ["/.github/**"]
+autolib = false
 autobins = false
 autoexamples = false
 autotests = false
diff --git a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/Cargo.toml.orig
index 83cf1301..75b34ea 100644
--- a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/Cargo.toml.orig
+++ b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "autocfg"
-version = "1.4.0"
+version = "1.5.0"
 authors = ["Josh Stone <cuviper@gmail.com>"]
 license = "Apache-2.0 OR MIT"
 repository = "https://github.com/cuviper/autocfg"
diff --git a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/README.md b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/README.md
index d8985b2..a3d8ac4 100644
--- a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/README.md
+++ b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/README.md
@@ -4,7 +4,7 @@
 [![autocfg crate](https://img.shields.io/crates/v/autocfg.svg)](https://crates.io/crates/autocfg)
 [![autocfg documentation](https://docs.rs/autocfg/badge.svg)](https://docs.rs/autocfg)
 ![minimum rustc 1.0](https://img.shields.io/badge/rustc-1.0+-red.svg)
-![build status](https://github.com/cuviper/autocfg/workflows/master/badge.svg)
+![build status](https://github.com/cuviper/autocfg/workflows/CI/badge.svg)
 
 A Rust library for build scripts to automatically configure code based on
 compiler support.  Code snippets are dynamically tested to see if the `rustc`
@@ -43,6 +43,11 @@
 
 ## Release Notes
 
+- 1.5.0 (2025-06-17)
+
+  - Add `edition` and `set_edition` to control the Rust edition used in probes.
+  - Remove probe result files so they don't pollute the output directory.
+
 - 1.4.0 (2024-09-26)
 
   - Add `emit_possibility` for Rust 1.80's [checked cfgs], and call that
diff --git a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/src/lib.rs
index fc3c59b..69e6ffcf 100644
--- a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/src/lib.rs
+++ b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/src/lib.rs
@@ -91,6 +91,7 @@
     rustc_version: Version,
     target: Option<OsString>,
     no_std: bool,
+    edition: Option<String>,
     rustflags: Vec<String>,
     uuid: u64,
 }
@@ -203,11 +204,12 @@
             rustc_version: rustc_version,
             target: target,
             no_std: false,
+            edition: None,
             uuid: new_uuid(),
         };
 
         // Sanity check with and without `std`.
-        if !ac.probe_raw("").is_ok() {
+        if ac.probe_raw("").is_err() {
             if ac.probe_raw("#![no_std]").is_ok() {
                 ac.no_std = true;
             } else {
@@ -246,6 +248,36 @@
         self.no_std = no_std;
     }
 
+    /// Returns the `--edition` string that is currently being passed to `rustc`, if any,
+    /// as configured by the [`set_edition`][Self::set_edition] method.
+    pub fn edition(&self) -> Option<&str> {
+        match self.edition {
+            Some(ref edition) => Some(&**edition),
+            None => None,
+        }
+    }
+
+    /// Sets the `--edition` string that will be passed to `rustc`,
+    /// or `None` to leave the compiler at its default edition.
+    ///
+    /// See also [The Rust Edition Guide](https://doc.rust-lang.org/edition-guide/).
+    ///
+    /// **Warning:** Setting an unsupported edition will likely cause **all** subsequent probes to
+    /// fail! As of this writing, the known editions and their minimum Rust versions are:
+    ///
+    /// | Edition | Version    |
+    /// | ------- | ---------- |
+    /// | 2015    | 1.27.0[^1] |
+    /// | 2018    | 1.31.0     |
+    /// | 2021    | 1.56.0     |
+    /// | 2024    | 1.85.0     |
+    ///
+    /// [^1]: Prior to 1.27.0, Rust was effectively 2015 Edition by default, but the concept hadn't
+    /// been established yet, so the explicit `--edition` flag wasn't supported either.
+    pub fn set_edition(&mut self, edition: Option<String>) {
+        self.edition = edition;
+    }
+
     /// Tests whether the current `rustc` reports a version greater than
     /// or equal to "`major`.`minor`".
     pub fn probe_rustc_version(&self, major: usize, minor: usize) -> bool {
@@ -272,15 +304,20 @@
     }
 
     fn probe_fmt<'a>(&self, source: Arguments<'a>) -> Result<(), Error> {
+        let crate_name = self.new_crate_name();
         let mut command = self.rustc.command();
         command
             .arg("--crate-name")
-            .arg(self.new_crate_name())
+            .arg(&crate_name)
             .arg("--crate-type=lib")
             .arg("--out-dir")
             .arg(&self.out_dir)
             .arg("--emit=llvm-ir");
 
+        if let Some(edition) = self.edition.as_ref() {
+            command.arg("--edition").arg(edition);
+        }
+
         if let Some(target) = self.target.as_ref() {
             command.arg("--target").arg(target);
         }
@@ -295,7 +332,16 @@
         drop(stdin);
 
         match child.wait() {
-            Ok(status) if status.success() => Ok(()),
+            Ok(status) if status.success() => {
+                // Try to remove the output file so it doesn't look like a build product for
+                // systems like bazel -- but this is best-effort, so we can ignore failure.
+                // The probe itself is already considered successful at this point.
+                let mut file = self.out_dir.join(crate_name);
+                file.set_extension("ll");
+                let _ = fs::remove_file(file);
+
+                Ok(())
+            }
             Ok(status) => Err(error::from_exit(status)),
             Err(error) => Err(error::from_io(error)),
         }
diff --git a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/tests/tests.rs b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/tests/tests.rs
index de2b18cc..bd069ee4 100644
--- a/third_party/rust/chromium_crates_io/vendor/autocfg-v1/tests/tests.rs
+++ b/third_party/rust/chromium_crates_io/vendor/autocfg-v1/tests/tests.rs
@@ -136,3 +136,54 @@
         .probe_raw(&f("#![deny(dead_code)] pub fn x() {}"))
         .is_ok());
 }
+
+#[test]
+fn probe_cleanup() {
+    let dir = support::out_dir().join("autocfg_test_probe_cleanup");
+    std::fs::create_dir(&dir).unwrap();
+
+    let ac = AutoCfg::with_dir(&dir).unwrap();
+    assert!(ac.probe_type("i32"));
+
+    // NB: this is not `remove_dir_all`, so it will only work if the directory
+    // is empty -- i.e. the probe should have removed any output files.
+    std::fs::remove_dir(&dir).unwrap();
+}
+
+#[test]
+fn editions() {
+    let mut ac = autocfg_for_test();
+    assert!(ac.edition().is_none());
+    assert!(ac.probe_raw("").is_ok());
+
+    for (edition, minor) in vec![(2015, 27), (2018, 31), (2021, 56), (2024, 85)] {
+        let edition = edition.to_string();
+        ac.set_edition(Some(edition.clone()));
+        assert_eq!(ac.edition(), Some(&*edition));
+        assert_min(&ac, 1, minor, ac.probe_raw("").is_ok());
+    }
+
+    ac.set_edition(Some("invalid".into()));
+    assert_eq!(ac.edition(), Some("invalid"));
+    assert!(ac.probe_raw("").is_err());
+
+    ac.set_edition(None);
+    assert!(ac.edition().is_none());
+    assert!(ac.probe_raw("").is_ok());
+}
+
+#[test]
+fn edition_keyword_try() {
+    let mut ac = autocfg_for_test();
+
+    if ac.probe_rustc_version(1, 27) {
+        ac.set_edition(Some(2015.to_string()));
+    }
+    assert!(ac.probe_expression("{ let try = 0; try }"));
+
+    if ac.probe_rustc_version(1, 31) {
+        ac.set_edition(Some(2018.to_string()));
+        assert!(!ac.probe_expression("{ let try = 0; try }"));
+        assert!(ac.probe_expression("{ let r#try = 0; r#try }"));
+    }
+}
diff --git a/third_party/rust/icu_calendar_data/v2/BUILD.gn b/third_party/rust/icu_calendar_data/v2/BUILD.gn
index 6e56a4f3..f3472e3 100644
--- a/third_party/rust/icu_calendar_data/v2/BUILD.gn
+++ b/third_party/rust/icu_calendar_data/v2/BUILD.gn
@@ -16,16 +16,10 @@
   sources = [ "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/lib.rs" ]
   inputs = [
     "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/../data/calendar_chinese_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/../data/calendar_chinese_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/../data/calendar_dangi_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/../data/calendar_dangi_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/../data/calendar_hijri_simulated_mecca_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/../data/calendar_hijri_simulated_mecca_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/../data/calendar_japanese_extended_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/../data/calendar_japanese_extended_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/../data/calendar_japanese_modern_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/../data/calendar_japanese_modern_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/../data/calendar_week_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/../data/calendar_week_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_calendar_data-v2/src/../data/mod.rs",
   ]
diff --git a/third_party/rust/icu_casemap_data/v2/BUILD.gn b/third_party/rust/icu_casemap_data/v2/BUILD.gn
index e9619064..4fb796b 100644
--- a/third_party/rust/icu_casemap_data/v2/BUILD.gn
+++ b/third_party/rust/icu_casemap_data/v2/BUILD.gn
@@ -16,8 +16,6 @@
   sources = [ "//third_party/rust/chromium_crates_io/vendor/icu_casemap_data-v2/src/lib.rs" ]
   inputs = [
     "//third_party/rust/chromium_crates_io/vendor/icu_casemap_data-v2/src/../data/case_map_unfold_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_casemap_data-v2/src/../data/case_map_unfold_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_casemap_data-v2/src/../data/case_map_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_casemap_data-v2/src/../data/case_map_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_casemap_data-v2/src/../data/mod.rs",
   ]
diff --git a/third_party/rust/icu_decimal_data/v2/BUILD.gn b/third_party/rust/icu_decimal_data/v2/BUILD.gn
index 83cf4ed..67f80d68 100644
--- a/third_party/rust/icu_decimal_data/v2/BUILD.gn
+++ b/third_party/rust/icu_decimal_data/v2/BUILD.gn
@@ -16,8 +16,6 @@
   sources = [ "//third_party/rust/chromium_crates_io/vendor/icu_decimal_data-v2/src/lib.rs" ]
   inputs = [
     "//third_party/rust/chromium_crates_io/vendor/icu_decimal_data-v2/src/../data/decimal_digits_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_decimal_data-v2/src/../data/decimal_digits_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_decimal_data-v2/src/../data/decimal_symbols_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_decimal_data-v2/src/../data/decimal_symbols_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_decimal_data-v2/src/../data/mod.rs",
   ]
diff --git a/third_party/rust/icu_experimental_data/v0_3/BUILD.gn b/third_party/rust/icu_experimental_data/v0_3/BUILD.gn
index eb43e8f..2f378802 100644
--- a/third_party/rust/icu_experimental_data/v0_3/BUILD.gn
+++ b/third_party/rust/icu_experimental_data/v0_3/BUILD.gn
@@ -16,93 +16,49 @@
   sources = [ "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/lib.rs" ]
   inputs = [
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/currency_displayname_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/currency_displayname_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/currency_essentials_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/currency_essentials_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/currency_extended_data_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/currency_extended_data_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/currency_patterns_data_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/currency_patterns_data_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/digital_duration_data_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/digital_duration_data_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/language_display_names_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/language_display_names_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/locale_display_names_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/locale_display_names_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_compact_decimal_format_data_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_compact_decimal_format_data_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_day_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_day_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_hour_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_hour_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_minute_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_minute_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_month_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_month_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_quarter_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_quarter_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_second_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_second_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_week_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_week_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_year_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/long_year_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/mod.rs",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_day_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_day_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_hour_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_hour_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_minute_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_minute_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_month_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_month_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_quarter_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_quarter_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_second_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_second_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_week_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_week_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_year_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/narrow_year_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/percent_essentials_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/percent_essentials_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/person_names_format_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/person_names_format_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/region_display_names_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/region_display_names_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/script_display_names_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/script_display_names_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_compact_decimal_format_data_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_compact_decimal_format_data_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_currency_compact_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_currency_compact_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_day_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_day_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_hour_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_hour_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_minute_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_minute_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_month_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_month_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_quarter_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_quarter_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_second_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_second_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_week_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_week_relative_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_year_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/short_year_relative_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/transliterator_rules_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/transliterator_rules_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/units_display_name_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/units_display_name_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/units_essentials_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/units_essentials_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/units_info_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/units_info_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/units_trie_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/units_trie_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/variant_display_names_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_experimental_data-v0_3/src/../data/variant_display_names_v1.rs.data",
   ]
 
diff --git a/third_party/rust/icu_list_data/v2/BUILD.gn b/third_party/rust/icu_list_data/v2/BUILD.gn
index d2323d0..793a630 100644
--- a/third_party/rust/icu_list_data/v2/BUILD.gn
+++ b/third_party/rust/icu_list_data/v2/BUILD.gn
@@ -19,10 +19,7 @@
   ]
   inputs = [
     "//third_party/rust/chromium_crates_io/vendor/icu_list_data-v2/src/../data/list_and_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_list_data-v2/src/../data/list_and_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_list_data-v2/src/../data/list_or_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_list_data-v2/src/../data/list_or_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_list_data-v2/src/../data/list_unit_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_list_data-v2/src/../data/list_unit_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_list_data-v2/src/../data/mod.rs",
   ]
diff --git a/third_party/rust/icu_locale_data/v2/BUILD.gn b/third_party/rust/icu_locale_data/v2/BUILD.gn
index 598bed0..3883310d 100644
--- a/third_party/rust/icu_locale_data/v2/BUILD.gn
+++ b/third_party/rust/icu_locale_data/v2/BUILD.gn
@@ -16,26 +16,15 @@
   sources = [ "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/lib.rs" ]
   inputs = [
     "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_aliases_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_aliases_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_exemplar_characters_auxiliary_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_exemplar_characters_auxiliary_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_exemplar_characters_index_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_exemplar_characters_index_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_exemplar_characters_main_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_exemplar_characters_main_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_exemplar_characters_numbers_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_exemplar_characters_numbers_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_exemplar_characters_punctuation_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_exemplar_characters_punctuation_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_likely_subtags_extended_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_likely_subtags_extended_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_likely_subtags_language_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_likely_subtags_language_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_likely_subtags_script_region_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_likely_subtags_script_region_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_parents_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_parents_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_script_direction_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/locale_script_direction_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_locale_data-v2/src/../data/mod.rs",
   ]
diff --git a/third_party/rust/icu_normalizer_data/v2/BUILD.gn b/third_party/rust/icu_normalizer_data/v2/BUILD.gn
index 30c0c9b..c25f53b1c 100644
--- a/third_party/rust/icu_normalizer_data/v2/BUILD.gn
+++ b/third_party/rust/icu_normalizer_data/v2/BUILD.gn
@@ -17,18 +17,11 @@
   inputs = [
     "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/mod.rs",
     "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_nfc_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_nfc_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_nfd_data_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_nfd_data_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_nfd_supplement_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_nfd_supplement_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_nfd_tables_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_nfd_tables_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_nfkd_data_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_nfkd_data_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_nfkd_tables_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_nfkd_tables_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_uts46_data_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_normalizer_data-v2/src/../data/normalizer_uts46_data_v1.rs.data",
   ]
 
diff --git a/third_party/rust/icu_plurals_data/v2/BUILD.gn b/third_party/rust/icu_plurals_data/v2/BUILD.gn
index f426d4a..f88a5e57 100644
--- a/third_party/rust/icu_plurals_data/v2/BUILD.gn
+++ b/third_party/rust/icu_plurals_data/v2/BUILD.gn
@@ -17,10 +17,7 @@
   inputs = [
     "//third_party/rust/chromium_crates_io/vendor/icu_plurals_data-v2/src/../data/mod.rs",
     "//third_party/rust/chromium_crates_io/vendor/icu_plurals_data-v2/src/../data/plurals_cardinal_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_plurals_data-v2/src/../data/plurals_cardinal_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_plurals_data-v2/src/../data/plurals_ordinal_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_plurals_data-v2/src/../data/plurals_ordinal_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_plurals_data-v2/src/../data/plurals_ranges_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_plurals_data-v2/src/../data/plurals_ranges_v1.rs.data",
   ]
 
diff --git a/third_party/rust/icu_properties_data/v2/BUILD.gn b/third_party/rust/icu_properties_data/v2/BUILD.gn
index 481ab6e7..21d58e6 100644
--- a/third_party/rust/icu_properties_data/v2/BUILD.gn
+++ b/third_party/rust/icu_properties_data/v2/BUILD.gn
@@ -17,248 +17,126 @@
   inputs = [
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/mod.rs",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_alnum_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_alnum_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_alphabetic_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_alphabetic_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_ascii_hex_digit_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_ascii_hex_digit_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_basic_emoji_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_basic_emoji_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_bidi_control_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_bidi_control_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_bidi_mirrored_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_bidi_mirrored_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_blank_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_blank_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_case_ignorable_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_case_ignorable_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_case_sensitive_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_case_sensitive_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_cased_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_cased_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_changes_when_casefolded_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_changes_when_casefolded_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_changes_when_casemapped_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_changes_when_casemapped_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_changes_when_lowercased_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_changes_when_lowercased_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_changes_when_nfkc_casefolded_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_changes_when_nfkc_casefolded_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_changes_when_titlecased_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_changes_when_titlecased_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_changes_when_uppercased_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_changes_when_uppercased_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_dash_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_dash_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_default_ignorable_code_point_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_default_ignorable_code_point_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_deprecated_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_deprecated_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_diacritic_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_diacritic_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_emoji_component_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_emoji_component_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_emoji_modifier_base_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_emoji_modifier_base_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_emoji_modifier_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_emoji_modifier_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_emoji_presentation_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_emoji_presentation_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_emoji_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_emoji_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_extended_pictographic_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_extended_pictographic_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_extender_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_extender_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_full_composition_exclusion_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_full_composition_exclusion_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_graph_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_graph_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_grapheme_base_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_grapheme_base_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_grapheme_extend_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_grapheme_extend_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_grapheme_link_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_grapheme_link_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_hex_digit_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_hex_digit_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_hyphen_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_hyphen_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_id_continue_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_id_continue_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_id_start_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_id_start_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_ideographic_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_ideographic_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_ids_binary_operator_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_ids_binary_operator_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_ids_trinary_operator_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_ids_trinary_operator_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_join_control_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_join_control_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_logical_order_exception_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_logical_order_exception_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_lowercase_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_lowercase_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_math_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_math_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_nfc_inert_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_nfc_inert_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_nfd_inert_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_nfd_inert_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_nfkc_inert_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_nfkc_inert_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_nfkd_inert_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_nfkd_inert_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_noncharacter_code_point_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_noncharacter_code_point_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_pattern_syntax_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_pattern_syntax_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_pattern_white_space_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_pattern_white_space_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_prepended_concatenation_mark_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_prepended_concatenation_mark_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_print_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_print_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_quotation_mark_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_quotation_mark_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_radical_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_radical_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_regional_indicator_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_regional_indicator_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_segment_starter_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_segment_starter_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_sentence_terminal_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_sentence_terminal_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_soft_dotted_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_soft_dotted_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_terminal_punctuation_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_terminal_punctuation_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_unified_ideograph_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_unified_ideograph_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_uppercase_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_uppercase_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_variation_selector_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_variation_selector_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_white_space_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_white_space_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_xdigit_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_xdigit_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_xid_continue_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_xid_continue_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_xid_start_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_binary_xid_start_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_bidi_class_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_bidi_class_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_bidi_mirroring_glyph_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_bidi_mirroring_glyph_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_canonical_combining_class_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_canonical_combining_class_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_east_asian_width_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_east_asian_width_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_general_category_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_general_category_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_grapheme_cluster_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_grapheme_cluster_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_hangul_syllable_type_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_hangul_syllable_type_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_indic_conjunct_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_indic_conjunct_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_indic_syllabic_category_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_indic_syllabic_category_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_joining_type_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_joining_type_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_line_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_line_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_script_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_script_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_sentence_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_sentence_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_vertical_orientation_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_vertical_orientation_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_word_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_enum_word_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_bidi_class_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_bidi_class_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_canonical_combining_class_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_canonical_combining_class_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_east_asian_width_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_east_asian_width_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_general_category_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_general_category_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_grapheme_cluster_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_grapheme_cluster_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_hangul_syllable_type_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_hangul_syllable_type_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_indic_syllabic_category_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_indic_syllabic_category_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_joining_type_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_joining_type_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_line_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_line_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_script_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_script_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_sentence_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_sentence_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_vertical_orientation_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_vertical_orientation_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_word_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_long_word_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_bidi_class_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_bidi_class_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_canonical_combining_class_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_canonical_combining_class_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_east_asian_width_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_east_asian_width_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_general_category_mask_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_general_category_mask_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_general_category_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_general_category_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_grapheme_cluster_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_grapheme_cluster_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_hangul_syllable_type_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_hangul_syllable_type_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_indic_syllabic_category_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_indic_syllabic_category_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_joining_type_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_joining_type_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_line_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_line_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_script_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_script_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_sentence_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_sentence_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_vertical_orientation_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_vertical_orientation_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_word_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_parse_word_break_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_bidi_class_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_bidi_class_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_canonical_combining_class_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_canonical_combining_class_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_east_asian_width_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_east_asian_width_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_general_category_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_general_category_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_grapheme_cluster_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_grapheme_cluster_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_hangul_syllable_type_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_hangul_syllable_type_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_indic_syllabic_category_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_indic_syllabic_category_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_joining_type_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_joining_type_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_line_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_line_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_script_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_script_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_sentence_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_sentence_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_vertical_orientation_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_vertical_orientation_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_word_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_name_short_word_break_v1.rs.data",
-    "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_script_with_extensions_v1.rs.data",
     "//third_party/rust/chromium_crates_io/vendor/icu_properties_data-v2/src/../data/property_script_with_extensions_v1.rs.data",
   ]
 
diff --git a/third_party/skia b/third_party/skia
index 23eb7ba..ee69d5d 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 23eb7ba719d9eaaec63da6d9e56b6fb28eb25b3e
+Subproject commit ee69d5d1cf0ef8f8335a57132ea7ae30e9b6f888
diff --git a/third_party/swiftshader b/third_party/swiftshader
index 0ce9bc6..ed01d99 160000
--- a/third_party/swiftshader
+++ b/third_party/swiftshader
@@ -1 +1 @@
-Subproject commit 0ce9bc68d3fc995f76dcab4771c26471100ce759
+Subproject commit ed01d9931de34d3a6fb4d615050db5080d9cea16
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index 02a9ce0..a177e95 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit 02a9ce0423c41768fdb0236f9782209b55edb358
+Subproject commit a177e95454b54fe7b81c0e2d1cc9267ba466f6ee
diff --git a/third_party/vulkan-validation-layers/src b/third_party/vulkan-validation-layers/src
index 69e6081..64bc432 160000
--- a/third_party/vulkan-validation-layers/src
+++ b/third_party/vulkan-validation-layers/src
@@ -1 +1 @@
-Subproject commit 69e6081acb3d2f55cb98ae1d5faa17b6db2044c7
+Subproject commit 64bc432edfcc8624f81dd969759f0b5b7eb63f71
diff --git a/third_party/webpagereplay b/third_party/webpagereplay
index e463cb4..f339745 160000
--- a/third_party/webpagereplay
+++ b/third_party/webpagereplay
@@ -1 +1 @@
-Subproject commit e463cb47fd355a21463d0f567ee78c0316e198d6
+Subproject commit f3397454e39a7c0b35af192e6d8a1896af7bd9ec
diff --git a/tools/crates/gnrt/lib/crates.rs b/tools/crates/gnrt/lib/crates.rs
index dad2944..9a534d0 100644
--- a/tools/crates/gnrt/lib/crates.rs
+++ b/tools/crates/gnrt/lib/crates.rs
@@ -316,12 +316,16 @@
     }
 
     /// Sorts the CrateFiles for a deterministic output.
-    fn sort(&mut self) {
-        self.sources.sort_unstable();
-        self.inputs.sort_unstable();
-        self.native_libs.sort_unstable();
-        self.build_script_sources.sort_unstable();
-        self.build_script_inputs.sort_unstable();
+    fn sort_and_dedup(&mut self) {
+        fn doit(vec: &mut Vec<PathBuf>) {
+            vec.sort_unstable();
+            vec.dedup();
+        }
+        doit(&mut self.sources);
+        doit(&mut self.inputs);
+        doit(&mut self.native_libs);
+        doit(&mut self.build_script_sources);
+        doit(&mut self.build_script_inputs);
     }
 }
 
@@ -396,7 +400,7 @@
             )
         })?;
     }
-    files.sort();
+    files.sort_and_dedup();
 
     let crate_id = VendoredCrate { name: p.package_name.clone(), version: p.version.clone() };
     Ok((crate_id, files))
diff --git a/tools/json_schema_compiler/feature_compiler.py b/tools/json_schema_compiler/feature_compiler.py
index 3176b816..d010718a 100644
--- a/tools/json_schema_compiler/feature_compiler.py
+++ b/tools/json_schema_compiler/feature_compiler.py
@@ -285,6 +285,7 @@
         list: {
             'enum_map': {
                 'chromeos': 'Feature::CHROMEOS_PLATFORM',
+                'desktop_android': 'Feature::DESKTOP_ANDROID_PLATFORM',
                 'fuchsia': 'Feature::FUCHSIA_PLATFORM',
                 'linux': 'Feature::LINUX_PLATFORM',
                 'mac': 'Feature::MACOSX_PLATFORM',
diff --git a/tools/json_schema_compiler/idl_schema_test.py b/tools/json_schema_compiler/idl_schema_test.py
index 3d2bb2f..5d63c8c9 100755
--- a/tools/json_schema_compiler/idl_schema_test.py
+++ b/tools/json_schema_compiler/idl_schema_test.py
@@ -303,7 +303,7 @@
   def testAllPlatformsNamespace(self):
     schema = idl_schema.Load('test/idl_namespace_all_platforms.idl')[0]
     self.assertEqual('idl_namespace_all_platforms', schema['namespace'])
-    expected = ['chromeos', 'fuchsia', 'linux', 'mac', 'win']
+    expected = ['chromeos', 'desktop_android', 'fuchsia', 'linux', 'mac', 'win']
     self.assertEqual(expected, schema['platforms'])
 
   def testNonSpecificPlatformsNamespace(self):
diff --git a/tools/json_schema_compiler/model.py b/tools/json_schema_compiler/model.py
index 1b4f4724..adc817ec 100644
--- a/tools/json_schema_compiler/model.py
+++ b/tools/json_schema_compiler/model.py
@@ -867,6 +867,7 @@
   """Enum of the possible platforms.
   """
   CHROMEOS = _PlatformInfo("chromeos")
+  DESKTOP_ANDROID = _PlatformInfo("desktop_android")
   FUCHSIA = _PlatformInfo("fuchsia")
   LINUX = _PlatformInfo("linux")
   MAC = _PlatformInfo("mac")
diff --git a/tools/json_schema_compiler/model_test.py b/tools/json_schema_compiler/model_test.py
index a0c8e559..1907cee 100755
--- a/tools/json_schema_compiler/model_test.py
+++ b/tools/json_schema_compiler/model_test.py
@@ -194,8 +194,8 @@
     self.assertEqual([Platforms.CHROMEOS],
                      self.idl_namespace_chromeos.platforms)
     self.assertEqual([
-        Platforms.CHROMEOS, Platforms.FUCHSIA, Platforms.LINUX, Platforms.MAC,
-        Platforms.WIN
+        Platforms.CHROMEOS, Platforms.DESKTOP_ANDROID, Platforms.FUCHSIA,
+        Platforms.LINUX, Platforms.MAC, Platforms.WIN
     ], self.idl_namespace_all_platforms.platforms)
     self.assertEqual(None, self.idl_namespace_non_specific_platforms.platforms)
 
diff --git a/tools/json_schema_compiler/test/idl_namespace_all_platforms.idl b/tools/json_schema_compiler/test/idl_namespace_all_platforms.idl
index cefa2223..a7f0bb4 100644
--- a/tools/json_schema_compiler/test/idl_namespace_all_platforms.idl
+++ b/tools/json_schema_compiler/test/idl_namespace_all_platforms.idl
@@ -4,7 +4,7 @@
 
 // Tests a variety of basic API definition features.
 
-[platforms=("chromeos", "fuchsia", "linux", "mac", "win")]
+[platforms=("chromeos", "desktop_android", "fuchsia", "linux", "mac", "win")]
 namespace idl_namespace_all_platforms {
 
 };
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 08fa401..bd90d25 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -46182,6 +46182,14 @@
   </description>
 </action>
 
+<action name="TrackingProtections.Bubble.ReloadingTimeout">
+  <owner>michelleabreo@google.com</owner>
+  <owner>koilos@google.com</owner>
+  <description>
+    Tracking protections bubble closed due to reloading timeout.
+  </description>
+</action>
+
 <action name="TrackingProtections.Bubble.SendFeedback">
   <owner>michelleabreo@google.com</owner>
   <owner>koilos@google.com</owner>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index cb7d4ed..15c7d94 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -8516,6 +8516,7 @@
       label="enable-segmentation-internals-survey:enabled"/>
   <int value="-2030972455"
       label="AutofillSuggestServerCardInsteadOfLocalCard:enabled"/>
+  <int value="-2030527780" label="CCTAdaptiveButtonTestSwitch:disabled"/>
   <int value="-2030255112" label="Bruschetta:disabled"/>
   <int value="-2030217301" label="password-export:disabled"/>
   <int value="-2029912304" label="StaleWhileRevalidate2:enabled"/>
@@ -10517,6 +10518,7 @@
   <int value="-1292735488" label="HTMLPopoverAttribute:disabled"/>
   <int value="-1292615467"
       label="OmniboxSuggestionTransparencyOptions:disabled"/>
+  <int value="-1292333085" label="CCTAdaptiveButtonTestSwitch:enabled"/>
   <int value="-1291963295" label="ComputePressure:disabled"/>
   <int value="-1290471006"
       label="EnableHistoryFaviconsGoogleServerQuery:enabled"/>
@@ -13407,6 +13409,7 @@
       label="WebIdentityDigitalCredentialsCreation:enabled"/>
   <int value="-213518852" label="protect-sync-credential:enabled"/>
   <int value="-213214894" label="enable-chromevox-arc-support"/>
+  <int value="-211590646" label="ToolbarPhoneAnimationRefactor:disabled"/>
   <int value="-211162053" label="OmniboxHeaderPaddingUpdate:enabled"/>
   <int value="-208587977" label="OmniboxMaterialDesignWeatherIcons:enabled"/>
   <int value="-208435024" label="EnableUsernameCorrection:enabled"/>
@@ -13551,6 +13554,7 @@
   <int value="-157983843" label="CrostiniUseLxd5:disabled"/>
   <int value="-157036790" label="CrosPrivacyHubAppPermissions:disabled"/>
   <int value="-156983642" label="ByDateHistoryInSidePanel:disabled"/>
+  <int value="-155494963" label="ToolbarPhoneAnimationRefactor:enabled"/>
   <int value="-154842647" label="ShowTabListAnimations:enabled"/>
   <int value="-154632776" label="HelpAppWelcomeTips:disabled"/>
   <int value="-154071189"
diff --git a/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml b/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
index efd8b2d..07793a5 100644
--- a/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
+++ b/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
@@ -788,7 +788,7 @@
 </histogram>
 
 <histogram name="Conversions.LegacyEventReportWindow" enum="Boolean"
-    expires_after="2025-08-03">
+    expires_after="2025-12-14">
   <owner>apaseltiner@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/blink/enums.xml b/tools/metrics/histograms/metadata/blink/enums.xml
index da3a1a4f..68b1867d 100644
--- a/tools/metrics/histograms/metadata/blink/enums.xml
+++ b/tools/metrics/histograms/metadata/blink/enums.xml
@@ -7852,7 +7852,6 @@
   <int value="2" label="Low constrast between color and background color"/>
   <int value="3" label="Too small font size"/>
   <int value="4" label="Too large font size"/>
-  <int value="5" label="Invalid display property"/>
 </enum>
 
 <!-- LINT.ThenChange(//third_party/blink/renderer/core/html/html_permission_element.h:InvalidStyleReason) -->
diff --git a/tools/metrics/histograms/metadata/download/enums.xml b/tools/metrics/histograms/metadata/download/enums.xml
index 7e9cbad3..23ee2ce 100644
--- a/tools/metrics/histograms/metadata/download/enums.xml
+++ b/tools/metrics/histograms/metadata/download/enums.xml
@@ -723,6 +723,7 @@
   <int value="0" label="Attached on job start"/>
   <int value="1" label="Attached after job start"/>
   <int value="2" label="Never attached before job complete"/>
+  <int value="3" label="Resumption job started"/>
 </enum>
 
 <enum name="OpenDownloadWithExternalAppsSource">
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml
index cbbcfb4..292add0 100644
--- a/tools/metrics/histograms/metadata/extensions/histograms.xml
+++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -1050,7 +1050,7 @@
 </histogram>
 
 <histogram name="Extensions.DeclarativeNetRequest.CreateVerifiedMatcherTime"
-    units="ms" expires_after="2025-07-21">
+    units="ms" expires_after="2026-07-21">
   <owner>kelvinjiang@chromium.org</owner>
   <owner>src/extensions/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index fb3a36e..9972cef 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -481,7 +481,7 @@
 </histogram>
 
 <histogram name="IOS.ContextualPanel.DismissedReason"
-    enum="IOSContextualPanelDismissedReason" expires_after="2025-08-31">
+    enum="IOSContextualPanelDismissedReason" expires_after="2026-01-30">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -492,7 +492,7 @@
 
 <histogram name="IOS.ContextualPanel.Entrypoint.{EntrypointType}"
     enum="IOSContextualPanelEntrypointInteractionType"
-    expires_after="2025-11-02">
+    expires_after="2026-01-30">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -512,7 +512,7 @@
 
 <histogram
     name="IOS.ContextualPanel.Entrypoint.{EntrypointType}.UptimeBeforeTap"
-    units="ms" expires_after="2025-11-02">
+    units="ms" expires_after="2026-01-30">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -532,7 +532,7 @@
 <histogram
     name="IOS.ContextualPanel.Entrypoint.{EntrypointType}.{ContextualPanelItemType}"
     enum="IOSContextualPanelEntrypointInteractionType"
-    expires_after="2025-11-02">
+    expires_after="2026-01-30">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -554,7 +554,7 @@
 
 <histogram
     name="IOS.ContextualPanel.Entrypoint.{EntrypointType}.{ContextualPanelItemType}.UptimeBeforeTap"
-    units="ms" expires_after="2025-09-14">
+    units="ms" expires_after="2026-01-30">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -573,7 +573,7 @@
 </histogram>
 
 <histogram name="IOS.ContextualPanel.EntrypointDisplayed"
-    enum="IOSContextualPanelItemType" expires_after="2025-11-02">
+    enum="IOSContextualPanelItemType" expires_after="2026-01-30">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -583,7 +583,7 @@
 </histogram>
 
 <histogram name="IOS.ContextualPanel.EntrypointTapped"
-    enum="IOSContextualPanelItemType" expires_after="2025-11-02">
+    enum="IOSContextualPanelItemType" expires_after="2026-01-30">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -594,7 +594,7 @@
 
 <histogram
     name="IOS.ContextualPanel.InfoBlockImpression.{ContextualPanelItemType}"
-    enum="IOSContextualPanelInfoBlockImpression" expires_after="2025-11-02">
+    enum="IOSContextualPanelInfoBlockImpression" expires_after="2026-01-30">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -607,7 +607,7 @@
 </histogram>
 
 <histogram name="IOS.ContextualPanel.InfoBlockUptime.{ContextualPanelItemType}"
-    units="ms" expires_after="2025-11-02">
+    units="ms" expires_after="2026-01-30">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -618,7 +618,7 @@
 </histogram>
 
 <histogram name="IOS.ContextualPanel.IPH.DismissedReason"
-    enum="IOSContextualPanelIPHDismissedReason" expires_after="2025-08-31">
+    enum="IOSContextualPanelIPHDismissedReason" expires_after="2026-01-30">
   <owner>nicolasmacbeth@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -628,7 +628,7 @@
 </histogram>
 
 <histogram name="IOS.ContextualPanel.Model.InfoBlocksWithContentCount"
-    units="count" expires_after="2025-08-31">
+    units="count" expires_after="2026-01-30">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -637,7 +637,7 @@
 </histogram>
 
 <histogram name="IOS.ContextualPanel.Model.Relevance.{ContextualPanelItemType}"
-    enum="IOSContextualPanelModelRelevance" expires_after="2025-11-02">
+    enum="IOSContextualPanelModelRelevance" expires_after="2026-01-30">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -648,7 +648,7 @@
 </histogram>
 
 <histogram name="IOS.ContextualPanel.VisibleTime" units="ms"
-    expires_after="2025-11-02">
+    expires_after="2026-01-30">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -660,7 +660,7 @@
 
 <histogram
     name="IOS.ContextualPanel.{ContextualPanelItemType}.ModelResponseTime"
-    units="ms" expires_after="2025-06-30">
+    units="ms" expires_after="2026-01-30">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -1075,7 +1075,7 @@
 </histogram>
 
 <histogram name="IOS.DefaultBrowserFullscreenPromo"
-    enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-08-05">
+    enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-12-07">
   <owner>sebsg@chromium.org</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -1125,7 +1125,7 @@
 </histogram>
 
 <histogram name="IOS.DefaultBrowserPromo.FETAvailabilityOnFRE"
-    enum="BooleanAvailable" expires_after="2025-10-12">
+    enum="BooleanAvailable" expires_after="2025-12-07">
   <owner>gayane@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -1192,7 +1192,7 @@
 </histogram>
 
 <histogram name="IOS.DefaultBrowserPromo.SetUpList.Action"
-    enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-10-12">
+    enum="IOSDefaultBrowserFullscreenPromoAction" expires_after="2025-12-07">
   <owner>sebsg@chromium.org</owner>
   <owner>scottyoder@google.com</owner>
   <owner>bling-get-set-up@google.com</owner>
@@ -1211,7 +1211,7 @@
 </histogram>
 
 <histogram name="IOS.DefaultBrowserPromo.TailoredPromoDisplayCount"
-    units="count" expires_after="2025-08-05">
+    units="count" expires_after="2025-12-07">
   <owner>gayane@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -1221,7 +1221,7 @@
 </histogram>
 
 <histogram name="IOS.DefaultBrowserPromo.{PromoAction}.{PromoStat}"
-    units="count" expires_after="2025-08-05">
+    units="count" expires_after="2025-12-07">
   <owner>gayane@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/navigation/histograms.xml b/tools/metrics/histograms/metadata/navigation/histograms.xml
index f6d4dfb0..52327fe 100644
--- a/tools/metrics/histograms/metadata/navigation/histograms.xml
+++ b/tools/metrics/histograms/metadata/navigation/histograms.xml
@@ -2000,6 +2000,43 @@
   </summary>
 </histogram>
 
+<histogram name="Navigation.Renderer.Timeline.{DurationFromTo}.Duration"
+    units="ms" expires_after="2026-06-20">
+  <owner>alexmos@chromium.org</owner>
+  <owner>creis@chromium.org</owner>
+  <summary>
+    Measures the duration {DurationFromTo}. Recorded at the point when a
+    navigation finishes committing in the renderer process, i.e. after
+    processing the CommitNavigation message. A corresponding event is also
+    emitted for tracing.
+  </summary>
+  <token key="DurationFromTo">
+    <variant name="CommitToDidCommit"
+        summary="between when the renderer process receives a
+                 CommitNavigation IPC to when the renderer process finishes
+                 processing that IPC and sends a DidCommitNavigation reply."/>
+    <variant name="CreateChildProxies"
+        summary="of creating all proxies for subframes of a given page,
+                 possibly including a proxy for the navigating frame if it is
+                 a subframe"/>
+    <variant name="CreateFrame"
+        summary="of creating the provisional local frame in which the
+                 navigation is occurring. This frame will be swapped into the
+                 frame tree when the navigation commits"/>
+    <variant name="CreateView"
+        summary="of creating the RenderView for a particular frame tree,
+                 which could be a frame tree for the navigating frame or one
+                 of the frame trees on its opener chain. This includes the
+                 time to create the view's main frame, which could be either
+                 a local frame or a remote frame (proxy)"/>
+    <variant name="WaitingForProcessReady"
+        summary="between the navigation start time and when the renderer
+                 process has finished initializing and starting its RunLoop.
+                 Only recorded for navigations where the navigation started
+                 before the RunLoop was ready"/>
+  </token>
+</histogram>
+
 <histogram name="Navigation.RendererCommitDelay.{FrameType}" units="ms"
     expires_after="2025-12-14">
   <owner>cduvall@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/optimization/enums.xml b/tools/metrics/histograms/metadata/optimization/enums.xml
index c841ea5..0d39d3a 100644
--- a/tools/metrics/histograms/metadata/optimization/enums.xml
+++ b/tools/metrics/histograms/metadata/optimization/enums.xml
@@ -767,6 +767,7 @@
   <int value="93" label="FEDCM_CLICKTHROUGH_RATE"/>
   <int value="97" label="DIGITAL_CREDENTIALS_LOW_FRICTION"/>
   <int value="100" label="SHARED_CREDIT_CARD_FLAT_RATE_BENEFITS_BLOCKLIST"/>
+  <int value="102" label="BUY_NOW_PAY_LATER_ALLOWLIST_KLARNA"/>
 </enum>
 
 <enum name="PageContentAnnotationsStorageStatus">
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml
index df87235..4a227d1 100644
--- a/tools/metrics/histograms/metadata/optimization/histograms.xml
+++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -292,6 +292,10 @@
       summary="This optimization helps determine if this merchant page is a
                good candidate for enabling buy now pay later flow with
                Affirm."/>
+  <variant name="BuyNowPayLaterAllowlistKlarna"
+      summary="This optimization helps determine if this merchant page is a
+               good candidate for enabling buy now pay later flow with
+               Klarna."/>
   <variant name="BuyNowPayLaterAllowlistZip"
       summary="This optimization helps determine if this merchant page is a
                good candidate for enabling buy now pay later flow with Zip."/>
diff --git a/tools/metrics/histograms/metadata/persistent_cache/histograms.xml b/tools/metrics/histograms/metadata/persistent_cache/histograms.xml
index 49d65682..449daa3 100644
--- a/tools/metrics/histograms/metadata/persistent_cache/histograms.xml
+++ b/tools/metrics/histograms/metadata/persistent_cache/histograms.xml
@@ -26,6 +26,11 @@
   <variant name="SQLite" summary="SQLite"/>
 </variants>
 
+<variants name="FileType">
+  <variant name="DbFile" summary="database file"/>
+  <variant name="JournalFile" summary="journal file"/>
+</variants>
+
 <variants name="Mode">
   <variant name="ReadOnly" summary="read only"/>
   <variant name="ReadWrite" summary="read/write"/>
@@ -44,6 +49,18 @@
   <token key="Mode" variants="Mode"/>
 </histogram>
 
+<histogram name="PersistentCache.ParamsManager.{FileType}.DeleteSuccess"
+    enum="Boolean" expires_after="2026-06-09">
+  <owner>olivierli@chromium.org</owner>
+  <owner>catan-team@chromium.org</owner>
+  <summary>
+    Whether BackendParams manager succeeded in deleting a {FileType}.
+
+    Logged every time there is an attempt to delete a {FileType}.
+  </summary>
+  <token key="FileType" variants="FileType"/>
+</histogram>
+
 </histograms>
 
 </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/enums.xml b/tools/metrics/histograms/metadata/safe_browsing/enums.xml
index b1205c3..79e7ddb 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/enums.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/enums.xml
@@ -199,6 +199,7 @@
   <int value="26" label="dangerous download canceled on profile closure"/>
   <int value="27" label="URL real-time and hash real-time discrepancy"/>
   <int value="28" label="External app redirect"/>
+  <int value="29" label="dangerous download warning (Android)"/>
 </enum>
 
 <!-- LINT.ThenChange(//components/safe_browsing/core/common/proto/csd.proto:ClientSafeBrowsingReportType) -->
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
index 195689c2..5a4aaca 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -3612,7 +3612,7 @@
 
 <histogram
     name="SafeBrowsing.V4ProcessPartialUpdate.ApplyUpdateDuration{SafeBrowsing_V4Store_Metrics}"
-    units="ms" expires_after="2025-06-22">
+    units="ms" expires_after="2026-06-22">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml
index 3f00711..dfd6375 100644
--- a/tools/metrics/histograms/metadata/sb_client/histograms.xml
+++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -129,7 +129,7 @@
 </histogram>
 
 <histogram name="SBClientDownload.DeepScanTrigger" enum="SBDeepScanTriggers"
-    expires_after="2025-06-30">
+    expires_after="2026-06-30">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index ac2dab3..d5f29f1 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@
             "full_remote_path": "perfetto-luci-artifacts/cca1748cb16b9dc0cac21515813c3855a983917d/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "152a9325733ea310de5d98e131f5bf675d1ddc1f",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/e52892582ae33674fab064dd6d1abdfc0bcd441b/trace_processor_shell.exe"
+            "hash": "0055def8077c50d7c32a10fdfec3fdb49c6f354b",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/0028ac091740d391b1dfc6f7b0171a6c25ed5bbb/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "da83ac6def03d2e2a0eced37271a34bb4c33d046",
diff --git a/ui/accessibility/BUILD.gn b/ui/accessibility/BUILD.gn
index c32f5a63..62056627 100644
--- a/ui/accessibility/BUILD.gn
+++ b/ui/accessibility/BUILD.gn
@@ -508,7 +508,7 @@
     # External code should depend on ":accessibility_features_java" instead.
     visibility = [ ":*" ]
     sources = [ "//ui/accessibility/accessibility_features.cc" ]
-    template = "//ui/accessibility/android/java_templates/AccessibilityFeatures.java.tmpl"
+    class_name = "org.chromium.ui.accessibility.AccessibilityFeatures"
   }
 
   # A minimal library used to expose accessibility features to webview.
diff --git a/ui/accessibility/accessibility_features.cc b/ui/accessibility/accessibility_features.cc
index d35abc3..7e85a49ce 100644
--- a/ui/accessibility/accessibility_features.cc
+++ b/ui/accessibility/accessibility_features.cc
@@ -73,13 +73,6 @@
       ::features::kAccessibilityPerformanceMeasurementExperiment);
 }
 
-BASE_FEATURE(kAccessibilityUseAXBitset,
-             "AccessibilityUseAXBitset",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-bool IsAccessibilityUseAXBitsetEnabled() {
-  return base::FeatureList::IsEnabled(::features::kAccessibilityUseAXBitset);
-}
-
 namespace {
 
 constexpr base::FeatureParam<
diff --git a/ui/accessibility/accessibility_features.h b/ui/accessibility/accessibility_features.h
index 9d689e9..aae5682 100644
--- a/ui/accessibility/accessibility_features.h
+++ b/ui/accessibility/accessibility_features.h
@@ -75,11 +75,6 @@
     kAccessibilityPerformanceMeasurementExperiment);
 AX_BASE_EXPORT bool IsAccessibilityPerformanceMeasurementExperimentEnabled();
 
-// Use AXBitset to save boolean attributes in ui/accessibility instead of a
-// vector.
-AX_BASE_EXPORT BASE_DECLARE_FEATURE(kAccessibilityUseAXBitset);
-AX_BASE_EXPORT bool IsAccessibilityUseAXBitsetEnabled();
-
 enum class AccessibilityPerformanceMeasurementExperimentGroup {
   kAXModeComplete,
   kWebContentsOnly,
diff --git a/ui/accessibility/android/java_templates/AccessibilityFeatures.java.tmpl b/ui/accessibility/android/java_templates/AccessibilityFeatures.java.tmpl
deleted file mode 100644
index e5e17e68..0000000
--- a/ui/accessibility/android/java_templates/AccessibilityFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.ui.accessibility;
-
-/**
-* Contains features that are specific to accessibility.
-*/
-public final class AccessibilityFeatures {{
-
-{NATIVE_FEATURES}
-
- // Prevents instantiation.
- private AccessibilityFeatures() {{}}
-}}
diff --git a/ui/accessibility/ax_bitset.h b/ui/accessibility/ax_bitset.h
index f8f7660..4a993360 100644
--- a/ui/accessibility/ax_bitset.h
+++ b/ui/accessibility/ax_bitset.h
@@ -15,10 +15,6 @@
 namespace ui {
 
 // A helper class to store AX-related boolean enums.
-// IMPORTANT: This AXBitset implementation uses single uint64_t bitmasks and is
-// therefore limited to managing enums whose underlying integer values are
-// strictly less than 64 (i.e., in the range [0, 63]). Enum values outside
-// this range will lead to incorrect behavior or will be ignored.
 template <typename T>
 class AXBitset {
  public:
@@ -76,7 +72,7 @@
       // in 'remainder'. This corresponds to the enum's integer value.
       // std::countr_zero counts trailing zeros; e.g., for 0b...1000, it
       // returns 3.
-      int index = std::countr_zero(remainder);
+      uint64_t index = std::countr_zero(remainder);
 
       T attribute = static_cast<T>(index);
       uint64_t mask = 1ULL << index;
@@ -110,28 +106,13 @@
 
   // Returns the number of attributes that are currently explicitly set
   // (i.e., have been Set to true or false and not subsequently Unset).
-  size_t size() const { return std::popcount(set_bits_); }
-
-  template <typename U>
-  friend bool operator==(const AXBitset<U>& lhs, const AXBitset<U>& rhs);
+  size_t Size() const { return std::popcount(set_bits_); }
 
  private:
   uint64_t set_bits_ = 0;
   uint64_t values_ = 0;
 };
 
-template <typename T>
-bool operator==(const AXBitset<T>& lhs, const AXBitset<T>& rhs) {
-  // Check if the set of active attributes is the same.
-  if (lhs.set_bits_ != rhs.set_bits_) {
-    return false;
-  }
-
-  // If the set_bits_ are identical, then  compare the values for the bits that
-  // are actually set.
-  return (lhs.values_ & lhs.set_bits_) == (rhs.values_ & lhs.set_bits_);
-}
-
 }  // namespace ui
 
 #endif  // UI_ACCESSIBILITY_AX_BITSET_H_
diff --git a/ui/accessibility/ax_bitset_unittest.cc b/ui/accessibility/ax_bitset_unittest.cc
index 47137fb3..d6a3fba9 100644
--- a/ui/accessibility/ax_bitset_unittest.cc
+++ b/ui/accessibility/ax_bitset_unittest.cc
@@ -87,21 +87,21 @@
 TEST(AXBitsetTest, Size) {
   AXBitset<TestEnum> map;
   size_t expected_size = 0;
-  EXPECT_EQ(expected_size, map.size());
+  EXPECT_EQ(expected_size, map.Size());
 
   map.Set(TestEnum::kMinValue, true);
   map.Set(TestEnum::VAL_63, false);
   expected_size = 2;
-  EXPECT_EQ(expected_size, map.size());
+  EXPECT_EQ(expected_size, map.Size());
 
   // Re-setting an existing attribute.
   map.Set(TestEnum::kMinValue, false);
-  EXPECT_EQ(expected_size, map.size());
+  EXPECT_EQ(expected_size, map.Size());
 
   // Unset existing attribute.
   map.Unset(TestEnum::VAL_63);
   expected_size = 1;
-  EXPECT_EQ(expected_size, map.size());
+  EXPECT_EQ(expected_size, map.Size());
 }
 
 TEST(AXBitsetTest, Append) {
diff --git a/ui/accessibility/ax_node_data.cc b/ui/accessibility/ax_node_data.cc
index 6a72739..b81a762 100644
--- a/ui/accessibility/ax_node_data.cc
+++ b/ui/accessibility/ax_node_data.cc
@@ -18,7 +18,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/to_string.h"
 #include "base/strings/utf_string_conversions.h"
-#include "ui/accessibility/accessibility_features.h"
 #include "ui/accessibility/ax_enum_util.h"
 #include "ui/accessibility/ax_enums.mojom-shared.h"
 #include "ui/accessibility/ax_enums.mojom.h"
@@ -231,13 +230,7 @@
   }
 }
 
-AXNodeData::AXNodeData() : role(ax::mojom::Role::kUnknown) {
-  if (features::IsAccessibilityUseAXBitsetEnabled()) {
-    bool_attributes.emplace<BoolAttrBitset>();
-  } else {
-    bool_attributes.emplace<BoolAttrList>();
-  }
-}
+AXNodeData::AXNodeData() : role(ax::mojom::Role::kUnknown) {}
 
 AXNodeData::~AXNodeData() = default;
 
@@ -265,7 +258,7 @@
   string_attributes.swap(other.string_attributes);
   int_attributes.swap(other.int_attributes);
   float_attributes.swap(other.float_attributes);
-  bool_attributes = std::move(other.bool_attributes);
+  bool_attributes.swap(other.bool_attributes);
   intlist_attributes.swap(other.intlist_attributes);
   stringlist_attributes.swap(other.stringlist_attributes);
   html_attributes.swap(other.html_attributes);
@@ -296,23 +289,16 @@
 }
 
 bool AXNodeData::HasBoolAttribute(ax::mojom::BoolAttribute attribute) const {
-  if (auto bool_vector = std::get_if<BoolAttrList>(&bool_attributes)) {
-    auto iter = FindInVectorOfPairs(attribute, *bool_vector);
-    return iter != bool_vector->end();
-  }
-  auto bool_bitset = std::get<BoolAttrBitset>(bool_attributes);
-  return bool_bitset.Has(attribute).has_value();
+  auto iter = FindInVectorOfPairs(attribute, bool_attributes);
+  return iter != bool_attributes.end();
 }
 
 bool AXNodeData::GetBoolAttribute(ax::mojom::BoolAttribute attribute) const {
-  if (auto bool_vector = std::get_if<BoolAttrList>(&bool_attributes)) {
-    auto iter = FindInVectorOfPairs(attribute, *bool_vector);
-    return iter == bool_vector->end() ? kDefaultBoolValue : iter->second;
+  auto iter = FindInVectorOfPairs(attribute, bool_attributes);
+  if (iter != bool_attributes.end()) {
+    return iter->second;
   }
-
-  auto bool_bitset = std::get<BoolAttrBitset>(bool_attributes);
-  std::optional<bool> attr = bool_bitset.Has(attribute);
-  return attr.has_value() ? attr.value() : kDefaultBoolValue;
+  return kDefaultBoolValue;
 }
 
 bool AXNodeData::HasFloatAttribute(ax::mojom::FloatAttribute attribute) const {
@@ -423,15 +409,9 @@
 void AXNodeData::AddBoolAttribute(ax::mojom::BoolAttribute attribute,
                                   bool value) {
   DCHECK_NE(attribute, ax::mojom::BoolAttribute::kNone);
-  if (auto bool_vector = std::get_if<BoolAttrList>(&bool_attributes)) {
-    if (HasBoolAttribute(attribute)) {
-      RemoveBoolAttribute(attribute);
-    }
-    bool_vector->emplace_back(attribute, value);
-    return;
-  }
-
-  get<BoolAttrBitset>(bool_attributes).Set(attribute, value);
+  if (HasBoolAttribute(attribute))
+    RemoveBoolAttribute(attribute);
+  bool_attributes.emplace_back(attribute, value);
 }
 
 void AXNodeData::AddIntAttribute(ax::mojom::IntAttribute attribute, int value) {
@@ -478,14 +458,9 @@
 
 void AXNodeData::RemoveBoolAttribute(ax::mojom::BoolAttribute attribute) {
   DCHECK_NE(attribute, ax::mojom::BoolAttribute::kNone);
-  if (auto bool_vector = std::get_if<BoolAttrList>(&bool_attributes)) {
-    std::erase_if(*bool_vector, [attribute](const auto& bool_attribute) {
-      return bool_attribute.first == attribute;
-    });
-    return;
-  }
-
-  get<BoolAttrBitset>(bool_attributes).Unset(attribute);
+  std::erase_if(bool_attributes, [attribute](const auto& bool_attribute) {
+    return bool_attribute.first == attribute;
+  });
 }
 
 void AXNodeData::RemoveIntAttribute(ax::mojom::IntAttribute attribute) {
@@ -1761,10 +1736,10 @@
     }
   }
 
-  auto process_bool_attribute = [&result](ax::mojom::BoolAttribute attr,
-                                          bool bool_value) {
-    std::string value = base::ToString(bool_value);
-    switch (attr) {
+  for (const std::pair<ax::mojom::BoolAttribute, bool>& bool_attribute :
+       bool_attributes) {
+    std::string value = base::ToString(bool_attribute.second);
+    switch (bool_attribute.first) {
       case ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot:
         result += " non_atomic_text_field_root=" + value;
         break;
@@ -1834,15 +1809,6 @@
       case ax::mojom::BoolAttribute::kNone:
         break;
     }
-  };
-
-  if (auto bool_vector = std::get_if<BoolAttrList>(&bool_attributes)) {
-    for (const std::pair<ax::mojom::BoolAttribute, bool>& bool_attribute :
-         *bool_vector) {
-      process_bool_attribute(bool_attribute.first, bool_attribute.second);
-    }
-  } else {
-    std::get<BoolAttrBitset>(bool_attributes).ForEach(process_bool_attribute);
   }
 
   for (const std::pair<ax::mojom::IntListAttribute, std::vector<int32_t>>&
@@ -1881,29 +1847,22 @@
       case ax::mojom::IntListAttribute::kMarkerTypes: {
         std::string types_str = VectorToString(values, [](const int32_t type) {
           std::string type_str;
-          if (type == static_cast<int32_t>(ax::mojom::MarkerType::kNone)) {
+          if (type == static_cast<int32_t>(ax::mojom::MarkerType::kNone))
             return type_str;
-          }
 
-          if (type & static_cast<int32_t>(ax::mojom::MarkerType::kSpelling)) {
+          if (type & static_cast<int32_t>(ax::mojom::MarkerType::kSpelling))
             type_str += "spelling&";
-          }
-          if (type & static_cast<int32_t>(ax::mojom::MarkerType::kGrammar)) {
+          if (type & static_cast<int32_t>(ax::mojom::MarkerType::kGrammar))
             type_str += "grammar&";
-          }
-          if (type & static_cast<int32_t>(ax::mojom::MarkerType::kHighlight)) {
+          if (type & static_cast<int32_t>(ax::mojom::MarkerType::kHighlight))
             type_str += "highlight&";
-          }
-          if (type & static_cast<int32_t>(ax::mojom::MarkerType::kTextMatch)) {
+          if (type & static_cast<int32_t>(ax::mojom::MarkerType::kTextMatch))
             type_str += "text_match&";
-          }
           if (type &
-              static_cast<int32_t>(ax::mojom::MarkerType::kActiveSuggestion)) {
+              static_cast<int32_t>(ax::mojom::MarkerType::kActiveSuggestion))
             type_str += "active_suggestion&";
-          }
-          if (type & static_cast<int32_t>(ax::mojom::MarkerType::kSuggestion)) {
+          if (type & static_cast<int32_t>(ax::mojom::MarkerType::kSuggestion))
             type_str += "suggestion&";
-          }
 
           return type_str;
         });
@@ -1925,16 +1884,14 @@
         std::string highlight_types_str =
             VectorToString(values, [](const int32_t highlight_type) {
               if (static_cast<ax::mojom::HighlightType>(highlight_type) ==
-                  ax::mojom::HighlightType::kNone) {
+                  ax::mojom::HighlightType::kNone)
                 return "";
-              }
               return ui::ToString(
                   static_cast<ax::mojom::HighlightType>(highlight_type));
             });
 
-        if (!highlight_types_str.empty()) {
+        if (!highlight_types_str.empty())
           result += " highlight_types=" + highlight_types_str;
-        }
         break;
       }
       case ax::mojom::IntListAttribute::kCaretBounds:
@@ -2025,9 +1982,8 @@
     result += " " + string_pair.first + "=" + string_pair.second;
   }
 
-  if (actions) {
+  if (actions)
     result += " actions=" + ActionsBitfieldToString(actions);
-  }
 
   return result;
 }
@@ -2051,15 +2007,9 @@
   node_data_size.float_attribute_size +=
       float_attributes.size() *
       (sizeof(ax::mojom::FloatAttribute) + sizeof(float));
-
-  // The size of the std::variant object includes the AXBitset (if that's what
-  // is stored inside).
-  node_data_size.bool_attribute_size += sizeof(bool_attributes);
-  if (auto bool_vector = std::get_if<BoolAttrList>(&bool_attributes)) {
-    node_data_size.bool_attribute_size +=
-        bool_vector->size() * (sizeof(ax::mojom::BoolAttribute) + sizeof(bool));
-  }
-
+  node_data_size.bool_attribute_size +=
+      bool_attributes.size() *
+      (sizeof(ax::mojom::BoolAttribute) + sizeof(bool));
   node_data_size.child_ids_size = child_ids.size() * sizeof(int32_t);
 
   for (const auto& pair : string_attributes) {
diff --git a/ui/accessibility/ax_node_data.h b/ui/accessibility/ax_node_data.h
index 3123b97..749a374 100644
--- a/ui/accessibility/ax_node_data.h
+++ b/ui/accessibility/ax_node_data.h
@@ -11,12 +11,10 @@
 #include <memory>
 #include <string>
 #include <utility>
-#include <variant>
 #include <vector>
 
 #include "base/strings/string_split.h"
 #include "ui/accessibility/ax_base_export.h"
-#include "ui/accessibility/ax_bitset.h"
 #include "ui/accessibility/ax_enums.mojom-forward.h"
 #include "ui/accessibility/ax_node_id_forward.h"
 #include "ui/accessibility/ax_relative_bounds.h"
@@ -42,10 +40,6 @@
   // Defines the type used for AXNode IDs.
   using AXID = AXNodeID;
 
-  // Boolean attribute storage.
-  using BoolAttrBitset = AXBitset<ax::mojom::BoolAttribute>;
-  using BoolAttrList = std::vector<std::pair<ax::mojom::BoolAttribute, bool>>;
-
   // If a node is not yet or no longer valid, its ID should have a value of
   // kInvalidAXID.
   static constexpr AXID kInvalidAXID = kInvalidAXNodeID;
@@ -381,7 +375,7 @@
       string_attributes;
   std::vector<std::pair<ax::mojom::IntAttribute, int32_t>> int_attributes;
   std::vector<std::pair<ax::mojom::FloatAttribute, float>> float_attributes;
-  std::variant<BoolAttrBitset, BoolAttrList> bool_attributes;
+  std::vector<std::pair<ax::mojom::BoolAttribute, bool>> bool_attributes;
   std::vector<std::pair<ax::mojom::IntListAttribute, std::vector<int32_t>>>
       intlist_attributes;
   std::vector<
diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc
index a3459e5..483da32 100644
--- a/ui/accessibility/ax_tree.cc
+++ b/ui/accessibility/ax_tree.cc
@@ -32,6 +32,7 @@
 #include "base/timer/elapsed_timer.h"
 #include "components/crash/core/common/crash_key.h"
 #include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
+#include "ui/accessibility/ax_bitset.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_event.h"
 #include "ui/accessibility/ax_language_detection.h"
@@ -2332,23 +2333,8 @@
     observers_.Notify(&AXTreeObserver::OnBoolAttributeChanged, this, node, attr,
                       new_bool);
   };
-
-  if (auto old_data_bool_vector =
-          std::get_if<std::vector<std::pair<ax::mojom::BoolAttribute, bool>>>(
-              &old_data.bool_attributes)) {
-    CallIfAttributeValuesChanged(
-        *old_data_bool_vector,
-        std::get<std::vector<std::pair<ax::mojom::BoolAttribute, bool>>>(
-            new_data.bool_attributes),
-        false, bool_callback);
-  } else if (auto old_data_bool_bitset =
-                 std::get_if<AXBitset<ax::mojom::BoolAttribute>>(
-                     &old_data.bool_attributes)) {
-    CallIfAttributeValuesChanged(
-        *old_data_bool_bitset,
-        std::get<AXBitset<ax::mojom::BoolAttribute>>(new_data.bool_attributes),
-        false, bool_callback);
-  }
+  CallIfAttributeValuesChanged(old_data.bool_attributes,
+                               new_data.bool_attributes, false, bool_callback);
 
   auto float_callback = [this, node](ax::mojom::FloatAttribute attr,
                                      const float& old_float,
diff --git a/ui/accessibility/ax_tree_unittest.cc b/ui/accessibility/ax_tree_unittest.cc
index bc2de60..cf46ac52 100644
--- a/ui/accessibility/ax_tree_unittest.cc
+++ b/ui/accessibility/ax_tree_unittest.cc
@@ -1387,10 +1387,8 @@
   ASSERT_EQ(9U, change_log.size());
   EXPECT_EQ("name changed from N1 to N2", change_log[0]);
   EXPECT_EQ("description changed from D1 to D2", change_log[1]);
-  // Ordering of bool attributes changes depending on the storage, check for
-  // presence.
-  EXPECT_TRUE(base::Contains(change_log, "busy changed to true"));
-  EXPECT_TRUE(base::Contains(change_log, "liveAtomic changed to false"));
+  EXPECT_EQ("liveAtomic changed to false", change_log[2]);
+  EXPECT_EQ("busy changed to true", change_log[3]);
   EXPECT_EQ("minValueForRange changed from 1 to 2", change_log[4]);
   EXPECT_EQ("maxValueForRange changed from 10 to 9", change_log[5]);
   EXPECT_EQ("stepValueForRange changed from 3 to 0.5", change_log[6]);
diff --git a/ui/accessibility/mojom/ax_node_data_mojom_traits.cc b/ui/accessibility/mojom/ax_node_data_mojom_traits.cc
index cebdd12..243f7026 100644
--- a/ui/accessibility/mojom/ax_node_data_mojom_traits.cc
+++ b/ui/accessibility/mojom/ax_node_data_mojom_traits.cc
@@ -50,21 +50,7 @@
   base::flat_map<ax::mojom::BoolAttribute, bool> bool_attributes;
   if (!data.ReadBoolAttributes(&bool_attributes))
     return false;
-  if (auto bool_vector =
-          std::get_if<std::vector<std::pair<ax::mojom::BoolAttribute, bool>>>(
-              &out->bool_attributes)) {
-    *bool_vector = std::move(bool_attributes).extract();
-  } else if (auto bool_bitset =
-                 std::get_if<ui::AXBitset<ax::mojom::BoolAttribute>>(
-                     &out->bool_attributes)) {
-    // TODO: crbug.com/422234724 - Send as an integer pair in flight (set_bits,
-    // values) rather than converting to and from a flat_map.
-    for (const auto& pair : bool_attributes) {
-      bool_bitset->Set(pair.first, pair.second);
-    }
-  } else {
-    return false;
-  }
+  out->bool_attributes = std::move(bool_attributes).extract();
 
   base::flat_map<ax::mojom::IntListAttribute, std::vector<int32_t>>
       intlist_attributes;
diff --git a/ui/accessibility/mojom/ax_node_data_mojom_traits.h b/ui/accessibility/mojom/ax_node_data_mojom_traits.h
index 3de74421..f7f5a5a 100644
--- a/ui/accessibility/mojom/ax_node_data_mojom_traits.h
+++ b/ui/accessibility/mojom/ax_node_data_mojom_traits.h
@@ -29,21 +29,9 @@
   float_attributes(const ui::AXNodeData& p) {
     return p.float_attributes;
   }
-  static std::vector<std::pair<ax::mojom::BoolAttribute, bool>> bool_attributes(
-      const ui::AXNodeData& p) {
-    if (auto bool_vector =
-            std::get_if<std::vector<std::pair<ax::mojom::BoolAttribute, bool>>>(
-                &p.bool_attributes)) {
-      return *bool_vector;
-    }
-    // TODO: crbug.com/422234724 - Avoid conversion to and from a vector of
-    // pairs.
-    std::vector<std::pair<ax::mojom::BoolAttribute, bool>> result;
-    std::get<ui::AXBitset<ax::mojom::BoolAttribute>>(p.bool_attributes)
-        .ForEach([&result](ax::mojom::BoolAttribute attr, bool value) {
-          result.emplace_back(attr, value);
-        });
-    return result;
+  static const std::vector<std::pair<ax::mojom::BoolAttribute, bool>>&
+  bool_attributes(const ui::AXNodeData& p) {
+    return p.bool_attributes;
   }
   static const std::vector<
       std::pair<ax::mojom::IntListAttribute, std::vector<int32_t>>>&
diff --git a/ui/accessibility/platform/test_ax_node_wrapper.cc b/ui/accessibility/platform/test_ax_node_wrapper.cc
index 28ac985..8a9c9390 100644
--- a/ui/accessibility/platform/test_ax_node_wrapper.cc
+++ b/ui/accessibility/platform/test_ax_node_wrapper.cc
@@ -424,12 +424,12 @@
 void TestAXNodeWrapper::ReplaceBoolAttribute(ax::mojom::BoolAttribute attribute,
                                              bool value) {
   AXNodeData new_data = GetData();
-  if (auto bool_vector =
-          std::get_if<std::vector<std::pair<ax::mojom::BoolAttribute, bool>>>(
-              &new_data.bool_attributes)) {
-    std::erase_if(*bool_vector,
-                  [attribute](auto& pair) { return pair.first == attribute; });
-  }
+  std::vector<std::pair<ax::mojom::BoolAttribute, bool>>& attributes =
+      new_data.bool_attributes;
+
+  std::erase_if(attributes,
+                [attribute](auto& pair) { return pair.first == attribute; });
+
   new_data.AddBoolAttribute(attribute, value);
   node_->SetData(new_data);
 }
diff --git a/ui/actions/OWNERS b/ui/actions/OWNERS
new file mode 100644
index 0000000..a06b229
--- /dev/null
+++ b/ui/actions/OWNERS
@@ -0,0 +1,2 @@
+kylixrd@chromium.org
+elainechien@chromium.org
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn
index 2d02a47..2414676 100644
--- a/ui/android/BUILD.gn
+++ b/ui/android/BUILD.gn
@@ -121,7 +121,7 @@
   # External code should depend on ":android_java" instead.
   visibility = [ ":*" ]
   sources = [ "//ui/android/ui_android_features.cc" ]
-  template = "//ui/android/java_templates/UiAndroidFeatures.java.tmpl"
+  class_name = "org.chromium.ui.base.UiAndroidFeatures"
 }
 
 # A minimal library used to expose ui features to webview
diff --git a/ui/android/java/src/org/chromium/ui/BrowserControlsOffsetTagConstraints.java b/ui/android/java/src/org/chromium/ui/BrowserControlsOffsetTagConstraints.java
index 26b3b9a..759ffe8f 100644
--- a/ui/android/java/src/org/chromium/ui/BrowserControlsOffsetTagConstraints.java
+++ b/ui/android/java/src/org/chromium/ui/BrowserControlsOffsetTagConstraints.java
@@ -11,6 +11,8 @@
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 
+import java.util.Objects;
+
 /** Java counterpart to the native ui::android::BrowserControlsOffsetTagConstraints. */
 @DoNotMock("This is a simple value object.")
 @NullMarked
@@ -65,4 +67,12 @@
     public @Nullable OffsetTagConstraints getBottomControlsConstraints() {
         return mBottomControlsConstraints;
     }
+
+    @Override
+    public boolean equals(@Nullable Object other) {
+        return other instanceof BrowserControlsOffsetTagConstraints that
+                && Objects.equals(mTopControlsConstraints, that.getTopControlsConstraints())
+                && Objects.equals(mContentConstraints, that.getContentConstraints())
+                && Objects.equals(mBottomControlsConstraints, that.getBottomControlsConstraints());
+    }
 }
diff --git a/ui/android/java/src/org/chromium/ui/BrowserControlsOffsetTagDefinitions.java b/ui/android/java/src/org/chromium/ui/BrowserControlsOffsetTagDefinitions.java
index 25cbb7a..e13fcba9 100644
--- a/ui/android/java/src/org/chromium/ui/BrowserControlsOffsetTagDefinitions.java
+++ b/ui/android/java/src/org/chromium/ui/BrowserControlsOffsetTagDefinitions.java
@@ -4,11 +4,14 @@
 
 package org.chromium.ui;
 
+import androidx.annotation.NonNull;
+
 import com.google.errorprone.annotations.DoNotMock;
 
 import org.jni_zero.CalledByNative;
 
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.cc.input.BrowserControlsOffsetTags;
 
 /** Java counterpart to the native ui::BrowserControlsOffsetTagDefinitions. */
@@ -30,12 +33,60 @@
     }
 
     @CalledByNative
-    public BrowserControlsOffsetTags getTags() {
+    public @NonNull BrowserControlsOffsetTags getTags() {
         return mTags;
     }
 
     @CalledByNative
-    public BrowserControlsOffsetTagConstraints getConstraints() {
+    public @NonNull BrowserControlsOffsetTagConstraints getConstraints() {
         return mConstraints;
     }
+
+    @Override
+    public boolean equals(@Nullable Object other) {
+        return other instanceof BrowserControlsOffsetTagDefinitions that
+                && mTags.equals(that.getTags())
+                && mConstraints.equals(that.getConstraints());
+    }
+
+    @Override
+    public String toString() {
+        String topTag =
+                mTags.getTopControlsOffsetTag() == null
+                        ? "null"
+                        : mTags.getTopControlsOffsetTag().toString();
+        String contentTag =
+                mTags.getContentOffsetTag() == null
+                        ? "null"
+                        : mTags.getContentOffsetTag().toString();
+        String bottomTag =
+                mTags.getBottomControlsOffsetTag() == null
+                        ? "null"
+                        : mTags.getBottomControlsOffsetTag().toString();
+        String topConstraints =
+                mConstraints.getTopControlsConstraints() == null
+                        ? "null"
+                        : mConstraints.getTopControlsConstraints().toString();
+        String contentConstraints =
+                mConstraints.getContentConstraints() == null
+                        ? "null"
+                        : mConstraints.getContentConstraints().toString();
+        String bottomConstriants =
+                mConstraints.getBottomControlsConstraints() == null
+                        ? "null"
+                        : mConstraints.getBottomControlsConstraints().toString();
+        return "tags: "
+                + topTag
+                + " | "
+                + contentTag
+                + " | "
+                + bottomTag
+                + " | "
+                + "constraints: "
+                + topConstraints
+                + " | "
+                + contentConstraints
+                + " | "
+                + bottomConstriants;
+    }
 }
diff --git a/ui/android/java_templates/UiAndroidFeatures.java.tmpl b/ui/android/java_templates/UiAndroidFeatures.java.tmpl
deleted file mode 100644
index 85eaa97..0000000
--- a/ui/android/java_templates/UiAndroidFeatures.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.ui.base;
-
-/**
- * Constants for the names of Ui Android Features.
- */
-public final class UiAndroidFeatures {{
-
-{NATIVE_FEATURES}
-
-    // Do not instantiate this class.
-    private UiAndroidFeatures() {{}}
-}}
diff --git a/ui/base/clipboard/clipboard_mac.h b/ui/base/clipboard/clipboard_mac.h
index e22aa012..b3d9c75 100644
--- a/ui/base/clipboard/clipboard_mac.h
+++ b/ui/base/clipboard/clipboard_mac.h
@@ -11,9 +11,9 @@
 #include <string_view>
 
 #include "base/apple/foundation_util.h"
+#include "base/callback_list.h"
 #include "base/component_export.h"
 #include "base/gtest_prod_util.h"
-#include "base/timer/timer.h"
 #include "ui/base/clipboard/clipboard.h"
 #include "ui/base/clipboard/clipboard_change_notifier.h"
 
@@ -132,15 +132,15 @@
       std::unique_ptr<DataTransferEndpoint> data_src,
       NSPasteboard* pasteboard,
       uint32_t privacy_types);
-  void CheckClipboardForChanges();
+  void ClipboardChanged();
 
   // Mapping of OS-provided sequence number to a unique token.
   mutable struct {
     NSInteger sequence_number;
     ClipboardSequenceNumberToken token;
   } clipboard_sequence_;
-  std::unique_ptr<base::RepeatingTimer> clipboard_polling_timer_;
-  bool monitoring_clipboard_changes_ = false;
+
+  base::CallbackListSubscription clipboard_change_subscription_;
   NSInteger last_known_sequence_number_ = 0;
 };
 
diff --git a/ui/base/clipboard/clipboard_mac.mm b/ui/base/clipboard/clipboard_mac.mm
index 7eaeef6..41f3c75 100644
--- a/ui/base/clipboard/clipboard_mac.mm
+++ b/ui/base/clipboard/clipboard_mac.mm
@@ -2,13 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/callback_list.h"
 #ifdef UNSAFE_BUFFERS_BUILD
 // TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
 #pragma allow_unsafe_buffers
 #endif
 
-#include "ui/base/clipboard/clipboard_mac.h"
-
 #import <Cocoa/Cocoa.h>
 #include <stdint.h>
 
@@ -22,6 +21,7 @@
 #include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/mac/mac_util.h"
+#include "base/mac/pasteboard_changed_observation.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/notreached.h"
 #include "base/strings/string_split.h"
@@ -38,6 +38,7 @@
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/base/clipboard/clipboard_constants.h"
 #include "ui/base/clipboard/clipboard_format_type.h"
+#include "ui/base/clipboard/clipboard_mac.h"
 #include "ui/base/clipboard/clipboard_metrics.h"
 #include "ui/base/clipboard/clipboard_monitor.h"
 #include "ui/base/clipboard/clipboard_util_mac.h"
@@ -51,11 +52,6 @@
 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
 #include "url/gurl.h"
 
-namespace {
-// Clipboard polling interval in milliseconds.
-const int64_t kClipboardPollingIntervalMs = 500;
-}  // namespace
-
 namespace ui {
 
 namespace {
@@ -131,35 +127,24 @@
   if (ClipboardMonitor::GetInstance()->GetNotifier() == this) {
     ClipboardMonitor::GetInstance()->SetNotifier(nullptr);
   }
-  if (monitoring_clipboard_changes_) {
+  if (clipboard_change_subscription_) {
     StopNotifying();
   }
 }
 
 void ClipboardMac::StartNotifying() {
-  if (!monitoring_clipboard_changes_) {
-    DCHECK(!clipboard_polling_timer_);
-    // Initialize `last_known_sequence_number_` to the current pasteboard state
-    // to prevent `CheckClipboardForChanges` from firing a notification if the
-    // clipboard hasn't changed since monitoring started.
-    last_known_sequence_number_ = [GetPasteboard() changeCount];
-    // Update `clipboard_sequence_` to the current state.
-    GetSequenceNumber(ClipboardBuffer::kCopyPaste);
-
-    // macOS doesn't provide a clipboard-changed notification. The only way to
-    // detect clipboard changes is by polling.
-    clipboard_polling_timer_ = std::make_unique<base::RepeatingTimer>();
-    clipboard_polling_timer_->Start(
-        FROM_HERE, base::Milliseconds(kClipboardPollingIntervalMs), this,
-        &ClipboardMac::CheckClipboardForChanges);
-    monitoring_clipboard_changes_ = true;
+  if (!clipboard_change_subscription_) {
+    // Unretained is safe because the subscription's lifetime is scoped to the
+    // lifetime of this object.
+    clipboard_change_subscription_ =
+        base::RegisterPasteboardChangedCallback(base::BindRepeating(
+            &ClipboardMac::ClipboardChanged, base::Unretained(this)));
   }
 }
 
 void ClipboardMac::StopNotifying() {
-  if (monitoring_clipboard_changes_) {
-    clipboard_polling_timer_.reset();
-    monitoring_clipboard_changes_ = false;
+  if (clipboard_change_subscription_) {
+    clipboard_change_subscription_ = base::CallbackListSubscription();
   }
 }
 
@@ -529,7 +514,7 @@
   // which will then update `last_known_sequence_number_` and
   // `clipboard_sequence_`, and subsequently call
   // `NotifyClipboardDataChanged`. This avoids redundant notifications.
-  if (!monitoring_clipboard_changes_) {
+  if (!clipboard_change_subscription_) {
     ClipboardMonitor::GetInstance()->NotifyClipboardDataChanged();
   }
 }
@@ -667,8 +652,8 @@
   [pasteboard writeObjects:@[ image ]];
 }
 
-void ClipboardMac::CheckClipboardForChanges() {
-  NSInteger current_sequence_number = [GetPasteboard() changeCount];
+void ClipboardMac::ClipboardChanged() {
+  NSInteger current_sequence_number = GetPasteboard().changeCount;
   if (current_sequence_number != last_known_sequence_number_) {
     last_known_sequence_number_ = current_sequence_number;
     // Update clipboard_sequence_ to reflect the new number and generate a new
diff --git a/ui/base/l10n/l10n_util.cc b/ui/base/l10n/l10n_util.cc
index d455150..ceed3b3e 100644
--- a/ui/base/l10n/l10n_util.cc
+++ b/ui/base/l10n/l10n_util.cc
@@ -969,7 +969,7 @@
   return g_available_locales.Get();
 }
 
-bool IsUserFacingUILocale(const std::string& locale) {
+bool IsUserFacingUILocale(std::string_view locale) {
   // As there are many callers of IsUserFacingUILocale and
   // GetUserFacingUILocaleList from threads where I/O is prohibited, do not
   // perform I/O here.
@@ -1006,9 +1006,8 @@
   static base::NoDestructor<std::vector<std::string>> available_locales([] {
     std::vector<std::string> locales;
     for (std::string_view accept_language : kAcceptLanguageList) {
-      std::string locale(accept_language);
-      if (IsUserFacingUILocale(locale)) {
-        locales.push_back(locale);
+      if (IsUserFacingUILocale(accept_language)) {
+        locales.emplace_back(accept_language);
       }
     }
     return locales;
@@ -1039,8 +1038,8 @@
   return kAcceptLanguageList.contains(locale);
 }
 
-bool IsAcceptLanguageDisplayable(const std::string& display_locale,
-                                 const std::string& locale) {
+bool IsAcceptLanguageDisplayable(std::string_view display_locale,
+                                 std::string_view locale) {
   return IsPossibleAcceptLanguage(locale) &&
          l10n_util::IsLocaleNameTranslated(locale, display_locale);
 }
diff --git a/ui/base/l10n/l10n_util.h b/ui/base/l10n/l10n_util.h
index 06fd22c..cf2f9c7 100644
--- a/ui/base/l10n/l10n_util.h
+++ b/ui/base/l10n/l10n_util.h
@@ -266,7 +266,7 @@
 // This is similar to CheckAndResolveLocale, except that it excludes some
 // languages from being shown.
 COMPONENT_EXPORT(UI_BASE)
-bool IsUserFacingUILocale(const std::string& locale);
+bool IsUserFacingUILocale(std::string_view locale);
 
 // Returns the subset of locales from GetAcceptLanguages which we should show
 // to the user as a supported UI locale.
@@ -283,18 +283,18 @@
 COMPONENT_EXPORT(UI_BASE)
 void GetAcceptLanguages(std::vector<std::string>* locale_codes);
 
-// Returns true if |locale| is in a predefined |AcceptLanguageList|.
+// Returns true if `locale` is in a predefined `kAcceptLanguageList`.
 COMPONENT_EXPORT(UI_BASE)
 bool IsPossibleAcceptLanguage(std::string_view locale);
 
-// Returns true if |locale| is in a predefined |AcceptLanguageList| and
-// a display name for the |locale| is available in the locale |display_locale|.
+// Returns true if `locale` is in a predefined `kAcceptLanguageList` and
+// a display name for the `locale` is available in the locale `display_locale`.
 COMPONENT_EXPORT(UI_BASE)
-bool IsAcceptLanguageDisplayable(const std::string& display_locale,
-                                 const std::string& locale);
+bool IsAcceptLanguageDisplayable(std::string_view display_locale,
+                                 std::string_view locale);
 
 // Filters the input vector of languages. Returns only those in the
-// |AcceptLanguageList|.
+// `kAcceptLanguageList`.
 COMPONENT_EXPORT(UI_BASE)
 std::vector<std::string> KeepAcceptedLanguages(
     base::span<const std::string> languages);
diff --git a/ui/base/metadata/OWNERS b/ui/base/metadata/OWNERS
new file mode 100644
index 0000000..466a4c4
--- /dev/null
+++ b/ui/base/metadata/OWNERS
@@ -0,0 +1,3 @@
+kylixrd@chromium.org
+elainechien@chromium.org
+dayeung@chromium.org
diff --git a/ui/display/display_features.cc b/ui/display/display_features.cc
index 18218c88..d53821d 100644
--- a/ui/display/display_features.cc
+++ b/ui/display/display_features.cc
@@ -5,6 +5,7 @@
 #include "ui/display/display_features.h"
 
 #include "base/feature_list.h"
+#include "base/features.h"
 #include "build/build_config.h"
 
 namespace display {
@@ -143,5 +144,18 @@
   return base::FeatureList::IsEnabled(kOpsDisplayScaleFactor);
 }
 
+// Optimizes ScreenWinDisplay lookup by caching an HMONITOR for each display.
+// This is part of a combined performance experiment so requires both this flag
+// and "ReducePPMs". In case of errors this flag can be disabled without
+// affecting the rest of the experiment.
+BASE_FEATURE(kScreenWinDisplayLookupByHMONITOR,
+             "ScreenWinDisplayLookupByHMONITOR",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+bool IsScreenWinDisplayLookupByHMONITOREnabled() {
+  return base::FeatureList::IsEnabled(base::features::kReducePPMs) &&
+         base::FeatureList::IsEnabled(kScreenWinDisplayLookupByHMONITOR);
+}
+
 }  // namespace features
 }  // namespace display
diff --git a/ui/display/display_features.h b/ui/display/display_features.h
index 3ef07bd..2b94c710 100644
--- a/ui/display/display_features.h
+++ b/ui/display/display_features.h
@@ -76,6 +76,12 @@
 
 COMPONENT_EXPORT(DISPLAY_FEATURES) bool IsOpsDisplayScaleFactorEnabled();
 
+COMPONENT_EXPORT(DISPLAY_FEATURES)
+BASE_DECLARE_FEATURE(kScreenWinDisplayLookupByHMONITOR);
+
+COMPONENT_EXPORT(DISPLAY_FEATURES)
+bool IsScreenWinDisplayLookupByHMONITOREnabled();
+
 }  // namespace features
 }  // namespace display
 
diff --git a/ui/display/win/display_info.cc b/ui/display/win/display_info.cc
index 3aefd70..5800814 100644
--- a/ui/display/win/display_info.cc
+++ b/ui/display/win/display_info.cc
@@ -28,6 +28,7 @@
 }  // namespace
 
 DisplayInfo::DisplayInfo(
+    std::optional<HMONITOR> hmonitor,
     const MONITORINFOEX& monitor_info,
     float device_scale_factor,
     float sdr_white_level,
@@ -46,7 +47,8 @@
       pixels_per_inch_(pixels_per_inch),
       output_technology_(output_technology),
       label_(label),
-      device_name_(FixedArrayToStringView(monitor_info.szDevice)) {}
+      device_name_(FixedArrayToStringView(monitor_info.szDevice)),
+      hmonitor_(hmonitor) {}
 
 DisplayInfo::DisplayInfo(
     int64_t id,
diff --git a/ui/display/win/display_info.h b/ui/display/win/display_info.h
index d3abc95..151cd67a 100644
--- a/ui/display/win/display_info.h
+++ b/ui/display/win/display_info.h
@@ -9,6 +9,8 @@
 
 #include <stdint.h>
 
+#include <optional>
+
 #include "ui/display/display.h"
 #include "ui/display/display_export.h"
 
@@ -17,7 +19,8 @@
 // Gathers the parameters necessary to create a win::ScreenWinDisplay.
 class DISPLAY_EXPORT DisplayInfo final {
  public:
-  DisplayInfo(const MONITORINFOEX& monitor_info,
+  DisplayInfo(std::optional<HMONITOR> hmonitor,
+              const MONITORINFOEX& monitor_info,
               float device_scale_factor,
               float sdr_white_level,
               Display::Rotation rotation,
@@ -57,6 +60,7 @@
   }
   const std::string& label() const { return label_; }
   const std::wstring& device_name() const { return device_name_; }
+  const std::optional<HMONITOR>& hmonitor() const { return hmonitor_; }
 
   bool operator==(const DisplayInfo& rhs) const;
 
@@ -80,6 +84,9 @@
   std::string label_;
   // The MONITORINFOEX::szDevice device name representing the display.
   std::wstring device_name_;
+  // The handle of the display. This will become invalid whenever a
+  // WM_DISPLAYCHANGE message is sent.
+  std::optional<HMONITOR> hmonitor_;
 };
 
 }  // namespace display::win::internal
diff --git a/ui/display/win/scaling_util_unittest.cc b/ui/display/win/scaling_util_unittest.cc
index 4b831660..f4a808b 100644
--- a/ui/display/win/scaling_util_unittest.cc
+++ b/ui/display/win/scaling_util_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "ui/display/win/scaling_util.h"
 
+#include <optional>
+
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/display/win/test/screen_util_win.h"
 #include "ui/gfx/geometry/rect.h"
@@ -24,7 +26,7 @@
                                                  gfx::Rect(x, y, width, height),
                                                  kFakeDisplayName);
   return internal::DisplayInfo(
-      monitor_info, scale_factor, 1.0f, Display::ROTATE_0, 60.0f,
+      std::nullopt, monitor_info, scale_factor, 1.0f, Display::ROTATE_0, 60.0f,
       gfx::Vector2dF(), DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER, std::string());
 }
 
diff --git a/ui/display/win/screen_win.cc b/ui/display/win/screen_win.cc
index 79742b4d..a3b287d9 100644
--- a/ui/display/win/screen_win.cc
+++ b/ui/display/win/screen_win.cc
@@ -12,10 +12,12 @@
 #include <optional>
 #include <sstream>
 
+#include "base/check.h"
 #include "base/compiler_specific.h"
 #include "base/containers/contains.h"
 #include "base/containers/flat_set.h"
 #include "base/debug/alias.h"
+#include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/hash/hash.h"
@@ -400,7 +402,7 @@
   return displays;
 }
 
-std::optional<MONITORINFOEX> MonitorInfoFromHMONITOR(HMONITOR monitor) {
+std::optional<MONITORINFOEX> GetMonitorInfoFromHMONITOR(HMONITOR monitor) {
   MONITORINFOEX monitor_info = {};
   monitor_info.cbSize = sizeof(monitor_info);
   if (::GetMonitorInfo(monitor, &monitor_info) == 0) {
@@ -463,11 +465,13 @@
                       reinterpret_cast<LPARAM>(&monitors));
 
   std::vector<internal::DisplayInfo> display_infos;
+  display_infos.reserve(monitors.size());
+
   base::flat_set<int64_t> hashed_ids;
   base::flat_set<int64_t> hashed_keys;
   for (HMONITOR monitor : monitors) {
     const std::optional<MONITORINFOEX> monitor_info =
-        MonitorInfoFromHMONITOR(monitor);
+        GetMonitorInfoFromHMONITOR(monitor);
     if (!monitor_info) {
       DLOG(WARNING) << "Failed to get MONITORINFOEX for " << monitor;
       continue;
@@ -479,10 +483,14 @@
         GetMonitorPixelsPerInch(monitor).value_or(
             GetDefaultMonitorPhysicalPixelsPerInch());
     const auto path_info = GetDisplayConfigPathInfo(monitor);
+    std::optional<HMONITOR> cached_hmonitor;
+    if (features::IsScreenWinDisplayLookupByHMONITOREnabled()) {
+      cached_hmonitor = monitor;
+    }
     display_infos.emplace_back(
-        *monitor_info, GetMonitorScaleFactor(monitor),
-        GetSDRWhiteLevel(path_info), display_settings.rotation,
-        display_settings.frequency, pixels_per_inch,
+        std::move(cached_hmonitor), *monitor_info,
+        GetMonitorScaleFactor(monitor), GetSDRWhiteLevel(path_info),
+        display_settings.rotation, display_settings.frequency, pixels_per_inch,
         GetOutputTechnology(path_info), GetFriendlyDeviceName(path_info));
 
     // Gauge ids derived from DISPLAY_DEVICE's DeviceID and DeviceKey.
@@ -584,8 +592,9 @@
                                   ? Display::GetForcedDeviceScaleFactor()
                                   : 1.0;
   internal::DisplayInfo display_info(
-      monitor_info, device_scale_factor, 1.0f, Display::ROTATE_0, 60.0f,
-      gfx::Vector2dF(), DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER, std::string());
+      std::nullopt, monitor_info, device_scale_factor, 1.0f, Display::ROTATE_0,
+      60.0f, gfx::Vector2dF(), DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER,
+      std::string());
   ScreenWinDisplay screen_win_display(display_info);
   screen_win_display.modifiable_display().set_detected(false);
   return screen_win_display;
@@ -941,6 +950,9 @@
   // speculative workaround for the issue observed on older version of Windows
   // 10.  See crbug.com/394622418 for more detail.
   auto primary_monitor = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY);
+
+  // Get a new list of displays. This will replace `screen_win_displays_` if any
+  // displays are found.
   auto new_screen_win_displays = DisplayInfosToScreenWinDisplays(
       display_infos, color_profile_reader_.get(), dxgi_info_.get());
 
@@ -952,9 +964,13 @@
       // Mark displays undetected.
       for (auto& screen_win_display : screen_win_displays_) {
         screen_win_display.modifiable_display().set_detected(false);
+
+        // The cached HMONITOR may have become invalid on WM_DISPLAYCHANGE.
+        screen_win_display.InvalidateHMONITOR();
       }
       return;
     } else {
+      // `screen_win_displays_` will be replaced with the empty list.
       LOG(WARNING) << "No displays detected, but skipping is disabled.";
     }
   }
@@ -1017,23 +1033,39 @@
   scale_factor_observation_.Observe(UwpTextScaleFactor::Instance());
 }
 
+HMONITOR ScreenWin::HMONITORFromScreenPoint(
+    const gfx::Point& screen_point) const {
+  return ::MonitorFromPoint(screen_point.ToPOINT(), MONITOR_DEFAULTTONEAREST);
+}
+
+HMONITOR ScreenWin::HMONITORFromScreenRect(const gfx::Rect& screen_rect) const {
+  const RECT win_rect = screen_rect.ToRECT();
+  return ::MonitorFromRect(&win_rect, MONITOR_DEFAULTTONEAREST);
+}
+
+HMONITOR ScreenWin::HMONITORFromWindow(HWND hwnd, DWORD default_options) const {
+  return ::MonitorFromWindow(hwnd, default_options);
+}
+
 std::optional<MONITORINFOEX> ScreenWin::MonitorInfoFromScreenPoint(
     const gfx::Point& screen_point) const {
-  return MonitorInfoFromHMONITOR(
-      ::MonitorFromPoint(screen_point.ToPOINT(), MONITOR_DEFAULTTONEAREST));
+  return MonitorInfoFromHMONITOR(HMONITORFromScreenPoint(screen_point));
 }
 
 std::optional<MONITORINFOEX> ScreenWin::MonitorInfoFromScreenRect(
     const gfx::Rect& screen_rect) const {
-  const RECT win_rect = screen_rect.ToRECT();
-  return MonitorInfoFromHMONITOR(
-      ::MonitorFromRect(&win_rect, MONITOR_DEFAULTTONEAREST));
+  return MonitorInfoFromHMONITOR(HMONITORFromScreenRect(screen_rect));
 }
 
 std::optional<MONITORINFOEX> ScreenWin::MonitorInfoFromWindow(
     HWND hwnd,
     DWORD default_options) const {
-  return MonitorInfoFromHMONITOR(::MonitorFromWindow(hwnd, default_options));
+  return MonitorInfoFromHMONITOR(HMONITORFromWindow(hwnd, default_options));
+}
+
+std::optional<MONITORINFOEX> ScreenWin::MonitorInfoFromHMONITOR(
+    HMONITOR monitor) const {
+  return GetMonitorInfoFromHMONITOR(monitor);
 }
 
 int64_t ScreenWin::GetDisplayIdFromMonitorInfo(
@@ -1097,17 +1129,28 @@
 }
 
 ScreenWinDisplay ScreenWin::GetScreenWinDisplayNearestHWND(HWND hwnd) const {
+  if (features::IsScreenWinDisplayLookupByHMONITOREnabled()) {
+    return GetScreenWinDisplayForHMONITOR(
+        HMONITORFromWindow(hwnd, MONITOR_DEFAULTTONEAREST));
+  }
   return GetScreenWinDisplay(MonitorInfoFromWindow(hwnd,
                                                    MONITOR_DEFAULTTONEAREST));
 }
 
 ScreenWinDisplay ScreenWin::GetScreenWinDisplayNearestScreenRect(
     const gfx::Rect& screen_rect) const {
+  if (features::IsScreenWinDisplayLookupByHMONITOREnabled()) {
+    return GetScreenWinDisplayForHMONITOR(HMONITORFromScreenRect(screen_rect));
+  }
   return GetScreenWinDisplay(MonitorInfoFromScreenRect(screen_rect));
 }
 
 ScreenWinDisplay ScreenWin::GetScreenWinDisplayNearestScreenPoint(
     const gfx::Point& screen_point) const {
+  if (features::IsScreenWinDisplayLookupByHMONITOREnabled()) {
+    return GetScreenWinDisplayForHMONITOR(
+        HMONITORFromScreenPoint(screen_point));
+  }
   return GetScreenWinDisplay(MonitorInfoFromScreenPoint(screen_point));
 }
 
@@ -1180,6 +1223,20 @@
   return GetPrimaryScreenWinDisplay();
 }
 
+ScreenWinDisplay ScreenWin::GetScreenWinDisplayForHMONITOR(
+    HMONITOR monitor) const {
+  CHECK(features::IsScreenWinDisplayLookupByHMONITOREnabled());
+  const auto it =
+      std::ranges::find(screen_win_displays_, monitor,
+                        [](const auto& display) { return display.hmonitor(); });
+  if (it != screen_win_displays_.cend()) {
+    return *it;
+  }
+  // A display's hmonitor() may be nullopt, in which case the display
+  // won't be matched. Fall back to searching by MONITORINFOEX, which is slower.
+  return GetScreenWinDisplay(MonitorInfoFromHMONITOR(monitor));
+}
+
 // static
 template <typename Getter, typename GetterType>
 ScreenWinDisplay ScreenWin::GetScreenWinDisplayVia(Getter getter,
diff --git a/ui/display/win/screen_win.h b/ui/display/win/screen_win.h
index 412534d..436762c 100644
--- a/ui/display/win/screen_win.h
+++ b/ui/display/win/screen_win.h
@@ -237,6 +237,10 @@
       const std::vector<internal::DisplayInfo>& display_infos);
 
   // Virtual to support mocking by unit tests and headless screen.
+  virtual HMONITOR HMONITORFromScreenPoint(
+      const gfx::Point& screen_point) const;
+  virtual HMONITOR HMONITORFromScreenRect(const gfx::Rect& screen_rect) const;
+  virtual HMONITOR HMONITORFromWindow(HWND hwnd, DWORD default_options) const;
   virtual std::optional<MONITORINFOEX> MonitorInfoFromScreenPoint(
       const gfx::Point& screen_point) const;
   virtual std::optional<MONITORINFOEX> MonitorInfoFromScreenRect(
@@ -244,6 +248,9 @@
   virtual std::optional<MONITORINFOEX> MonitorInfoFromWindow(
       HWND hwnd,
       DWORD default_options) const;
+  virtual std::optional<MONITORINFOEX> MonitorInfoFromHMONITOR(
+      HMONITOR monitor) const;
+
   virtual int64_t GetDisplayIdFromMonitorInfo(
       const MONITORINFOEX& monitor_info) const;
   virtual HWND GetRootWindow(HWND hwnd) const;
@@ -255,11 +262,11 @@
   virtual ScreenWinDisplay GetScreenWinDisplayNearestHWND(HWND hwnd) const;
 
   // Returns the ScreenWinDisplay closest to or enclosing |screen_rect|.
-  ScreenWinDisplay GetScreenWinDisplayNearestScreenRect(
+  virtual ScreenWinDisplay GetScreenWinDisplayNearestScreenRect(
       const gfx::Rect& screen_rect) const;
 
   // Returns the ScreenWinDisplay closest to or enclosing |screen_point|.
-  ScreenWinDisplay GetScreenWinDisplayNearestScreenPoint(
+  virtual ScreenWinDisplay GetScreenWinDisplayNearestScreenPoint(
       const gfx::Point& screen_point) const;
 
   // Returns the ScreenWinDisplay closest to or enclosing |dip_point|.
@@ -277,6 +284,12 @@
   virtual ScreenWinDisplay GetScreenWinDisplay(
       std::optional<MONITORINFOEX> monitor_info) const;
 
+  // Returns the ScreenWinDisplay for the given `monitor`, first by matching on
+  // ScreenWinDisplay::hmonitor(), then by looking up the monitor info if
+  // there's no match.
+  virtual ScreenWinDisplay GetScreenWinDisplayForHMONITOR(
+      HMONITOR monitor) const;
+
   // Returns the result of GetSystemMetrics for |metric| scaled to the specified
   // |scale_factor|.
   int GetSystemMetricsForScaleFactor(float scale_factor, int metric) const;
diff --git a/ui/display/win/screen_win_display.cc b/ui/display/win/screen_win_display.cc
index b14991c..f48e08d 100644
--- a/ui/display/win/screen_win_display.cc
+++ b/ui/display/win/screen_win_display.cc
@@ -39,6 +39,12 @@
       pixel_bounds_(display_info.screen_rect()),
       pixels_per_inch_(display_info.pixels_per_inch()),
       screen_rect_(display_info.screen_rect()),
-      screen_work_rect_(display_info.screen_work_rect()) {}
+      screen_work_rect_(display_info.screen_work_rect()),
+      hmonitor_(display_info.hmonitor()) {}
+
+void ScreenWinDisplay::InvalidateHMONITOR() {
+  hmonitor_.reset();
+}
+
 }  // namespace win
 }  // namespace display
diff --git a/ui/display/win/screen_win_display.h b/ui/display/win/screen_win_display.h
index f64b34a2..29487e22 100644
--- a/ui/display/win/screen_win_display.h
+++ b/ui/display/win/screen_win_display.h
@@ -7,6 +7,8 @@
 
 #include <windows.h>
 
+#include <optional>
+
 #include "ui/display/display.h"
 #include "ui/gfx/geometry/rect.h"
 
@@ -32,8 +34,16 @@
   const gfx::Rect& screen_rect() const { return screen_rect_; }
   const gfx::Rect& screen_work_rect() const { return screen_work_rect_; }
 
+  // Returns a cached HMONITOR for the display, if any. Fake and headless
+  // displays won't have an HMONITOR.
+  const std::optional<HMONITOR>& hmonitor() const { return hmonitor_; }
+
   Display& modifiable_display() { return display_; }
 
+  // Clear the cached HMONITOR. This should be called whenever WM_DISPLAYCHANGE
+  // is received since the handle may no longer be valid.
+  void InvalidateHMONITOR();
+
  private:
   Display display_;
   gfx::Rect pixel_bounds_;
@@ -45,6 +55,8 @@
   // These are display bounds that exclude system UI, like the Windows taskbar.
   // Used to derive display::Display work areas, and for window placement logic.
   gfx::Rect screen_work_rect_;
+  // A cached HMONITOR. This may become invalid on WM_DISPLAYCHANGE.
+  std::optional<HMONITOR> hmonitor_;
 };
 
 }  // namespace win
diff --git a/ui/display/win/screen_win_headless.cc b/ui/display/win/screen_win_headless.cc
index 99bf5fa..e5f230e 100644
--- a/ui/display/win/screen_win_headless.cc
+++ b/ui/display/win/screen_win_headless.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/compiler_specific.h"
+#include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
@@ -146,6 +147,21 @@
   return GetNumDisplays() ? GetAllDisplays()[0] : Display::GetDefaultDisplay();
 }
 
+HMONITOR ScreenWinHeadless::HMONITORFromScreenPoint(
+    const gfx::Point& screen_point) const {
+  NOTREACHED();
+}
+
+HMONITOR ScreenWinHeadless::HMONITORFromScreenRect(
+    const gfx::Rect& screen_rect) const {
+  NOTREACHED();
+}
+
+HMONITOR ScreenWinHeadless::HMONITORFromWindow(HWND hwnd,
+                                               DWORD default_options) const {
+  NOTREACHED();
+}
+
 std::optional<MONITORINFOEX> ScreenWinHeadless::MonitorInfoFromScreenPoint(
     const gfx::Point& screen_point) const {
   // ScreenWin::MonitorInfoFromScreenPoint() uses Win32 ::MonitorFromPoint()
@@ -158,6 +174,11 @@
   return std::nullopt;
 }
 
+std::optional<MONITORINFOEX> ScreenWinHeadless::MonitorInfoFromHMONITOR(
+    HMONITOR monitor) const {
+  return std::nullopt;
+}
+
 gfx::Rect ScreenWinHeadless::ScreenToDIPRectInWindow(
     gfx::NativeWindow window,
     const gfx::Rect& screen_rect) const {
@@ -275,6 +296,16 @@
       MonitorInfoFromWindow(hwnd, MONITOR_DEFAULTTONEAREST));
 }
 
+ScreenWinDisplay ScreenWinHeadless::GetScreenWinDisplayNearestScreenRect(
+    const gfx::Rect& screen_rect) const {
+  return GetScreenWinDisplay(MonitorInfoFromScreenRect(screen_rect));
+}
+
+ScreenWinDisplay ScreenWinHeadless::GetScreenWinDisplayNearestScreenPoint(
+    const gfx::Point& screen_point) const {
+  return GetScreenWinDisplay(MonitorInfoFromScreenPoint(screen_point));
+}
+
 ScreenWinDisplay ScreenWinHeadless::GetPrimaryScreenWinDisplay() const {
   // ScreenWin::GetPrimaryScreenWinDisplay() searches the ScreenWinDisplay
   // table for a display with origin at (0,0), however, for headless primary
@@ -297,6 +328,13 @@
   return GetPrimaryScreenWinDisplay();
 }
 
+ScreenWinDisplay ScreenWinHeadless::GetScreenWinDisplayForHMONITOR(
+    HMONITOR monitor) const {
+  // Headless displays don't have a real HMONITOR, so all paths that call this
+  // method should be overridden.
+  NOTREACHED();
+}
+
 std::vector<internal::DisplayInfo>
 ScreenWinHeadless::DisplayInfosFromScreenInfo(
     const std::vector<headless::HeadlessScreenInfo>& screen_infos) {
diff --git a/ui/display/win/screen_win_headless.h b/ui/display/win/screen_win_headless.h
index 610dcef..7398bd1 100644
--- a/ui/display/win/screen_win_headless.h
+++ b/ui/display/win/screen_win_headless.h
@@ -68,6 +68,10 @@
   bool IsHeadless() const override;
 
   // ScreenWin:
+  HMONITOR HMONITORFromScreenPoint(
+      const gfx::Point& screen_point) const override;
+  HMONITOR HMONITORFromScreenRect(const gfx::Rect& screen_rect) const override;
+  HMONITOR HMONITORFromWindow(HWND hwnd, DWORD default_options) const override;
   std::optional<MONITORINFOEX> MonitorInfoFromScreenPoint(
       const gfx::Point& screen_point) const override;
   std::optional<MONITORINFOEX> MonitorInfoFromScreenRect(
@@ -75,6 +79,8 @@
   std::optional<MONITORINFOEX> MonitorInfoFromWindow(
       HWND hwnd,
       DWORD default_options) const override;
+  std::optional<MONITORINFOEX> MonitorInfoFromHMONITOR(
+      HMONITOR monitor) const override;
   int64_t GetDisplayIdFromMonitorInfo(
       const MONITORINFOEX& monitor_info) const override;
   HWND GetRootWindow(HWND hwnd) const override;
@@ -82,9 +88,15 @@
   void UpdateAllDisplaysIfPrimaryMonitorChanged() override;
 
   ScreenWinDisplay GetScreenWinDisplayNearestHWND(HWND hwnd) const override;
+  ScreenWinDisplay GetScreenWinDisplayNearestScreenRect(
+      const gfx::Rect& screen_rect) const override;
+  ScreenWinDisplay GetScreenWinDisplayNearestScreenPoint(
+      const gfx::Point& screen_point) const override;
   ScreenWinDisplay GetPrimaryScreenWinDisplay() const override;
   ScreenWinDisplay GetScreenWinDisplay(
       std::optional<MONITORINFOEX> monitor_info) const override;
+  ScreenWinDisplay GetScreenWinDisplayForHMONITOR(
+      HMONITOR monitor) const override;
 
   // ColorProfileReader::Client:
   void OnColorProfilesChanged() override;
diff --git a/ui/display/win/screen_win_unittest.cc b/ui/display/win/screen_win_unittest.cc
index 3972545d..b5652c06 100644
--- a/ui/display/win/screen_win_unittest.cc
+++ b/ui/display/win/screen_win_unittest.cc
@@ -14,12 +14,20 @@
 #include <inttypes.h>
 #include <stddef.h>
 
+#include <optional>
+#include <string>
 #include <unordered_map>
+#include <utility>
 #include <vector>
 
 #include "base/command_line.h"
+#include "base/containers/map_util.h"
+#include "base/feature_list.h"
+#include "base/features.h"
 #include "base/memory/raw_ptr.h"
 #include "base/strings/stringprintf.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/types/optional_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/display/display.h"
 #include "ui/display/display_features.h"
@@ -40,9 +48,9 @@
 class TestScreenWin : public ScreenWin {
  public:
   TestScreenWin(const std::vector<internal::DisplayInfo>& display_infos,
-                const std::vector<MONITORINFOEX>& monitor_infos,
+                const std::unordered_map<HMONITOR, MONITORINFOEX>& hmonitor_map,
                 const std::unordered_map<HWND, gfx::Rect>& hwnd_map)
-      : ScreenWin(false), monitor_infos_(monitor_infos), hwnd_map_(hwnd_map) {
+      : ScreenWin(false), hmonitor_map_(hmonitor_map), hwnd_map_(hwnd_map) {
     UpdateFromDisplayInfos(display_infos);
   }
 
@@ -69,11 +77,11 @@
   // Finding the corresponding monitor from a point is generally handled by
   // Windows's MonitorFromPoint. This mocked function requires that the provided
   // point is contained entirely in the monitor.
-  std::optional<MONITORINFOEX> MonitorInfoFromScreenPoint(
+  HMONITOR HMONITORFromScreenPoint(
       const gfx::Point& screen_point) const override {
-    for (const MONITORINFOEX& monitor_info : monitor_infos_) {
+    for (const auto& [hmonitor, monitor_info] : hmonitor_map_) {
       if (gfx::Rect(monitor_info.rcMonitor).Contains(screen_point))
-        return monitor_info;
+        return hmonitor;
     }
     NOTREACHED();
   }
@@ -81,17 +89,16 @@
   // Finding the corresponding monitor from a rect is generally handled by
   // Windows's MonitorFromRect. This mocked function requires that the provided
   // rectangle overlap at least part of the monitor.
-  std::optional<MONITORINFOEX> MonitorInfoFromScreenRect(
-      const gfx::Rect& screen_rect) const override {
-    MONITORINFOEX candidate = monitor_infos_[0];
+  HMONITOR HMONITORFromScreenRect(const gfx::Rect& screen_rect) const override {
+    HMONITOR candidate = hmonitor_map_.begin()->first;
     int largest_area = 0;
-    for (const MONITORINFOEX& monitor_info : monitor_infos_) {
+    for (const auto& [hmonitor, monitor_info] : hmonitor_map_) {
       gfx::Rect bounds(monitor_info.rcMonitor);
       if (bounds.Intersects(screen_rect)) {
         bounds.Intersect(screen_rect);
         int area = bounds.height() * bounds.width();
         if (largest_area < area) {
-          candidate = monitor_info;
+          candidate = hmonitor;
           largest_area = area;
         }
       }
@@ -106,23 +113,26 @@
   // otherwise this could cause MonitorInfoFromScreenRect or
   // MonitorInfoFromScreenPoint to fail to find the monitor based off of a rect
   // or point within the HWND.
-  std::optional<MONITORINFOEX> MonitorInfoFromWindow(
-      HWND hwnd,
-      DWORD default_options) const override {
+  HMONITOR HMONITORFromWindow(HWND hwnd, DWORD default_options) const override {
     auto search = hwnd_map_.find(hwnd);
     if (search != hwnd_map_.end())
-      return MonitorInfoFromScreenRect(search->second);
+      return HMONITORFromScreenRect(search->second);
 
     EXPECT_EQ(default_options, static_cast<DWORD>(MONITOR_DEFAULTTOPRIMARY));
-    for (const auto& monitor_info : monitor_infos_) {
+    for (const auto& [hmonitor, monitor_info] : hmonitor_map_) {
       if (monitor_info.rcMonitor.left == 0 &&
           monitor_info.rcMonitor.top == 0) {
-        return monitor_info;
+        return hmonitor;
       }
     }
     NOTREACHED();
   }
 
+  std::optional<MONITORINFOEX> MonitorInfoFromHMONITOR(
+      HMONITOR monitor) const override {
+    return base::OptionalFromPtr(base::FindOrNull(hmonitor_map_, monitor));
+  }
+
   HWND GetRootWindow(HWND hwnd) const override {
     return hwnd;
   }
@@ -132,7 +142,7 @@
   }
 
   raw_ptr<Screen> old_screen_ = Screen::SetScreenInstance(this);
-  std::vector<MONITORINFOEX> monitor_infos_;
+  std::unordered_map<HMONITOR, MONITORINFOEX> hmonitor_map_;
   std::unordered_map<HWND, gfx::Rect> hwnd_map_;
 };
 
@@ -151,6 +161,8 @@
                               DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER) = 0;
 
   virtual HWND CreateFakeHwnd(const gfx::Rect& bounds) = 0;
+
+  virtual HMONITOR CreateFakeHMONITOR(const MONITORINFOEX& info) = 0;
 };
 
 class TestScreenWinManager final : public TestScreenWinInitializer {
@@ -170,10 +182,14 @@
                       DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER) override {
     MONITORINFOEX monitor_info =
         win::test::CreateMonitorInfo(pixel_bounds, pixel_work, device_name);
-    monitor_infos_.push_back(monitor_info);
+    HMONITOR monitor = CreateFakeHMONITOR(monitor_info);
+    std::optional<HMONITOR> cached_hmonitor;
+    if (features::IsScreenWinDisplayLookupByHMONITOREnabled()) {
+      cached_hmonitor = monitor;
+    }
     display_infos_.push_back(internal::DisplayInfo(
-        monitor_info, device_scale_factor, 1.0f, Display::ROTATE_0, 60.0f,
-        gfx::Vector2dF(), tech, std::string()));
+        std::move(cached_hmonitor), monitor_info, device_scale_factor, 1.0f,
+        Display::ROTATE_0, 60.0f, gfx::Vector2dF(), tech, std::string()));
   }
 
   HWND CreateFakeHwnd(const gfx::Rect& bounds) override {
@@ -182,10 +198,16 @@
     return hwndLast_;
   }
 
+  HMONITOR CreateFakeHMONITOR(const MONITORINFOEX& info) override {
+    EXPECT_EQ(screen_win_, nullptr);
+    hmonitor_map_.emplace(++hmonitorLast_, info);
+    return hmonitorLast_;
+  }
+
   void InitializeScreenWin() {
     ASSERT_EQ(screen_win_, nullptr);
-    screen_win_ = std::make_unique<TestScreenWin>(display_infos_,
-                                                  monitor_infos_, hwnd_map_);
+    screen_win_ = std::make_unique<TestScreenWin>(display_infos_, hmonitor_map_,
+                                                  hwnd_map_);
   }
 
   ScreenWin* GetScreenWin() {
@@ -194,22 +216,38 @@
 
  private:
   HWND hwndLast_ = nullptr;
+  HMONITOR hmonitorLast_ = nullptr;
   std::unique_ptr<ScreenWin> screen_win_;
-  std::vector<MONITORINFOEX> monitor_infos_;
   std::vector<internal::DisplayInfo> display_infos_;
+  std::unordered_map<HMONITOR, MONITORINFOEX> hmonitor_map_;
   std::unordered_map<HWND, gfx::Rect> hwnd_map_;
 };
 
-class ScreenWinTest : public testing::Test {
+class ScreenWinTest : public ::testing::TestWithParam<bool> {
+  using Super = ::testing::TestWithParam<bool>;
+
  public:
   ScreenWinTest(const ScreenWinTest&) = delete;
   ScreenWinTest& operator=(const ScreenWinTest&) = delete;
 
+  static std::string ParamInfoToString(
+      ::testing::TestParamInfo<bool> param_info) {
+    return param_info.param ? "CachedHmonitor" : "UncachedHmonitor";
+  }
+
  protected:
-  ScreenWinTest() = default;
+  ScreenWinTest() {
+    // Always enable kReducePPMs. Toggle kScreenWinDisplayLookupByHMONITOR
+    // based on the test param, to make sure it can be disabled independently.
+    scoped_feature_list_.InitWithFeatureStates({
+        {base::features::kReducePPMs, true},
+        {display::features::kScreenWinDisplayLookupByHMONITOR,
+         use_cached_hmonitor_},
+    });
+  }
 
   void SetUp() override {
-    testing::Test::SetUp();
+    Super::SetUp();
     screen_win_initializer_ = std::make_unique<TestScreenWinManager>();
     SetUpScreen(screen_win_initializer_.get());
     screen_win_initializer_->InitializeScreenWin();
@@ -217,7 +255,7 @@
 
   void TearDown() override {
     screen_win_initializer_.reset();
-    testing::Test::TearDown();
+    Super::TearDown();
   }
 
   virtual void SetUpScreen(TestScreenWinInitializer* initializer) = 0;
@@ -229,7 +267,11 @@
 
   ScreenWin* GetScreenWin() { return screen_win_initializer_->GetScreenWin(); }
 
+ protected:
+  bool use_cached_hmonitor_ = GetParam();
+
  private:
+  base::test::ScopedFeatureList scoped_feature_list_;
   std::unique_ptr<TestScreenWinManager> screen_win_initializer_;
 };
 
@@ -258,6 +300,11 @@
   HWND fake_hwnd_ = nullptr;
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestSingleDisplay1x,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 void expect_point_f_eq(gfx::PointF val1, gfx::PointF val2) {
   EXPECT_FLOAT_EQ(val1.x(), val2.x());
   EXPECT_FLOAT_EQ(val1.y(), val2.y());
@@ -265,7 +312,7 @@
 
 }  // namespace
 
-TEST_F(ScreenWinTestSingleDisplay1x, ScreenToDIPPoints) {
+TEST_P(ScreenWinTestSingleDisplay1x, ScreenToDIPPoints) {
   gfx::PointF origin(0, 0);
   gfx::PointF middle(365, 694);
   gfx::PointF lower_right(1919, 1199);
@@ -274,7 +321,7 @@
   EXPECT_EQ(lower_right, GetScreenWin()->ScreenToDIPPoint(lower_right));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, DIPToScreenPoints) {
+TEST_P(ScreenWinTestSingleDisplay1x, DIPToScreenPoints) {
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
   gfx::Point lower_right(1919, 1199);
@@ -283,7 +330,7 @@
   EXPECT_EQ(lower_right, GetScreenWin()->DIPToScreenPoint(lower_right));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, ClientToDIPPoints) {
+TEST_P(ScreenWinTestSingleDisplay1x, ClientToDIPPoints) {
   HWND hwnd = GetFakeHwnd();
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
@@ -293,7 +340,7 @@
   EXPECT_EQ(lower_right, GetScreenWin()->ClientToDIPPoint(hwnd, lower_right));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, DIPToClientPoints) {
+TEST_P(ScreenWinTestSingleDisplay1x, DIPToClientPoints) {
   HWND hwnd = GetFakeHwnd();
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
@@ -303,7 +350,7 @@
   EXPECT_EQ(lower_right, GetScreenWin()->DIPToClientPoint(hwnd, lower_right));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, ScreenToDIPRects) {
+TEST_P(ScreenWinTestSingleDisplay1x, ScreenToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
@@ -311,7 +358,7 @@
   EXPECT_EQ(middle, GetScreenWin()->ScreenToDIPRect(hwnd, middle));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, DIPToScreenRects) {
+TEST_P(ScreenWinTestSingleDisplay1x, DIPToScreenRects) {
   HWND hwnd = GetFakeHwnd();
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
@@ -319,14 +366,14 @@
   EXPECT_EQ(middle, GetScreenWin()->DIPToScreenRect(hwnd, middle));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, DIPToScreenRectNullHWND) {
+TEST_P(ScreenWinTestSingleDisplay1x, DIPToScreenRectNullHWND) {
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
   EXPECT_EQ(origin, GetScreenWin()->DIPToScreenRect(nullptr, origin));
   EXPECT_EQ(middle, GetScreenWin()->DIPToScreenRect(nullptr, middle));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, ClientToDIPRects) {
+TEST_P(ScreenWinTestSingleDisplay1x, ClientToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
@@ -334,7 +381,7 @@
   EXPECT_EQ(middle, GetScreenWin()->ClientToDIPRect(hwnd, middle));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, DIPToClientRects) {
+TEST_P(ScreenWinTestSingleDisplay1x, DIPToClientRects) {
   HWND hwnd = GetFakeHwnd();
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
@@ -342,52 +389,52 @@
   EXPECT_EQ(middle, GetScreenWin()->DIPToClientRect(hwnd, middle));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, ScreenToDIPSize) {
+TEST_P(ScreenWinTestSingleDisplay1x, ScreenToDIPSize) {
   HWND hwnd = GetFakeHwnd();
   gfx::Size size(42, 131);
   EXPECT_EQ(size, GetScreenWin()->ScreenToDIPSize(hwnd, size));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, DIPToScreenSize) {
+TEST_P(ScreenWinTestSingleDisplay1x, DIPToScreenSize) {
   HWND hwnd = GetFakeHwnd();
   gfx::Size size(42, 131);
   EXPECT_EQ(size, GetScreenWin()->DIPToScreenSize(hwnd, size));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, GetSystemMetricsInDIP) {
+TEST_P(ScreenWinTestSingleDisplay1x, GetSystemMetricsInDIP) {
   EXPECT_EQ(31, GetScreenWin()->GetSystemMetricsInDIP(31));
   EXPECT_EQ(42, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, GetScaleFactorForHWND) {
+TEST_P(ScreenWinTestSingleDisplay1x, GetScaleFactorForHWND) {
   EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetFakeHwnd()));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, GetDisplays) {
+TEST_P(ScreenWinTestSingleDisplay1x, GetDisplays) {
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(1u, displays.size());
   EXPECT_EQ(gfx::Rect(0, 0, 1920, 1200), displays[0].bounds());
   EXPECT_EQ(gfx::Rect(0, 0, 1920, 1100), displays[0].work_area());
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, GetNumDisplays) {
+TEST_P(ScreenWinTestSingleDisplay1x, GetNumDisplays) {
   EXPECT_EQ(1, GetScreen()->GetNumDisplays());
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, GetDisplayNearestWindowPrimaryDisplay) {
+TEST_P(ScreenWinTestSingleDisplay1x, GetDisplayNearestWindowPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(screen->GetPrimaryDisplay(),
             screen->GetDisplayNearestWindow(nullptr));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, GetDisplayNearestWindow) {
+TEST_P(ScreenWinTestSingleDisplay1x, GetDisplayNearestWindow) {
   Screen* screen = GetScreen();
   gfx::NativeWindow native_window = GetNativeWindowFromHWND(GetFakeHwnd());
   EXPECT_EQ(screen->GetAllDisplays()[0],
             screen->GetDisplayNearestWindow(native_window));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, GetDisplayNearestPoint) {
+TEST_P(ScreenWinTestSingleDisplay1x, GetDisplayNearestPoint) {
   Screen* screen = GetScreen();
   Display display = screen->GetAllDisplays()[0];
   EXPECT_EQ(display, screen->GetDisplayNearestPoint(gfx::Point(0, 0)));
@@ -395,7 +442,7 @@
   EXPECT_EQ(display, screen->GetDisplayNearestPoint(gfx::Point(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, GetDisplayMatching) {
+TEST_P(ScreenWinTestSingleDisplay1x, GetDisplayMatching) {
   Screen* screen = GetScreen();
   Display display = screen->GetAllDisplays()[0];
   EXPECT_EQ(display, screen->GetDisplayMatching(gfx::Rect(0, 0, 100, 100)));
@@ -403,16 +450,28 @@
             screen->GetDisplayMatching(gfx::Rect(1819, 1099, 100, 100)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, GetPrimaryDisplay) {
+TEST_P(ScreenWinTestSingleDisplay1x, GetPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(gfx::Point(0, 0), screen->GetPrimaryDisplay().bounds().origin());
 }
 
-TEST_F(ScreenWinTestSingleDisplay1x, DisconnectPrimaryDisplay) {
+TEST_P(ScreenWinTestSingleDisplay1x, DisconnectPrimaryDisplay) {
   auto* screen = GetScreen();
   ASSERT_EQ(1, screen->GetNumDisplays());
   auto primary = screen->GetPrimaryDisplay();
-  EXPECT_NE(primary.id(), display::kInvalidDisplayId);
+  const int64_t primary_id = primary.id();
+  EXPECT_NE(primary_id, display::kInvalidDisplayId);
+
+  if (use_cached_hmonitor_) {
+    // Validate that the ScreenWinDisplay starts with a cached HMONITOR.
+    const auto screen_win_display =
+        GetScreenWin()->GetScreenWinDisplayWithDisplayId(primary_id);
+    EXPECT_NE(screen_win_display.hmonitor(), std::nullopt);
+    EXPECT_EQ(GetScreenWin()
+                  ->GetScreenWinDisplayNearestScreenPoint(gfx::Point(0, 0))
+                  .display(),
+              screen_win_display.display());
+  }
 
   GetScreenWin()->UpdateFromDisplayInfos({});
 
@@ -425,6 +484,18 @@
     // status.
     new_primary.set_detected(true);
     EXPECT_EQ(primary, new_primary);
+
+    if (use_cached_hmonitor_) {
+      // The ScreenWinDisplay's cached HMONITOR should be invalidated.
+      // GetScreenWinDisplayNearestScreenPoint() should still work without it.
+      const auto screen_win_display =
+          GetScreenWin()->GetScreenWinDisplayWithDisplayId(primary_id);
+      EXPECT_EQ(screen_win_display.hmonitor(), std::nullopt);
+      EXPECT_EQ(GetScreenWin()
+                    ->GetScreenWinDisplayNearestScreenPoint(gfx::Point(0, 0))
+                    .display(),
+                screen_win_display.display());
+    }
   }
 }
 
@@ -456,9 +527,14 @@
   HWND fake_hwnd_ = nullptr;
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestSingleDisplay1_25x,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, ScreenToDIPPoints) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(292, 555.2F),
@@ -467,7 +543,7 @@
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToScreenPoints) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, DIPToScreenPoints) {
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(303, 577),
@@ -476,7 +552,7 @@
             GetScreenWin()->DIPToScreenPoint(gfx::Point(1279, 799)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, ClientToDIPPoints) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, ClientToDIPPoints) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(0, 0)));
@@ -486,7 +562,7 @@
             GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToClientPoints) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, DIPToClientPoints) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(0, 0)));
@@ -496,7 +572,7 @@
             GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(1279, 799)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, ScreenToDIPRects) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, ScreenToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 40, 80),
             GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -504,7 +580,7 @@
             GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToScreenRects) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, DIPToScreenRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 43, 84),
             GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(0, 0, 34, 67)));
@@ -512,7 +588,7 @@
             GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(168, 330, 28, 36)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToScreenRectNullHWND) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 43, 84),
             GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 34, 67)));
   EXPECT_EQ(
@@ -520,7 +596,7 @@
       GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(168, 330, 28, 36)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, ClientToDIPRects) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, ClientToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 40, 80),
             GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -528,7 +604,7 @@
             GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToClientRects) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, DIPToClientRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 43, 84),
             GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(0, 0, 34, 67)));
@@ -536,40 +612,40 @@
             GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(168, 330, 28, 36)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, ScreenToDIPSize) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, ScreenToDIPSize) {
   EXPECT_EQ(gfx::Size(34, 105),
             GetScreenWin()->ScreenToDIPSize(GetFakeHwnd(), gfx::Size(42, 131)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToScreenSize) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, DIPToScreenSize) {
   EXPECT_EQ(gfx::Size(35, 110),
             GetScreenWin()->DIPToScreenSize(GetFakeHwnd(), gfx::Size(28, 88)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, GetSystemMetricsInDIP) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, GetSystemMetricsInDIP) {
   EXPECT_EQ(25, GetScreenWin()->GetSystemMetricsInDIP(31));
   EXPECT_EQ(34, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, GetScaleFactorForHWND) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, GetScaleFactorForHWND) {
   EXPECT_EQ(1.25, GetScreenWin()->GetScaleFactorForHWND(GetFakeHwnd()));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, GetDisplays) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, GetDisplays) {
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(1u, displays.size());
   EXPECT_EQ(gfx::Rect(0, 0, 1536, 960), displays[0].bounds());
   EXPECT_EQ(gfx::Rect(0, 0, 1536, 880), displays[0].work_area());
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, GetDisplayNearestWindow) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, GetDisplayNearestWindow) {
   Screen* screen = GetScreen();
   gfx::NativeWindow native_window = GetNativeWindowFromHWND(GetFakeHwnd());
   EXPECT_EQ(screen->GetAllDisplays()[0],
             screen->GetDisplayNearestWindow(native_window));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, GetDisplayNearestPoint) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, GetDisplayNearestPoint) {
   Screen* screen = GetScreen();
   Display display = screen->GetAllDisplays()[0];
   EXPECT_EQ(display, screen->GetDisplayNearestPoint(gfx::Point(0, 0)));
@@ -577,14 +653,14 @@
   EXPECT_EQ(display, screen->GetDisplayNearestPoint(gfx::Point(1535, 959)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_25x, GetDisplayMatching) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, GetDisplayMatching) {
   Screen* screen = GetScreen();
   Display display = screen->GetAllDisplays()[0];
   EXPECT_EQ(display, screen->GetDisplayMatching(gfx::Rect(0, 0, 100, 100)));
   EXPECT_EQ(display,
             screen->GetDisplayMatching(gfx::Rect(1435, 859, 100, 100)));
 }
-TEST_F(ScreenWinTestSingleDisplay1_25x, GetPrimaryDisplay) {
+TEST_P(ScreenWinTestSingleDisplay1_25x, GetPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(gfx::Point(0, 0), screen->GetPrimaryDisplay().bounds().origin());
 }
@@ -617,9 +693,14 @@
   HWND fake_hwnd_ = nullptr;
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestSingleDisplay1_5x,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, ScreenToDIPPoints) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(243.3333F, 462.6666F),
@@ -628,7 +709,7 @@
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToScreenPoints) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, DIPToScreenPoints) {
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 693),
@@ -637,7 +718,7 @@
             GetScreenWin()->DIPToScreenPoint(gfx::Point(1279, 799)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, ClientToDIPPoints) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, ClientToDIPPoints) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(0, 0)));
@@ -647,7 +728,7 @@
             GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToClientPoints) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, DIPToClientPoints) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(0, 0)));
@@ -657,7 +738,7 @@
             GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(1279, 799)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, ScreenToDIPRects) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, ScreenToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 34, 67),
             GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -665,7 +746,7 @@
             GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToScreenRects) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, DIPToScreenRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 51, 101),
             GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(0, 0, 34, 67)));
@@ -673,7 +754,7 @@
             GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(168, 330, 28, 36)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToScreenRectNullHWND) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 51, 101),
             GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 34, 67)));
   EXPECT_EQ(
@@ -681,7 +762,7 @@
       GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(168, 330, 28, 36)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, ClientToDIPRects) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, ClientToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 34, 67),
             GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -689,7 +770,7 @@
             GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToClientRects) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, DIPToClientRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 51, 101),
             GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(0, 0, 34, 67)));
@@ -697,40 +778,40 @@
             GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(168, 330, 28, 36)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, ScreenToDIPSize) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, ScreenToDIPSize) {
   EXPECT_EQ(gfx::Size(28, 88),
             GetScreenWin()->ScreenToDIPSize(GetFakeHwnd(), gfx::Size(42, 131)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToScreenSize) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, DIPToScreenSize) {
   EXPECT_EQ(gfx::Size(42, 132),
             GetScreenWin()->DIPToScreenSize(GetFakeHwnd(), gfx::Size(28, 88)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, GetSystemMetricsInDIP) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, GetSystemMetricsInDIP) {
   EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(31));
   EXPECT_EQ(28, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, GetScaleFactorForHWND) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, GetScaleFactorForHWND) {
   EXPECT_EQ(1.5, GetScreenWin()->GetScaleFactorForHWND(GetFakeHwnd()));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, GetDisplays) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, GetDisplays) {
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(1u, displays.size());
   EXPECT_EQ(gfx::Rect(0, 0, 1280, 800), displays[0].bounds());
   EXPECT_EQ(gfx::Rect(0, 0, 1280, 734), displays[0].work_area());
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, GetDisplayNearestWindow) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, GetDisplayNearestWindow) {
   Screen* screen = GetScreen();
   gfx::NativeWindow native_window = GetNativeWindowFromHWND(GetFakeHwnd());
   EXPECT_EQ(screen->GetAllDisplays()[0],
             screen->GetDisplayNearestWindow(native_window));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, GetDisplayNearestPoint) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, GetDisplayNearestPoint) {
   Screen* screen = GetScreen();
   Display display = screen->GetAllDisplays()[0];
   EXPECT_EQ(display, screen->GetDisplayNearestPoint(gfx::Point(0, 0)));
@@ -738,14 +819,14 @@
   EXPECT_EQ(display, screen->GetDisplayNearestPoint(gfx::Point(1279, 733)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay1_5x, GetDisplayMatching) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, GetDisplayMatching) {
   Screen* screen = GetScreen();
   Display display = screen->GetAllDisplays()[0];
   EXPECT_EQ(display, screen->GetDisplayMatching(gfx::Rect(0, 0, 100, 100)));
   EXPECT_EQ(display,
             screen->GetDisplayMatching(gfx::Rect(1179, 633, 100, 100)));
 }
-TEST_F(ScreenWinTestSingleDisplay1_5x, GetPrimaryDisplay) {
+TEST_P(ScreenWinTestSingleDisplay1_5x, GetPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(gfx::Point(0, 0), screen->GetPrimaryDisplay().bounds().origin());
 }
@@ -777,9 +858,14 @@
   HWND fake_hwnd_ = nullptr;
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestSingleDisplay2x,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestSingleDisplay2x, ScreenToDIPPoints) {
+TEST_P(ScreenWinTestSingleDisplay2x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(182.5, 347),
@@ -788,7 +874,7 @@
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, DIPToScreenPoints) {
+TEST_P(ScreenWinTestSingleDisplay2x, DIPToScreenPoints) {
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
@@ -797,7 +883,7 @@
             GetScreenWin()->DIPToScreenPoint(gfx::Point(959, 599)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, ClientToDIPPoints) {
+TEST_P(ScreenWinTestSingleDisplay2x, ClientToDIPPoints) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(0, 0)));
@@ -807,7 +893,7 @@
             GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, DIPToClientPoints) {
+TEST_P(ScreenWinTestSingleDisplay2x, DIPToClientPoints) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(0, 0)));
@@ -817,7 +903,7 @@
             GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(959, 599)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, ScreenToDIPRects) {
+TEST_P(ScreenWinTestSingleDisplay2x, ScreenToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
             GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -825,7 +911,7 @@
             GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, DIPToScreenRects) {
+TEST_P(ScreenWinTestSingleDisplay2x, DIPToScreenRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
             GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(0, 0, 25, 50)));
@@ -833,7 +919,7 @@
             GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(126, 248, 21, 26)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, DIPToScreenRectNullHWND) {
+TEST_P(ScreenWinTestSingleDisplay2x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
             GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
   EXPECT_EQ(
@@ -841,7 +927,7 @@
       GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, ClientToDIPRects) {
+TEST_P(ScreenWinTestSingleDisplay2x, ClientToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
             GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -849,7 +935,7 @@
             GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, DIPToClientRects) {
+TEST_P(ScreenWinTestSingleDisplay2x, DIPToClientRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
             GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(0, 0, 25, 50)));
@@ -857,40 +943,40 @@
             GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(126, 248, 21, 26)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, ScreenToDIPSize) {
+TEST_P(ScreenWinTestSingleDisplay2x, ScreenToDIPSize) {
   EXPECT_EQ(gfx::Size(21, 66),
             GetScreenWin()->ScreenToDIPSize(GetFakeHwnd(), gfx::Size(42, 131)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, DIPToScreenSize) {
+TEST_P(ScreenWinTestSingleDisplay2x, DIPToScreenSize) {
   EXPECT_EQ(gfx::Size(42, 132),
             GetScreenWin()->DIPToScreenSize(GetFakeHwnd(), gfx::Size(21, 66)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, GetSystemMetricsInDIP) {
+TEST_P(ScreenWinTestSingleDisplay2x, GetSystemMetricsInDIP) {
   EXPECT_EQ(16, GetScreenWin()->GetSystemMetricsInDIP(31));
   EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, GetScaleFactorForHWND) {
+TEST_P(ScreenWinTestSingleDisplay2x, GetScaleFactorForHWND) {
   EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetFakeHwnd()));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, GetDisplays) {
+TEST_P(ScreenWinTestSingleDisplay2x, GetDisplays) {
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(1u, displays.size());
   EXPECT_EQ(gfx::Rect(0, 0, 960, 600), displays[0].bounds());
   EXPECT_EQ(gfx::Rect(0, 0, 960, 550), displays[0].work_area());
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, GetDisplayNearestWindow) {
+TEST_P(ScreenWinTestSingleDisplay2x, GetDisplayNearestWindow) {
   Screen* screen = GetScreen();
   gfx::NativeWindow native_window = GetNativeWindowFromHWND(GetFakeHwnd());
   EXPECT_EQ(screen->GetAllDisplays()[0],
             screen->GetDisplayNearestWindow(native_window));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, GetDisplayNearestPoint) {
+TEST_P(ScreenWinTestSingleDisplay2x, GetDisplayNearestPoint) {
   Screen* screen = GetScreen();
   Display display = screen->GetAllDisplays()[0];
   EXPECT_EQ(display, screen->GetDisplayNearestPoint(gfx::Point(0, 0)));
@@ -898,7 +984,7 @@
   EXPECT_EQ(display, screen->GetDisplayNearestPoint(gfx::Point(959, 599)));
 }
 
-TEST_F(ScreenWinTestSingleDisplay2x, GetDisplayMatching) {
+TEST_P(ScreenWinTestSingleDisplay2x, GetDisplayMatching) {
   Screen* screen = GetScreen();
   Display display = screen->GetAllDisplays()[0];
   EXPECT_EQ(display, screen->GetDisplayMatching(gfx::Rect(0, 0, 100, 100)));
@@ -943,9 +1029,14 @@
   HWND fake_hwnd_right_ = nullptr;
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestTwoDisplays1x,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestTwoDisplays1x, ScreenToDIPPoints) {
+TEST_P(ScreenWinTestTwoDisplays1x, ScreenToDIPPoints) {
   gfx::PointF left_origin(0, 0);
   gfx::PointF left_middle(365, 694);
   gfx::PointF left_lower_right(1919, 1199);
@@ -963,7 +1054,7 @@
             GetScreenWin()->ScreenToDIPPoint(right_lower_right));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, DIPToScreenPoints) {
+TEST_P(ScreenWinTestTwoDisplays1x, DIPToScreenPoints) {
   gfx::Point left_origin(0, 0);
   gfx::Point left_middle(365, 694);
   gfx::Point left_lower_right(1919, 1199);
@@ -981,7 +1072,7 @@
             GetScreenWin()->DIPToScreenPoint(right_lower_right));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, ClientToDIPPoints) {
+TEST_P(ScreenWinTestTwoDisplays1x, ClientToDIPPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
@@ -998,7 +1089,7 @@
             GetScreenWin()->ClientToDIPPoint(right_hwnd, lower_right));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, DIPToClientPoints) {
+TEST_P(ScreenWinTestTwoDisplays1x, DIPToClientPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
@@ -1015,7 +1106,7 @@
             GetScreenWin()->DIPToClientPoint(right_hwnd, lower_right));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, ScreenToDIPRects) {
+TEST_P(ScreenWinTestTwoDisplays1x, ScreenToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Rect left_origin(0, 0, 50, 100);
   gfx::Rect left_middle(253, 495, 41, 52);
@@ -1037,7 +1128,7 @@
             GetScreenWin()->ScreenToDIPRect(right_hwnd, right_origin_left));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, DIPToScreenRects) {
+TEST_P(ScreenWinTestTwoDisplays1x, DIPToScreenRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Rect left_origin(0, 0, 50, 100);
   gfx::Rect left_middle(253, 495, 41, 52);
@@ -1059,7 +1150,7 @@
             GetScreenWin()->DIPToScreenRect(right_hwnd, right_origin_left));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, DIPToScreenRectNullHWND) {
+TEST_P(ScreenWinTestTwoDisplays1x, DIPToScreenRectNullHWND) {
   gfx::Rect left_origin(0, 0, 50, 100);
   gfx::Rect left_middle(253, 495, 41, 52);
   EXPECT_EQ(left_origin, GetScreenWin()->DIPToScreenRect(nullptr, left_origin));
@@ -1077,7 +1168,7 @@
             GetScreenWin()->DIPToScreenRect(nullptr, right_origin_left));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, ClientToDIPRects) {
+TEST_P(ScreenWinTestTwoDisplays1x, ClientToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
@@ -1089,7 +1180,7 @@
   EXPECT_EQ(middle, GetScreenWin()->ClientToDIPRect(right_hwnd, middle));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, DIPToClientRects) {
+TEST_P(ScreenWinTestTwoDisplays1x, DIPToClientRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
@@ -1101,7 +1192,7 @@
   EXPECT_EQ(middle, GetScreenWin()->DIPToClientRect(right_hwnd, middle));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, ScreenToDIPSize) {
+TEST_P(ScreenWinTestTwoDisplays1x, ScreenToDIPSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Size size(42, 131);
   EXPECT_EQ(size, GetScreenWin()->ScreenToDIPSize(left_hwnd, size));
@@ -1110,7 +1201,7 @@
   EXPECT_EQ(size, GetScreenWin()->ScreenToDIPSize(right_hwnd, size));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, DIPToScreenSize) {
+TEST_P(ScreenWinTestTwoDisplays1x, DIPToScreenSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Size size(42, 131);
   EXPECT_EQ(size, GetScreenWin()->DIPToScreenSize(left_hwnd, size));
@@ -1119,17 +1210,17 @@
   EXPECT_EQ(size, GetScreenWin()->DIPToScreenSize(right_hwnd, size));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, GetSystemMetricsInDIP) {
+TEST_P(ScreenWinTestTwoDisplays1x, GetSystemMetricsInDIP) {
   EXPECT_EQ(31, GetScreenWin()->GetSystemMetricsInDIP(31));
   EXPECT_EQ(42, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, GetScaleFactorForHWND) {
+TEST_P(ScreenWinTestTwoDisplays1x, GetScaleFactorForHWND) {
   EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetLeftFakeHwnd()));
   EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetRightFakeHwnd()));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, GetDisplays) {
+TEST_P(ScreenWinTestTwoDisplays1x, GetDisplays) {
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(2u, displays.size());
   EXPECT_EQ(gfx::Rect(0, 0, 1920, 1200), displays[0].bounds());
@@ -1138,17 +1229,17 @@
   EXPECT_EQ(gfx::Rect(1920, 0, 800, 600), displays[1].work_area());
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, GetNumDisplays) {
+TEST_P(ScreenWinTestTwoDisplays1x, GetNumDisplays) {
   EXPECT_EQ(2, GetScreen()->GetNumDisplays());
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, GetDisplayNearestWindowPrimaryDisplay) {
+TEST_P(ScreenWinTestTwoDisplays1x, GetDisplayNearestWindowPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(screen->GetPrimaryDisplay(),
             screen->GetDisplayNearestWindow(nullptr));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, GetDisplayNearestWindow) {
+TEST_P(ScreenWinTestTwoDisplays1x, GetDisplayNearestWindow) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -1160,7 +1251,7 @@
   EXPECT_EQ(right_display, screen->GetDisplayNearestWindow(right_window));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, GetDisplayNearestPoint) {
+TEST_P(ScreenWinTestTwoDisplays1x, GetDisplayNearestPoint) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -1177,7 +1268,7 @@
             screen->GetDisplayNearestPoint(gfx::Point(2719, 599)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, GetDisplayMatching) {
+TEST_P(ScreenWinTestTwoDisplays1x, GetDisplayMatching) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -1193,7 +1284,7 @@
             screen->GetDisplayMatching(gfx::Rect(2619, 499, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x, GetPrimaryDisplay) {
+TEST_P(ScreenWinTestTwoDisplays1x, GetPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(gfx::Point(0, 0), screen->GetPrimaryDisplay().bounds().origin());
 }
@@ -1236,9 +1327,14 @@
   HWND fake_hwnd_right_ = nullptr;
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestTwoDisplays2x,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestTwoDisplays2x, ScreenToDIPPoints) {
+TEST_P(ScreenWinTestTwoDisplays2x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(182.5, 347),
@@ -1254,7 +1350,7 @@
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(2719, 599)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, DIPToScreenPoints) {
+TEST_P(ScreenWinTestTwoDisplays2x, DIPToScreenPoints) {
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
@@ -1270,7 +1366,7 @@
             GetScreenWin()->DIPToScreenPoint(gfx::Point(1359, 299)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, ClientToDIPPoints) {
+TEST_P(ScreenWinTestTwoDisplays2x, ClientToDIPPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
@@ -1288,7 +1384,7 @@
                                       right_hwnd, gfx::Point(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, DIPToClientPoints) {
+TEST_P(ScreenWinTestTwoDisplays2x, DIPToClientPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
@@ -1306,7 +1402,7 @@
             GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(959, 599)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, ScreenToDIPRects) {
+TEST_P(ScreenWinTestTwoDisplays2x, ScreenToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ScreenToDIPRect(
                                          left_hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -1327,7 +1423,7 @@
                                             gfx::Rect(1900, 200, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, DIPToScreenRects) {
+TEST_P(ScreenWinTestTwoDisplays2x, DIPToScreenRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToScreenRect(
                                           left_hwnd, gfx::Rect(0, 0, 25, 50)));
@@ -1348,7 +1444,7 @@
       GetScreenWin()->DIPToScreenRect(right_hwnd, gfx::Rect(950, 100, 50, 50)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, DIPToScreenRectNullHWND) {
+TEST_P(ScreenWinTestTwoDisplays2x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
             GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
   EXPECT_EQ(
@@ -1367,7 +1463,7 @@
       GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(950, 100, 50, 50)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, ClientToDIPRects) {
+TEST_P(ScreenWinTestTwoDisplays2x, ClientToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ClientToDIPRect(
                                          left_hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -1383,7 +1479,7 @@
       GetScreenWin()->ClientToDIPRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, DIPToClientRects) {
+TEST_P(ScreenWinTestTwoDisplays2x, DIPToClientRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToClientRect(
                                           left_hwnd, gfx::Rect(0, 0, 25, 50)));
@@ -1392,7 +1488,7 @@
       GetScreenWin()->DIPToClientRect(left_hwnd, gfx::Rect(126, 248, 21, 26)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, ScreenToDIPSize) {
+TEST_P(ScreenWinTestTwoDisplays2x, ScreenToDIPSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(21, 66),
             GetScreenWin()->ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
@@ -1402,7 +1498,7 @@
             GetScreenWin()->ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, DIPToScreenSize) {
+TEST_P(ScreenWinTestTwoDisplays2x, DIPToScreenSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 132),
             GetScreenWin()->DIPToScreenSize(left_hwnd, gfx::Size(21, 66)));
@@ -1412,17 +1508,17 @@
             GetScreenWin()->DIPToScreenSize(right_hwnd, gfx::Size(21, 66)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, GetSystemMetricsInDIP) {
+TEST_P(ScreenWinTestTwoDisplays2x, GetSystemMetricsInDIP) {
   EXPECT_EQ(16, GetScreenWin()->GetSystemMetricsInDIP(31));
   EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, GetScaleFactorForHWND) {
+TEST_P(ScreenWinTestTwoDisplays2x, GetScaleFactorForHWND) {
   EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetLeftFakeHwnd()));
   EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetRightFakeHwnd()));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, GetDisplays) {
+TEST_P(ScreenWinTestTwoDisplays2x, GetDisplays) {
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(2u, displays.size());
   EXPECT_EQ(gfx::Rect(0, 0, 960, 600), displays[0].bounds());
@@ -1431,13 +1527,13 @@
   EXPECT_EQ(gfx::Rect(960, 0, 400, 300), displays[1].work_area());
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, GetDisplayNearestWindowPrimaryDisplay) {
+TEST_P(ScreenWinTestTwoDisplays2x, GetDisplayNearestWindowPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(screen->GetPrimaryDisplay(),
             screen->GetDisplayNearestWindow(nullptr));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, GetDisplayNearestWindow) {
+TEST_P(ScreenWinTestTwoDisplays2x, GetDisplayNearestWindow) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -1449,7 +1545,7 @@
   EXPECT_EQ(right_display, screen->GetDisplayNearestWindow(right_window));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, GetDisplayNearestPoint) {
+TEST_P(ScreenWinTestTwoDisplays2x, GetDisplayNearestPoint) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -1466,7 +1562,7 @@
             screen->GetDisplayNearestPoint(gfx::Point(1359, 299)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, GetDisplayMatching) {
+TEST_P(ScreenWinTestTwoDisplays2x, GetDisplayMatching) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -1482,12 +1578,12 @@
             screen->GetDisplayMatching(gfx::Rect(1259, 199, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, GetPrimaryDisplay) {
+TEST_P(ScreenWinTestTwoDisplays2x, GetPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(gfx::Point(0, 0), screen->GetPrimaryDisplay().bounds().origin());
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x, CheckIdStability) {
+TEST_P(ScreenWinTestTwoDisplays2x, CheckIdStability) {
   // Callers may use the display ID as a way to persist data like window
   // coordinates across runs. As a result, the IDs must remain stable.
   Screen* screen = GetScreen();
@@ -1562,9 +1658,14 @@
   std::vector<HWND> fake_hwnds_;
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestManyDisplays1x,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestManyDisplays1x, ScreenToDIPPoints) {
+TEST_P(ScreenWinTestManyDisplays1x, ScreenToDIPPoints) {
   gfx::PointF primary_origin(0, 0);
   gfx::PointF primary_middle(250, 252);
   gfx::PointF primary_lower_right(639, 479);
@@ -1606,7 +1707,7 @@
             GetScreenWin()->ScreenToDIPPoint(monitor4_lower_right));
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, DIPToScreenPoints) {
+TEST_P(ScreenWinTestManyDisplays1x, DIPToScreenPoints) {
   gfx::Point primary_origin(0, 0);
   gfx::Point primary_middle(250, 252);
   gfx::Point primary_lower_right(639, 479);
@@ -1648,7 +1749,7 @@
             GetScreenWin()->DIPToScreenPoint(monitor4_lower_right));
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, ClientToDIPPoints) {
+TEST_P(ScreenWinTestManyDisplays1x, ClientToDIPPoints) {
   gfx::Point origin(0, 0);
   gfx::Point middle(250, 194);
   gfx::Point lower_right(299, 299);
@@ -1662,7 +1763,7 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, DIPToClientPoints) {
+TEST_P(ScreenWinTestManyDisplays1x, DIPToClientPoints) {
   gfx::Point origin(0, 0);
   gfx::Point middle(250, 194);
   gfx::Point lower_right(299, 299);
@@ -1676,7 +1777,7 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, ScreenToDIPRects) {
+TEST_P(ScreenWinTestManyDisplays1x, ScreenToDIPRects) {
   gfx::Rect primary_origin(0, 0, 50, 100);
   gfx::Rect primary_middle(250, 252, 40, 50);
   EXPECT_EQ(primary_origin,
@@ -1713,7 +1814,7 @@
             GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(4), monitor4_middle));
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, DIPToScreenRects) {
+TEST_P(ScreenWinTestManyDisplays1x, DIPToScreenRects) {
   gfx::Rect primary_origin(0, 0, 50, 100);
   gfx::Rect primary_middle(250, 252, 40, 50);
   EXPECT_EQ(primary_origin,
@@ -1750,7 +1851,7 @@
             GetScreenWin()->DIPToScreenRect(GetFakeHwnd(4), monitor4_middle));
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, DIPToScreenRectNullHWND) {
+TEST_P(ScreenWinTestManyDisplays1x, DIPToScreenRectNullHWND) {
   gfx::Rect primary_origin(0, 0, 50, 100);
   gfx::Rect primary_middle(250, 252, 40, 50);
   EXPECT_EQ(primary_origin,
@@ -1787,7 +1888,7 @@
             GetScreenWin()->DIPToScreenRect(nullptr, monitor4_middle));
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, ClientToDIPRects) {
+TEST_P(ScreenWinTestManyDisplays1x, ClientToDIPRects) {
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
@@ -1798,7 +1899,7 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, DIPToClientRects) {
+TEST_P(ScreenWinTestManyDisplays1x, DIPToClientRects) {
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
@@ -1809,7 +1910,7 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, ScreenToDIPSize) {
+TEST_P(ScreenWinTestManyDisplays1x, ScreenToDIPSize) {
   gfx::Size size(42, 131);
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
   for (size_t i = 0; i < 5u; ++i) {
@@ -1818,7 +1919,7 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, DIPToScreenSize) {
+TEST_P(ScreenWinTestManyDisplays1x, DIPToScreenSize) {
   gfx::Size size(42, 131);
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
   for (size_t i = 0; i < 5u; ++i) {
@@ -1827,19 +1928,19 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, GetSystemMetricsInDIP) {
+TEST_P(ScreenWinTestManyDisplays1x, GetSystemMetricsInDIP) {
   EXPECT_EQ(31, GetScreenWin()->GetSystemMetricsInDIP(31));
   EXPECT_EQ(42, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, GetScaleFactorForHWND) {
+TEST_P(ScreenWinTestManyDisplays1x, GetScaleFactorForHWND) {
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
     EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetFakeHwnd(i)));
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, GetDisplays) {
+TEST_P(ScreenWinTestManyDisplays1x, GetDisplays) {
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(5u, displays.size());
   EXPECT_EQ(gfx::Rect(0, 0, 640, 480), displays[0].bounds());
@@ -1854,17 +1955,17 @@
   EXPECT_EQ(gfx::Rect(1864, 1168, 200, 200), displays[4].work_area());
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, GetNumDisplays) {
+TEST_P(ScreenWinTestManyDisplays1x, GetNumDisplays) {
   EXPECT_EQ(5, GetScreen()->GetNumDisplays());
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, GetDisplayNearestWindowPrimaryDisplay) {
+TEST_P(ScreenWinTestManyDisplays1x, GetDisplayNearestWindowPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(screen->GetPrimaryDisplay(),
             screen->GetDisplayNearestWindow(nullptr));
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, GetDisplayNearestWindow) {
+TEST_P(ScreenWinTestManyDisplays1x, GetDisplayNearestWindow) {
   Screen* screen = GetScreen();
   std::vector<Display> displays = screen->GetAllDisplays();
   ASSERT_EQ(5u, displays.size());
@@ -1876,7 +1977,7 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, GetDisplayNearestPoint) {
+TEST_P(ScreenWinTestManyDisplays1x, GetDisplayNearestPoint) {
   Screen* screen = GetScreen();
   std::vector<Display> displays = screen->GetAllDisplays();
   ASSERT_EQ(5u, displays.size());
@@ -1902,7 +2003,7 @@
             screen->GetDisplayNearestPoint(gfx::Point(2063, 1367)));
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, GetDisplayMatching) {
+TEST_P(ScreenWinTestManyDisplays1x, GetDisplayMatching) {
   Screen* screen = GetScreen();
   std::vector<Display> displays = screen->GetAllDisplays();
   ASSERT_EQ(5u, displays.size());
@@ -1927,7 +2028,7 @@
             screen->GetDisplayMatching(gfx::Rect(1963, 1267, 100, 100)));
 }
 
-TEST_F(ScreenWinTestManyDisplays1x, GetPrimaryDisplay) {
+TEST_P(ScreenWinTestManyDisplays1x, GetPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(gfx::Point(0, 0), screen->GetPrimaryDisplay().bounds().origin());
 }
@@ -1998,9 +2099,14 @@
   std::vector<HWND> fake_hwnds_;
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestManyDisplays2x,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestManyDisplays2x, ScreenToDIPPoints) {
+TEST_P(ScreenWinTestManyDisplays2x, ScreenToDIPPoints) {
   // Primary Monitor Points
   expect_point_f_eq(gfx::PointF(0, 0),
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
@@ -2042,7 +2148,7 @@
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(2063, 1367)));
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, DIPToScreenPoints) {
+TEST_P(ScreenWinTestManyDisplays2x, DIPToScreenPoints) {
   // Primary Monitor Points
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
@@ -2084,7 +2190,7 @@
             GetScreenWin()->DIPToScreenPoint(gfx::Point(1031, 683)));
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, ClientToDIPPoints) {
+TEST_P(ScreenWinTestManyDisplays2x, ClientToDIPPoints) {
   gfx::Point client_origin(0, 0);
   gfx::Point client_middle(250, 194);
   gfx::Point client_lower_right(299, 299);
@@ -2103,7 +2209,7 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, DIPToClientPoints) {
+TEST_P(ScreenWinTestManyDisplays2x, DIPToClientPoints) {
   gfx::Point dip_origin(0, 0);
   gfx::Point dip_middle(125, 97);
   gfx::Point dip_lower_right(149, 149);
@@ -2122,7 +2228,7 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, ScreenToDIPRects) {
+TEST_P(ScreenWinTestManyDisplays2x, ScreenToDIPRects) {
   // Primary Monitor
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
             GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(0),
@@ -2164,7 +2270,7 @@
                                             gfx::Rect(1955, 1224, 25, 30)));
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, DIPToScreenRects) {
+TEST_P(ScreenWinTestManyDisplays2x, DIPToScreenRects) {
   // Primary Monitor
   EXPECT_EQ(
       gfx::Rect(0, 0, 50, 100),
@@ -2206,7 +2312,7 @@
                                             gfx::Rect(977, 612, 13, 15)));
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, DIPToScreenRectNullHWND) {
+TEST_P(ScreenWinTestManyDisplays2x, DIPToScreenRectNullHWND) {
   // Primary Monitor
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
             GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
@@ -2245,7 +2351,7 @@
       GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(977, 612, 13, 15)));
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, ClientToDIPRects) {
+TEST_P(ScreenWinTestManyDisplays2x, ClientToDIPRects) {
   gfx::Rect client_screen_origin(0, 0, 50, 100);
   gfx::Rect client_dip_origin(0, 0, 25, 50);
   gfx::Rect client_screen_middle(253, 495, 41, 52);
@@ -2260,7 +2366,7 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, DIPToClientRects) {
+TEST_P(ScreenWinTestManyDisplays2x, DIPToClientRects) {
   gfx::Rect client_dip_origin(0, 0, 25, 50);
   gfx::Rect client_screen_origin(0, 0, 50, 100);
   gfx::Rect client_dip_middle(126, 247, 21, 26);
@@ -2275,7 +2381,7 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, ScreenToDIPSize) {
+TEST_P(ScreenWinTestManyDisplays2x, ScreenToDIPSize) {
   gfx::Size screen_size(42, 131);
   gfx::Size dip_size(21, 66);
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
@@ -2286,7 +2392,7 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, DIPToScreenSize) {
+TEST_P(ScreenWinTestManyDisplays2x, DIPToScreenSize) {
   gfx::Size dip_size(21, 66);
   gfx::Size screen_size(42, 132);
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
@@ -2297,19 +2403,19 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, GetSystemMetricsInDIP) {
+TEST_P(ScreenWinTestManyDisplays2x, GetSystemMetricsInDIP) {
   EXPECT_EQ(16, GetScreenWin()->GetSystemMetricsInDIP(31));
   EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, GetScaleFactorForHWND) {
+TEST_P(ScreenWinTestManyDisplays2x, GetScaleFactorForHWND) {
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
     EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetFakeHwnd(i)));
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, GetDisplays) {
+TEST_P(ScreenWinTestManyDisplays2x, GetDisplays) {
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(5u, displays.size());
   EXPECT_EQ(gfx::Rect(0, 0, 320, 240), displays[0].bounds());
@@ -2324,17 +2430,17 @@
   EXPECT_EQ(gfx::Rect(932, 584, 100, 100), displays[4].work_area());
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, GetNumDisplays) {
+TEST_P(ScreenWinTestManyDisplays2x, GetNumDisplays) {
   EXPECT_EQ(5, GetScreen()->GetNumDisplays());
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, GetDisplayNearestWindowPrimaryDisplay) {
+TEST_P(ScreenWinTestManyDisplays2x, GetDisplayNearestWindowPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(screen->GetPrimaryDisplay(),
             screen->GetDisplayNearestWindow(nullptr));
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, GetDisplayNearestWindow) {
+TEST_P(ScreenWinTestManyDisplays2x, GetDisplayNearestWindow) {
   Screen* screen = GetScreen();
   std::vector<Display> displays = screen->GetAllDisplays();
   ASSERT_EQ(5u, displays.size());
@@ -2346,7 +2452,7 @@
   }
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, GetDisplayNearestPoint) {
+TEST_P(ScreenWinTestManyDisplays2x, GetDisplayNearestPoint) {
   Screen* screen = GetScreen();
   std::vector<Display> displays = screen->GetAllDisplays();
   ASSERT_EQ(5u, displays.size());
@@ -2372,7 +2478,7 @@
             screen->GetDisplayNearestPoint(gfx::Point(1031, 683)));
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, GetDisplayMatching) {
+TEST_P(ScreenWinTestManyDisplays2x, GetDisplayMatching) {
   Screen* screen = GetScreen();
   std::vector<Display> displays = screen->GetAllDisplays();
   ASSERT_EQ(5u, displays.size());
@@ -2397,7 +2503,7 @@
             screen->GetDisplayMatching(gfx::Rect(931, 583, 100, 100)));
 }
 
-TEST_F(ScreenWinTestManyDisplays2x, GetPrimaryDisplay) {
+TEST_P(ScreenWinTestManyDisplays2x, GetPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(gfx::Point(0, 0), screen->GetPrimaryDisplay().bounds().origin());
 }
@@ -2440,9 +2546,14 @@
   HWND fake_hwnd_right_ = nullptr;
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestTwoDisplays1x2x,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, ScreenToDIPPoints) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(365, 694),
@@ -2458,7 +2569,7 @@
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(2719, 599)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToScreenPoints) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, DIPToScreenPoints) {
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(365, 694),
@@ -2474,7 +2585,7 @@
             GetScreenWin()->DIPToScreenPoint(gfx::Point(2319, 299)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, ClientToDIPPoints) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, ClientToDIPPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
@@ -2492,7 +2603,7 @@
                                       right_hwnd, gfx::Point(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToClientPoints) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, DIPToClientPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
@@ -2510,7 +2621,7 @@
             GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(959, 599)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, ScreenToDIPRects) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, ScreenToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->ScreenToDIPRect(
                                           left_hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -2531,7 +2642,7 @@
                                             gfx::Rect(1900, 200, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToScreenRects) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, DIPToScreenRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToScreenRect(
                                           left_hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -2552,7 +2663,7 @@
                                             gfx::Rect(1910, 100, 50, 50)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToScreenRectNullHWND) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
             GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 50, 100)));
   EXPECT_EQ(
@@ -2571,7 +2682,7 @@
       GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(1910, 100, 50, 50)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, ClientToDIPRects) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, ClientToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->ClientToDIPRect(
                                           left_hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -2587,7 +2698,7 @@
       GetScreenWin()->ClientToDIPRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToClientRects) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, DIPToClientRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToClientRect(
                                           left_hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -2603,7 +2714,7 @@
       GetScreenWin()->DIPToClientRect(right_hwnd, gfx::Rect(126, 248, 21, 26)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, ScreenToDIPSize) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, ScreenToDIPSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 131),
             GetScreenWin()->ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
@@ -2613,7 +2724,7 @@
             GetScreenWin()->ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToScreenSize) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, DIPToScreenSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(21, 66),
             GetScreenWin()->DIPToScreenSize(left_hwnd, gfx::Size(21, 66)));
@@ -2623,17 +2734,17 @@
             GetScreenWin()->DIPToScreenSize(right_hwnd, gfx::Size(21, 66)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, GetSystemMetricsInDIP) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, GetSystemMetricsInDIP) {
   EXPECT_EQ(31, GetScreenWin()->GetSystemMetricsInDIP(31));
   EXPECT_EQ(42, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, GetScaleFactorForHWND) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, GetScaleFactorForHWND) {
   EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetLeftFakeHwnd()));
   EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetRightFakeHwnd()));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, GetDisplays) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, GetDisplays) {
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(2u, displays.size());
   EXPECT_EQ(gfx::Rect(0, 0, 1920, 1200), displays[0].bounds());
@@ -2642,17 +2753,17 @@
   EXPECT_EQ(gfx::Rect(1920, 0, 400, 300), displays[1].work_area());
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, GetNumDisplays) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, GetNumDisplays) {
   EXPECT_EQ(2, GetScreen()->GetNumDisplays());
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, GetDisplayNearestWindowPrimaryDisplay) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, GetDisplayNearestWindowPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(screen->GetPrimaryDisplay(),
             screen->GetDisplayNearestWindow(nullptr));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, GetDisplayNearestWindow) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, GetDisplayNearestWindow) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -2664,7 +2775,7 @@
   EXPECT_EQ(right_display, screen->GetDisplayNearestWindow(right_window));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, GetDisplayNearestPoint) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, GetDisplayNearestPoint) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -2681,7 +2792,7 @@
             screen->GetDisplayNearestPoint(gfx::Point(2319, 299)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, GetDisplayMatching) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, GetDisplayMatching) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -2697,7 +2808,7 @@
             screen->GetDisplayMatching(gfx::Rect(2219, 199, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1x2x, GetPrimaryDisplay) {
+TEST_P(ScreenWinTestTwoDisplays1x2x, GetPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(gfx::Point(0, 0), screen->GetPrimaryDisplay().bounds().origin());
 }
@@ -2741,9 +2852,14 @@
   HWND fake_hwnd_right_ = nullptr;
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestTwoDisplays1_5x1x,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, ScreenToDIPPoints) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(243.3333F, 301.3333F),
@@ -2759,7 +2875,7 @@
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1439, 599)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenPoints) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenPoints) {
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 451),
@@ -2775,7 +2891,7 @@
             GetScreenWin()->DIPToScreenPoint(gfx::Point(1173, 399)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, ClientToDIPPoints) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, ClientToDIPPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
@@ -2793,7 +2909,7 @@
                                         right_hwnd, gfx::Point(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToClientPoints) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, DIPToClientPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
@@ -2811,7 +2927,7 @@
                                         right_hwnd, gfx::Point(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, ScreenToDIPRects) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, ScreenToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 34, 67), GetScreenWin()->ScreenToDIPRect(
                                          left_hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -2832,7 +2948,7 @@
                                             gfx::Rect(780, 200, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenRects) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 51, 101), GetScreenWin()->DIPToScreenRect(
                                           left_hwnd, gfx::Rect(0, 0, 34, 67)));
@@ -2853,7 +2969,7 @@
       GetScreenWin()->DIPToScreenRect(right_hwnd, gfx::Rect(514, 0, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenRectNullHWND) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 51, 101),
             GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 34, 67)));
   EXPECT_EQ(
@@ -2872,7 +2988,7 @@
       GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(514, 0, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, ClientToDIPRects) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, ClientToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 34, 67), GetScreenWin()->ClientToDIPRect(
                                          left_hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -2889,7 +3005,7 @@
       GetScreenWin()->ClientToDIPRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToClientRects) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, DIPToClientRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 51, 101), GetScreenWin()->DIPToClientRect(
                                           left_hwnd, gfx::Rect(0, 0, 34, 67)));
@@ -2906,7 +3022,7 @@
       GetScreenWin()->DIPToClientRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, ScreenToDIPSize) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, ScreenToDIPSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(28, 88),
             GetScreenWin()->ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
@@ -2916,7 +3032,7 @@
             GetScreenWin()->ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenSize) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 131),
             GetScreenWin()->DIPToScreenSize(left_hwnd, gfx::Size(28, 87)));
@@ -2926,17 +3042,17 @@
             GetScreenWin()->DIPToScreenSize(right_hwnd, gfx::Size(42, 131)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, GetSystemMetricsInDIP) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, GetSystemMetricsInDIP) {
   EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(31));
   EXPECT_EQ(28, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, GetScaleFactorForHWND) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, GetScaleFactorForHWND) {
   EXPECT_EQ(1.5, GetScreenWin()->GetScaleFactorForHWND(GetLeftFakeHwnd()));
   EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetRightFakeHwnd()));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, GetDisplays) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, GetDisplays) {
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(2u, displays.size());
   EXPECT_EQ(gfx::Rect(0, 0, 534, 400), displays[0].bounds());
@@ -2945,13 +3061,13 @@
   EXPECT_EQ(gfx::Rect(534, -80, 640, 480), displays[1].work_area());
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, GetDisplayNearestWindowPrimaryDisplay) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, GetDisplayNearestWindowPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(screen->GetPrimaryDisplay(),
             screen->GetDisplayNearestWindow(nullptr));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, GetDisplayNearestWindow) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, GetDisplayNearestWindow) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -2963,7 +3079,7 @@
   EXPECT_EQ(right_display, screen->GetDisplayNearestWindow(right_window));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, GetDisplayNearestPoint) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, GetDisplayNearestPoint) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -2981,7 +3097,7 @@
             screen->GetDisplayNearestPoint(gfx::Point(1173, 399)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, GetDisplayMatching) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, GetDisplayMatching) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -2997,7 +3113,7 @@
             screen->GetDisplayMatching(gfx::Rect(1073, 299, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays1_5x1x, GetPrimaryDisplay) {
+TEST_P(ScreenWinTestTwoDisplays1_5x1x, GetPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(gfx::Point(0, 0), screen->GetPrimaryDisplay().bounds().origin());
 }
@@ -3040,9 +3156,14 @@
   HWND fake_hwnd_right_ = nullptr;
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestTwoDisplays2x1x,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, ScreenToDIPPoints) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(182.5, 347),
@@ -3058,7 +3179,7 @@
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(2719, 599)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToScreenPoints) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, DIPToScreenPoints) {
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
@@ -3074,7 +3195,7 @@
             GetScreenWin()->DIPToScreenPoint(gfx::Point(1759, 599)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, ClientToDIPPoints) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, ClientToDIPPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
@@ -3092,7 +3213,7 @@
                                         right_hwnd, gfx::Point(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToClientPoints) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, DIPToClientPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
@@ -3110,7 +3231,7 @@
                                         right_hwnd, gfx::Point(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, ScreenToDIPRects) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, ScreenToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ScreenToDIPRect(
                                          left_hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -3131,7 +3252,7 @@
                                             gfx::Rect(1900, 200, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToScreenRects) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, DIPToScreenRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToScreenRect(
                                           left_hwnd, gfx::Rect(0, 0, 25, 50)));
@@ -3152,7 +3273,7 @@
                                             gfx::Rect(940, 200, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToScreenRectNullHWND) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
             GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
   EXPECT_EQ(
@@ -3171,7 +3292,7 @@
       GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(940, 200, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, ClientToDIPRects) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, ClientToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ClientToDIPRect(
                                          left_hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -3188,7 +3309,7 @@
       GetScreenWin()->ClientToDIPRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToClientRects) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, DIPToClientRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToClientRect(
                                           left_hwnd, gfx::Rect(0, 0, 25, 50)));
@@ -3205,7 +3326,7 @@
       GetScreenWin()->DIPToClientRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, ScreenToDIPSize) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, ScreenToDIPSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(21, 66),
             GetScreenWin()->ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
@@ -3215,7 +3336,7 @@
             GetScreenWin()->ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToScreenSize) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, DIPToScreenSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 132),
             GetScreenWin()->DIPToScreenSize(left_hwnd, gfx::Size(21, 66)));
@@ -3225,17 +3346,17 @@
             GetScreenWin()->DIPToScreenSize(right_hwnd, gfx::Size(42, 131)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, GetSystemMetricsInDIP) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, GetSystemMetricsInDIP) {
   EXPECT_EQ(16, GetScreenWin()->GetSystemMetricsInDIP(31));
   EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, GetScaleFactorForHWND) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, GetScaleFactorForHWND) {
   EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetLeftFakeHwnd()));
   EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetRightFakeHwnd()));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, GetDisplays) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, GetDisplays) {
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(2u, displays.size());
   EXPECT_EQ(gfx::Rect(0, 0, 960, 600), displays[0].bounds());
@@ -3244,17 +3365,17 @@
   EXPECT_EQ(gfx::Rect(960, 0, 800, 600), displays[1].work_area());
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, GetNumDisplays) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, GetNumDisplays) {
   EXPECT_EQ(2, GetScreen()->GetNumDisplays());
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, GetDisplayNearestWindowPrimaryDisplay) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, GetDisplayNearestWindowPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(screen->GetPrimaryDisplay(),
             screen->GetDisplayNearestWindow(nullptr));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, GetDisplayNearestWindow) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, GetDisplayNearestWindow) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -3266,7 +3387,7 @@
   EXPECT_EQ(right_display, screen->GetDisplayNearestWindow(right_window));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, GetDisplayNearestPoint) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, GetDisplayNearestPoint) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -3283,7 +3404,7 @@
             screen->GetDisplayNearestPoint(gfx::Point(1659, 599)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, GetDisplayMatching) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, GetDisplayMatching) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -3299,7 +3420,7 @@
             screen->GetDisplayMatching(gfx::Rect(1559, 499, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1x, GetPrimaryDisplay) {
+TEST_P(ScreenWinTestTwoDisplays2x1x, GetPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(gfx::Point(0, 0), screen->GetPrimaryDisplay().bounds().origin());
 }
@@ -3345,9 +3466,14 @@
   HWND fake_hwnd_right_ = nullptr;
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestTwoDisplays2x1xVirtualized,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, ScreenToDIPPoints) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(182.5, 347),
@@ -3363,7 +3489,7 @@
                     GetScreenWin()->ScreenToDIPPoint(gfx::PointF(10239, 2399)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenPoints) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenPoints) {
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
@@ -3379,7 +3505,7 @@
             GetScreenWin()->DIPToScreenPoint(gfx::Point(5119, 1199)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, ClientToDIPPoints) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, ClientToDIPPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
@@ -3397,7 +3523,7 @@
                                       right_hwnd, gfx::Point(1919, 1199)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToClientPoints) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToClientPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
             GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
@@ -3415,7 +3541,7 @@
             GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(959, 599)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, ScreenToDIPRects) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, ScreenToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ScreenToDIPRect(
                                          left_hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -3436,7 +3562,7 @@
                                             gfx::Rect(6380, 200, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenRects) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToScreenRect(
                                           left_hwnd, gfx::Rect(0, 0, 25, 50)));
@@ -3457,7 +3583,7 @@
                                             gfx::Rect(3190, 100, 50, 50)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenRectNullHWND) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
             GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
   EXPECT_EQ(
@@ -3476,7 +3602,7 @@
       GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(3190, 100, 50, 50)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, ClientToDIPRects) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, ClientToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ClientToDIPRect(
                                          left_hwnd, gfx::Rect(0, 0, 50, 100)));
@@ -3492,7 +3618,7 @@
       GetScreenWin()->ClientToDIPRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToClientRects) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToClientRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToClientRect(
                                           left_hwnd, gfx::Rect(0, 0, 25, 50)));
@@ -3508,7 +3634,7 @@
       GetScreenWin()->DIPToClientRect(right_hwnd, gfx::Rect(126, 248, 21, 26)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, ScreenToDIPSize) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, ScreenToDIPSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(21, 66),
             GetScreenWin()->ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
@@ -3518,7 +3644,7 @@
             GetScreenWin()->ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenSize) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 132),
             GetScreenWin()->DIPToScreenSize(left_hwnd, gfx::Size(21, 66)));
@@ -3528,17 +3654,17 @@
             GetScreenWin()->DIPToScreenSize(right_hwnd, gfx::Size(21, 66)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, GetSystemMetricsInDIP) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, GetSystemMetricsInDIP) {
   EXPECT_EQ(16, GetScreenWin()->GetSystemMetricsInDIP(31));
   EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, GetScaleFactorForHWND) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, GetScaleFactorForHWND) {
   EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetLeftFakeHwnd()));
   EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetRightFakeHwnd()));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, GetDisplays) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, GetDisplays) {
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(2u, displays.size());
   EXPECT_EQ(gfx::Rect(0, 0, 1600, 800), displays[0].bounds());
@@ -3547,18 +3673,18 @@
   EXPECT_EQ(gfx::Rect(3200, 0, 1920, 1200), displays[1].work_area());
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, GetNumDisplays) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, GetNumDisplays) {
   EXPECT_EQ(2, GetScreen()->GetNumDisplays());
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized,
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized,
        GetDisplayNearestWindowPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(screen->GetPrimaryDisplay(),
             screen->GetDisplayNearestWindow(nullptr));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, GetDisplayNearestWindow) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, GetDisplayNearestWindow) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -3570,7 +3696,7 @@
   EXPECT_EQ(right_display, screen->GetDisplayNearestWindow(right_window));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, GetDisplayNearestPoint) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, GetDisplayNearestPoint) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -3587,7 +3713,7 @@
             screen->GetDisplayNearestPoint(gfx::Point(5119, 1199)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, GetDisplayMatching) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, GetDisplayMatching) {
   Screen* screen = GetScreen();
   const Display left_display = screen->GetAllDisplays()[0];
   const Display right_display = screen->GetAllDisplays()[1];
@@ -3603,7 +3729,7 @@
             screen->GetDisplayMatching(gfx::Rect(5019, 1099, 100, 100)));
 }
 
-TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, GetPrimaryDisplay) {
+TEST_P(ScreenWinTestTwoDisplays2x1xVirtualized, GetPrimaryDisplay) {
   Screen* screen = GetScreen();
   EXPECT_EQ(gfx::Point(0, 0), screen->GetPrimaryDisplay().bounds().origin());
 }
@@ -3857,9 +3983,14 @@
   }
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestTwoDisplaysOneInternal,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestTwoDisplaysOneInternal, InternalDisplayIdSet) {
+TEST_P(ScreenWinTestTwoDisplaysOneInternal, InternalDisplayIdSet) {
   EXPECT_NE(Display::InternalDisplayId(), kInvalidDisplayId);
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(2u, displays.size());
@@ -3888,9 +4019,14 @@
   }
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestOneDisplayLongName,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestOneDisplayLongName, CheckIdStability) {
+TEST_P(ScreenWinTestOneDisplayLongName, CheckIdStability) {
   // Callers may use the display ID as a way to persist data like window
   // coordinates across runs. As a result, the IDs must remain stable.
   Screen* screen = GetScreen();
@@ -3908,9 +4044,14 @@
   void SetUpScreen(TestScreenWinInitializer* initializer) override {}
 };
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         ScreenWinTestNoDisplay,
+                         ::testing::Bool(),
+                         ScreenWinTest::ParamInfoToString);
+
 }  // namespace
 
-TEST_F(ScreenWinTestNoDisplay, DIPToScreenPoints) {
+TEST_P(ScreenWinTestNoDisplay, DIPToScreenPoints) {
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
   gfx::Point lower_right(1919, 1199);
@@ -3919,7 +4060,7 @@
   EXPECT_EQ(lower_right, GetScreenWin()->DIPToScreenPoint(lower_right));
 }
 
-TEST_F(ScreenWinTestNoDisplay, DIPToScreenRectNullHWND) {
+TEST_P(ScreenWinTestNoDisplay, DIPToScreenRectNullHWND) {
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
   EXPECT_EQ(origin, GetScreenWin()->DIPToScreenRect(nullptr, origin));
@@ -3927,7 +4068,7 @@
 }
 
 // GetPrimaryDisplay should return a valid display even if there is no display.
-TEST_F(ScreenWinTestNoDisplay, GetPrimaryDisplay) {
+TEST_P(ScreenWinTestNoDisplay, GetPrimaryDisplay) {
   auto primary = GetScreen()->GetPrimaryDisplay();
   EXPECT_NE(primary.id(), display::kInvalidDisplayId);
   EXPECT_TRUE(primary.bounds().origin().IsOrigin());
@@ -3936,12 +4077,12 @@
   EXPECT_FALSE(primary.detected());
 }
 
-TEST_F(ScreenWinTestNoDisplay, GetDisplays) {
+TEST_P(ScreenWinTestNoDisplay, GetDisplays) {
   std::vector<Display> displays = GetScreen()->GetAllDisplays();
   ASSERT_EQ(0u, displays.size());
 }
 
-TEST_F(ScreenWinTestNoDisplay, GetNumDisplays) {
+TEST_P(ScreenWinTestNoDisplay, GetNumDisplays) {
   EXPECT_EQ(0, GetScreen()->GetNumDisplays());
 }
 
diff --git a/ui/display/win/test/scoped_screen_win.cc b/ui/display/win/test/scoped_screen_win.cc
index d3f43312..c445dd59 100644
--- a/ui/display/win/test/scoped_screen_win.cc
+++ b/ui/display/win/test/scoped_screen_win.cc
@@ -3,6 +3,9 @@
 // found in the LICENSE file.
 
 #include "ui/display/win/test/scoped_screen_win.h"
+
+#include <optional>
+
 #include "ui/display/win/display_info.h"
 #include "ui/display/win/test/screen_util_win.h"
 
@@ -16,8 +19,8 @@
   const MONITORINFOEX monitor_info =
       CreateMonitorInfo(kPixelBounds, kPixelWork, L"primary");
   UpdateFromDisplayInfos(
-      {{monitor_info, /*device_scale_factor=*/1.0f, 1.0f, Display::ROTATE_0,
-        60.0f, gfx::Vector2dF(96.0, 96.0),
+      {{std::nullopt, monitor_info, /*device_scale_factor=*/1.0f, 1.0f,
+        Display::ROTATE_0, 60.0f, gfx::Vector2dF(96.0, 96.0),
         DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER, std::string()}});
 }
 
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn
index 0f403e2..77d33ad9 100644
--- a/ui/gfx/BUILD.gn
+++ b/ui/gfx/BUILD.gn
@@ -1070,7 +1070,7 @@
     # External code should depend on ":ui_gfx_java" instead.
     visibility = [ ":*" ]
     sources = [ "switches.cc" ]
-    template = "android/java/src/org/chromium/ui/gfx/GfxSwitches.java.tmpl"
+    class_name = "org.chromium.ui.gfx.GfxSwitches"
   }
 
   android_library("ui_gfx_java") {
diff --git a/ui/gfx/android/java/src/org/chromium/ui/gfx/GfxSwitches.java.tmpl b/ui/gfx/android/java/src/org/chromium/ui/gfx/GfxSwitches.java.tmpl
deleted file mode 100644
index c33c50b..0000000
--- a/ui/gfx/android/java/src/org/chromium/ui/gfx/GfxSwitches.java.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.ui.gfx;
-
-/**
- * Constants for the names of ui gfx Switches.
- */
-public final class GfxSwitches {{
-
-{NATIVE_FEATURES}
-
-    // Prevent instantiation.
-    private GfxSwitches() {{}}
-}}
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
index 05c7dc7..98e774d 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
@@ -459,7 +459,8 @@
 
 std::unique_ptr<CrtcController> HardwareDisplayController::RemoveCrtc(
     const scoped_refptr<DrmDevice>& drm,
-    uint32_t crtc) {
+    uint32_t crtc,
+    CommitRequest* commit_request) {
   auto controller_it = std::ranges::find_if(
       crtc_controllers_,
       [drm, crtc](const std::unique_ptr<CrtcController>& crtc_controller) {
@@ -492,9 +493,27 @@
   owned_hardware_planes_.old_plane_list.erase(
       first_plane_to_disable_it, owned_hardware_planes_.old_plane_list.end());
 
+  if (commit_request && controller->is_enabled()) {
+    commit_request->push_back(CrtcCommitRequest::DisableCrtcRequest(
+        controller->crtc(), controller->connector()));
+  }
+
   return controller;
 }
 
+void HardwareDisplayController::RemoveAllCrtcs(CommitRequest* commit_request) {
+  std::vector<std::pair<scoped_refptr<DrmDevice>, uint32_t /*crtc*/>>
+      controllers_to_remove;
+  for (const auto& controller : crtc_controllers_) {
+    controllers_to_remove.push_back({controller->drm(), controller->crtc()});
+  }
+
+  for (const auto& [drm, crtc] : controllers_to_remove) {
+    std::unique_ptr<CrtcController> removed_crtc =
+        RemoveCrtc(drm, crtc, commit_request);
+  }
+}
+
 bool HardwareDisplayController::HasCrtc(const scoped_refptr<DrmDevice>& drm,
                                         uint32_t crtc) const {
   for (const auto& controller : crtc_controllers_) {
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller.h b/ui/ozone/platform/drm/gpu/hardware_display_controller.h
index 533a7325..57c06112 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_controller.h
+++ b/ui/ozone/platform/drm/gpu/hardware_display_controller.h
@@ -170,7 +170,10 @@
   void AddCrtc(std::unique_ptr<CrtcController> controller);
   std::unique_ptr<CrtcController> RemoveCrtc(
       const scoped_refptr<DrmDevice>& drm,
-      uint32_t crtc);
+      uint32_t crtc,
+      CommitRequest* commit_request = nullptr);
+  void RemoveAllCrtcs(CommitRequest* commit_request);
+
   bool HasCrtc(const scoped_refptr<DrmDevice>& drm, uint32_t crtc) const;
   // Returns true if the controllers are configured for hardware mirroring. Note
   // that controllers for tiled display will not support hardware mirroring.
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc b/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
index 4d6bd56..9e5e887 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
@@ -1274,6 +1274,140 @@
   EXPECT_EQ(1, successful_page_flips_count_);
 }
 
+TEST_F(HardwareDisplayControllerTest, RemoveEnabledCrtcCommitRequest) {
+  DrmOverlayPlaneList planes;
+  planes.push_back(DrmOverlayPlane::TestPlane(CreateBuffer()));
+  EXPECT_TRUE(ModesetWithPlanes(planes));
+
+  CommitRequest commit_request;
+  controller_->RemoveCrtc(drm_, primary_crtc_, &commit_request);
+  EXPECT_THAT(
+      commit_request,
+      ElementsAre(AllOf(Property(&CrtcCommitRequest::should_enable_crtc, false),
+                        Property(&CrtcCommitRequest::crtc_id, primary_crtc_))));
+}
+
+TEST_F(HardwareDisplayControllerTest, RemoveDisabledCrtcCommitRequestEmpty) {
+  CommitRequest commit_request;
+  controller_->RemoveCrtc(drm_, primary_crtc_, &commit_request);
+  EXPECT_THAT(commit_request, testing::IsEmpty());
+}
+
+TEST_F(HardwareDisplayControllerTest, RemoveAllCrtcs) {
+  InitializeDrmDevice(/*use_atomic=*/true, /*movable_planes=*/2);
+  TileProperty primary_tile_property = {.group_id = 123,
+                                        .scale_to_fit_display = true,
+                                        .tile_size = gfx::Size(300, 200),
+                                        .tile_layout = gfx::Size(2, 1),
+                                        .location = gfx::Point(0, 0)};
+
+  auto primary_tiled_crtc_controller = std::make_unique<CrtcController>(
+      drm_.get(), primary_crtc_, drm_->connector_property(0).id,
+      primary_tile_property);
+
+  TileProperty nonprimary_tile_property = primary_tile_property;
+  nonprimary_tile_property.location = gfx::Point(1, 0);
+  auto nonprimary_tiled_crtc_controller = std::make_unique<CrtcController>(
+      drm_.get(), secondary_crtc_, drm_->connector_property(1).id,
+      nonprimary_tile_property);
+
+  controller_ = std::make_unique<HardwareDisplayController>(
+      std::move(primary_tiled_crtc_controller), gfx::Point(), nullptr);
+  controller_->AddCrtc(std::move(nonprimary_tiled_crtc_controller));
+
+  DrmOverlayPlaneList modeset_planes;
+  modeset_planes.push_back(DrmOverlayPlane::TestPlane(CreateBuffer()));
+  modeset_planes.push_back(DrmOverlayPlane::TestPlane(CreateBuffer()));
+
+  // Modeset to a tile mode first so that both CRTCs are enabled.
+  drmModeModeInfo tile_mode = {.hdisplay = 300, .vdisplay = 200};
+  EXPECT_TRUE(ModesetWithPlanes(modeset_planes, tile_mode));
+
+  CommitRequest commit_request;
+  controller_->RemoveAllCrtcs(&commit_request);
+
+  EXPECT_THAT(controller_->crtc_controllers(), testing::IsEmpty());
+  EXPECT_THAT(
+      commit_request,
+      UnorderedElementsAre(
+          AllOf(Property(&CrtcCommitRequest::should_enable_crtc, false),
+                Property(&CrtcCommitRequest::crtc_id, primary_crtc_)),
+          AllOf(Property(&CrtcCommitRequest::should_enable_crtc, false),
+                Property(&CrtcCommitRequest::crtc_id, secondary_crtc_))));
+}
+
+TEST_F(HardwareDisplayControllerTest, RemoveAllCrtcsPartiallyEnabled) {
+  InitializeDrmDevice(/*use_atomic=*/true, /*movable_planes=*/2);
+  TileProperty primary_tile_property = {.group_id = 123,
+                                        .scale_to_fit_display = true,
+                                        .tile_size = gfx::Size(300, 200),
+                                        .tile_layout = gfx::Size(2, 1),
+                                        .location = gfx::Point(0, 0)};
+
+  auto primary_tiled_crtc_controller = std::make_unique<CrtcController>(
+      drm_.get(), primary_crtc_, drm_->connector_property(0).id,
+      primary_tile_property);
+
+  TileProperty nonprimary_tile_property = primary_tile_property;
+  nonprimary_tile_property.location = gfx::Point(1, 0);
+  auto nonprimary_tiled_crtc_controller = std::make_unique<CrtcController>(
+      drm_.get(), secondary_crtc_, drm_->connector_property(1).id,
+      nonprimary_tile_property);
+
+  controller_ = std::make_unique<HardwareDisplayController>(
+      std::move(primary_tiled_crtc_controller), gfx::Point(), nullptr);
+  controller_->AddCrtc(std::move(nonprimary_tiled_crtc_controller));
+
+  DrmOverlayPlaneList modeset_planes;
+  modeset_planes.push_back(DrmOverlayPlane::TestPlane(CreateBuffer()));
+  modeset_planes.push_back(DrmOverlayPlane::TestPlane(CreateBuffer()));
+
+  // Modeset to non-tile mode - should disable the nonprimary tiles.
+  drmModeModeInfo nontile_mode = {.hdisplay = 1920, .vdisplay = 1080};
+  EXPECT_TRUE(ModesetWithPlanes(modeset_planes, nontile_mode));
+
+  CommitRequest commit_request;
+  controller_->RemoveAllCrtcs(&commit_request);
+
+  EXPECT_THAT(controller_->crtc_controllers(), testing::IsEmpty());
+
+  EXPECT_THAT(commit_request,
+              UnorderedElementsAre(
+                  AllOf(Property(&CrtcCommitRequest::should_enable_crtc, false),
+                        Property(&CrtcCommitRequest::crtc_id, primary_crtc_))));
+}
+
+TEST_F(HardwareDisplayControllerTest, RemoveAllCrtcsAllDisabled) {
+  InitializeDrmDevice(/*use_atomic=*/true, /*movable_planes=*/2);
+  TileProperty primary_tile_property = {.group_id = 123,
+                                        .scale_to_fit_display = true,
+                                        .tile_size = gfx::Size(300, 200),
+                                        .tile_layout = gfx::Size(2, 1),
+                                        .location = gfx::Point(0, 0)};
+
+  auto primary_tiled_crtc_controller = std::make_unique<CrtcController>(
+      drm_.get(), primary_crtc_, drm_->connector_property(0).id,
+      primary_tile_property);
+
+  TileProperty nonprimary_tile_property = primary_tile_property;
+  nonprimary_tile_property.location = gfx::Point(1, 0);
+  auto nonprimary_tiled_crtc_controller = std::make_unique<CrtcController>(
+      drm_.get(), secondary_crtc_, drm_->connector_property(1).id,
+      nonprimary_tile_property);
+
+  controller_ = std::make_unique<HardwareDisplayController>(
+      std::move(primary_tiled_crtc_controller), gfx::Point(), nullptr);
+  controller_->AddCrtc(std::move(nonprimary_tiled_crtc_controller));
+
+  // No modeset
+
+  CommitRequest commit_request;
+  controller_->RemoveAllCrtcs(&commit_request);
+
+  EXPECT_THAT(controller_->crtc_controllers(), testing::IsEmpty());
+  EXPECT_THAT(commit_request, testing::IsEmpty());
+}
+
 TEST_F(HardwareDisplayControllerTest, Disable) {
   // Page flipping overlays is only supported on atomic configurations.
   InitializeDrmDevice(/* use_atomic= */ true);
diff --git a/ui/ozone/platform/drm/gpu/screen_manager.cc b/ui/ozone/platform/drm/gpu/screen_manager.cc
index 901760c..22caa27 100644
--- a/ui/ozone/platform/drm/gpu/screen_manager.cc
+++ b/ui/ozone/platform/drm/gpu/screen_manager.cc
@@ -317,10 +317,13 @@
 
       bool is_mirrored = (*it)->IsMirrored();
 
-      std::unique_ptr<CrtcController> crtc = (*it)->RemoveCrtc(drm, crtc_id);
-      if (crtc->is_enabled()) {
-        commit_request.push_back(CrtcCommitRequest::DisableCrtcRequest(
-            crtc->crtc(), crtc->connector()));
+      if ((*it)->IsTiled()) {
+        // Disable all CRTCs/connectors for a tiled display if any CRTC is
+        // removed. DrmGpuDisplayManager will create a new controller if any of
+        // the connectors are still connected.
+        (*it)->RemoveAllCrtcs(&commit_request);
+      } else {
+        (*it)->RemoveCrtc(drm, crtc_id, &commit_request);
       }
 
       if (!is_mirrored) {
diff --git a/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc b/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
index 31e2d1e..59df864 100644
--- a/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
@@ -2335,6 +2335,66 @@
                        Optional(EqTileProperty(nonprimary_tile_prop)))))));
 }
 
+TEST_F(ScreenManagerTest, PartialTiledCrtcRemovalRemovesAllTiledControllers) {
+  std::vector<CrtcState> crtc_states = {
+      {.planes = {{.formats = {DRM_FORMAT_XRGB8888}}}},
+      {.planes = {{.formats = {DRM_FORMAT_XRGB8888}}}}};
+  InitializeDrmState(drm_.get(), crtc_states, /*is_atomic=*/true);
+
+  uint32_t crtc_id_1 = drm_->crtc_property(0).id;
+  uint32_t connector_id_1 = drm_->connector_property(0).id;
+  uint32_t crtc_id_2 = drm_->crtc_property(1).id;
+  uint32_t connector_id_2 = drm_->connector_property(1).id;
+
+  TileProperty primary_tile_prop = {.group_id = 1,
+                                    .scale_to_fit_display = true,
+                                    .tile_size = gfx::Size(3840, 4320),
+                                    .tile_layout = gfx::Size(2, 1),
+                                    .location = gfx::Point(0, 0)};
+  std::unique_ptr<ui::HardwareDisplayControllerInfo> primary_info =
+      GetDisplayInfo(connector_id_1, crtc_id_1, /*index=*/1, primary_tile_prop);
+
+  TileProperty nonprimary_tile_prop = primary_tile_prop;
+  nonprimary_tile_prop.location = gfx::Point(1, 0);
+  primary_info->AcquireNonprimaryTileInfo(GetDisplayInfo(
+      connector_id_2, crtc_id_2, /*index=*/2, nonprimary_tile_prop));
+
+  std::unique_ptr<display::FakeDisplaySnapshot> snapshot =
+      display::FakeDisplaySnapshot::Builder()
+          .SetId(kPrimaryDisplayId)
+          .SetBaseConnectorId(primary_info->connector()->connector_id)
+          .SetNativeMode(gfx::Size(3840, 4320))
+          .SetCurrentMode(gfx::Size(3840, 4320))
+          .Build();
+
+  DrmDisplay drm_display(drm_.get(), primary_info.get(), *snapshot);
+
+  screen_manager_->AddDisplayControllersForDisplay(drm_display);
+
+  std::vector<ControllerConfigParams> controllers_to_enable;
+  controllers_to_enable.emplace_back(
+      kPrimaryDisplayId, drm_, crtc_id_1, connector_id_1, gfx::Point(0, 0),
+      std::make_unique<drmModeModeInfo>(
+          drmModeModeInfo{.hdisplay = 3840, .vdisplay = 4320}));
+  ASSERT_TRUE(screen_manager_->ConfigureDisplayControllers(
+      controllers_to_enable, {display::ModesetFlag::kTestModeset,
+                              display::ModesetFlag::kCommitModeset}));
+
+  const gfx::Rect display_bounds = gfx::Rect(0, 0, 3840 * 2, 4320);
+  HardwareDisplayController* hdc =
+      screen_manager_->GetDisplayController(display_bounds);
+  // This is the full tile composited size.
+  ASSERT_NE(hdc, nullptr);
+  ASSERT_TRUE(hdc->IsTiled());
+
+  // Remove the non-primary CRTC, it should remove the entire controller from
+  // the ScreenManager.
+  ScreenManager::CrtcsWithDrmList controllers_to_remove;
+  controllers_to_remove.emplace_back(crtc_id_2, drm_);
+  screen_manager_->RemoveDisplayControllers(controllers_to_remove);
+  ASSERT_EQ(screen_manager_->GetDisplayController(display_bounds), nullptr);
+}
+
 TEST_F(ScreenManagerTest, DetachPlanesFromAllControllersSuccess) {
   InitializeDrmStateWithDefault(drm_.get(), /*is_atomic=*/true);
   uint32_t crtc_id = drm_->crtc_property(0).id;
diff --git a/ui/touch_selection/touch_selection_magnifier_aura.cc b/ui/touch_selection/touch_selection_magnifier_aura.cc
index dba189ca..b2da53e7 100644
--- a/ui/touch_selection/touch_selection_magnifier_aura.cc
+++ b/ui/touch_selection/touch_selection_magnifier_aura.cc
@@ -295,11 +295,14 @@
   // Create the magnifier layer, which will parent the zoom layer and border
   // layer.
   magnifier_layer_ = std::make_unique<Layer>(LAYER_NOT_DRAWN);
+  magnifier_layer_->SetName("TouchSelectionMagnifierAura/MagnifierLayer");
   magnifier_layer_->SetFillsBoundsOpaquely(false);
 
   // Create the zoom layer, which will show the zoomed contents.
   zoom_layer_ = std::make_unique<Layer>(LAYER_SOLID_COLOR);
+  zoom_layer_->SetName("TouchSelectionMagnifierAura/ZoomLayer");
   zoom_layer_->SetBackgroundZoom(kMagnifierScale, 0);
+
   // BackdropFilterBounds applies after the backdrop filter (the zoom effect)
   // but before anything else, meaning its clipping effect is transformed by
   // the layer_offset() filter operation. SetRoundedCornerRadius() applies too
@@ -313,6 +316,8 @@
   // magnifier border and shadows aren't shown in the zoomed contents drawn by
   // the zoom layer.
   border_layer_ = std::make_unique<Layer>();
+  border_layer_->SetName("TouchSelectionMagnifierAura/BorderLayer");
+
   border_layer_->SetBounds(gfx::Rect(GetBorderLayerSize()));
   border_renderer_ = std::make_unique<BorderRenderer>();
   border_layer_->set_delegate(border_renderer_.get());
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index a755b8c..f93aebf 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -86,6 +86,7 @@
     "accessibility/ax_update_notifier.h",
     "accessibility/ax_update_observer.h",
     "accessibility/ax_virtual_view.h",
+    "accessibility/tree/view_accessibility_ax_tree_source.h",
     "accessibility/tree/widget_ax_manager.h",
     "accessibility/view_accessibility.h",
     "accessibility/view_accessibility_utils.h",
@@ -336,6 +337,7 @@
     "accessibility/ax_update_notifier.cc",
     "accessibility/ax_update_observer.cc",
     "accessibility/ax_virtual_view.cc",
+    "accessibility/tree/view_accessibility_ax_tree_source.cc",
     "accessibility/tree/widget_ax_manager.cc",
     "accessibility/view_accessibility.cc",
     "accessibility/view_accessibility_utils.cc",
diff --git a/ui/views/accessibility/tree/view_accessibility_ax_tree_source.cc b/ui/views/accessibility/tree/view_accessibility_ax_tree_source.cc
new file mode 100644
index 0000000..745e20fb
--- /dev/null
+++ b/ui/views/accessibility/tree/view_accessibility_ax_tree_source.cc
@@ -0,0 +1,117 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/accessibility/tree/view_accessibility_ax_tree_source.h"
+
+#include <string>
+#include <vector>
+
+#include "base/memory/raw_ptr.h"
+#include "ui/accessibility/ax_action_data.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/accessibility/ax_tree_data.h"
+#include "ui/gfx/geometry/point_f.h"
+#include "ui/gfx/geometry/transform.h"
+#include "ui/views/accessibility/ax_virtual_view.h"
+
+namespace views {
+
+ViewAccessibilityAXTreeSource::ViewAccessibilityAXTreeSource(
+    ui::AXNodeID root_id,
+    const ui::AXTreeID& tree_id)
+    : root_id_(root_id), tree_id_(tree_id) {
+  CHECK_NE(root_id_, ui::kInvalidAXNodeID);
+  CHECK_NE(tree_id_, ui::AXTreeIDUnknown());
+}
+
+ViewAccessibilityAXTreeSource::~ViewAccessibilityAXTreeSource() = default;
+
+void ViewAccessibilityAXTreeSource::HandleAccessibleAction(
+    const ui::AXActionData& action) {
+  // TODO(accessibility): Implement.
+}
+
+bool ViewAccessibilityAXTreeSource::GetTreeData(
+    ui::AXTreeData* tree_data) const {
+  // TODO(accessibility): Implement.
+  return false;
+}
+
+ViewAccessibility* ViewAccessibilityAXTreeSource::GetRoot() const {
+  // TODO(accessibility): Implement.
+  return nullptr;
+}
+
+ViewAccessibility* ViewAccessibilityAXTreeSource::GetFromId(int32_t id) const {
+  // TODO(accessibility): Implement.
+  return nullptr;
+}
+
+int32_t ViewAccessibilityAXTreeSource::GetId(ViewAccessibility* node) const {
+  return node->GetUniqueId();
+}
+
+void ViewAccessibilityAXTreeSource::CacheChildrenIfNeeded(
+    ViewAccessibility* node) {
+  // TODO(accessibility): Implement.
+}
+
+size_t ViewAccessibilityAXTreeSource::GetChildCount(
+    ViewAccessibility* node) const {
+  // TODO(accessibility): Implement.
+  return 0;
+}
+
+ViewAccessibility* ViewAccessibilityAXTreeSource::ChildAt(
+    ViewAccessibility* node,
+    size_t index) const {
+  // TODO(accessibility): Implement.
+  return nullptr;
+}
+
+void ViewAccessibilityAXTreeSource::ClearChildCache(ViewAccessibility* node) {
+  // TODO(accessibility): Implement.
+}
+
+ViewAccessibility* ViewAccessibilityAXTreeSource::GetParent(
+    ViewAccessibility* node) const {
+  // TODO(accessibility): Implement.
+  return nullptr;
+}
+
+bool ViewAccessibilityAXTreeSource::IsIgnored(ViewAccessibility* node) const {
+  // TODO(accessibility): Implement.
+  return false;
+}
+
+bool ViewAccessibilityAXTreeSource::IsEqual(ViewAccessibility* node1,
+                                            ViewAccessibility* node2) const {
+  // TODO(accessibility): Implement.
+  return false;
+}
+
+ViewAccessibility* ViewAccessibilityAXTreeSource::GetNull() const {
+  // TODO(accessibility): Implement.
+  return nullptr;
+}
+
+std::string ViewAccessibilityAXTreeSource::GetDebugString(
+    ViewAccessibility* node) const {
+  // TODO(accessibility): Implement.
+  return std::string();
+}
+
+void ViewAccessibilityAXTreeSource::SerializeNode(
+    ViewAccessibility* node,
+    ui::AXNodeData* out_data) const {
+  // TODO(accessibility): Implement.
+}
+
+std::string ViewAccessibilityAXTreeSource::ToString(ViewAccessibility* root,
+                                                    std::string prefix) {
+  // TODO(accessibility): Implement.
+  return std::string();
+}
+
+}  // namespace views
diff --git a/ui/views/accessibility/tree/view_accessibility_ax_tree_source.h b/ui/views/accessibility/tree/view_accessibility_ax_tree_source.h
new file mode 100644
index 0000000..bff2821
--- /dev/null
+++ b/ui/views/accessibility/tree/view_accessibility_ax_tree_source.h
@@ -0,0 +1,75 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_VIEWS_ACCESSIBILITY_TREE_VIEW_ACCESSIBILITY_AX_TREE_SOURCE_H_
+#define UI_VIEWS_ACCESSIBILITY_TREE_VIEW_ACCESSIBILITY_AX_TREE_SOURCE_H_
+
+#include <string>
+#include <vector>
+
+#include "base/memory/raw_ptr.h"
+#include "ui/accessibility/ax_tree_id.h"
+#include "ui/accessibility/ax_tree_source.h"
+#include "ui/views/accessibility/view_accessibility.h"
+#include "ui/views/views_export.h"
+
+namespace ui {
+struct AXActionData;
+struct AXNodeData;
+struct AXTreeData;
+}  // namespace ui
+
+namespace views {
+
+// This class exposes the views hierarchy as an accessibility tree permitting
+// use with other accessibility classes. It uses the View's ViewAccessibility
+// instance as source.
+class VIEWS_EXPORT ViewAccessibilityAXTreeSource
+    : public ui::
+          AXTreeSource<ViewAccessibility*, ui::AXTreeData*, ui::AXNodeData> {
+ public:
+  ViewAccessibilityAXTreeSource(ui::AXNodeID root_id,
+                                const ui::AXTreeID& tree_id);
+  ViewAccessibilityAXTreeSource(const ViewAccessibilityAXTreeSource&) = delete;
+  ViewAccessibilityAXTreeSource& operator=(
+      const ViewAccessibilityAXTreeSource&) = delete;
+  ~ViewAccessibilityAXTreeSource() override;
+
+  // Invokes an action on an Aura object.
+  void HandleAccessibleAction(const ui::AXActionData& action);
+
+  // AXTreeSource:
+  bool GetTreeData(ui::AXTreeData* data) const override;
+  ViewAccessibility* GetRoot() const override;
+  ViewAccessibility* GetFromId(int32_t id) const override;
+  int32_t GetId(ViewAccessibility* node) const override;
+  void CacheChildrenIfNeeded(ViewAccessibility*) override;
+  size_t GetChildCount(ViewAccessibility* node) const override;
+  void ClearChildCache(ViewAccessibility*) override;
+  ViewAccessibility* ChildAt(ViewAccessibility* node, size_t) const override;
+  ViewAccessibility* GetParent(ViewAccessibility* node) const override;
+  bool IsIgnored(ViewAccessibility* node) const override;
+  bool IsEqual(ViewAccessibility* node1,
+               ViewAccessibility* node2) const override;
+  ViewAccessibility* GetNull() const override;
+  std::string GetDebugString(ViewAccessibility* node) const override;
+  void SerializeNode(ViewAccessibility* node,
+                     ui::AXNodeData* out_data) const override;
+
+  // Useful for debugging.
+  std::string ToString(views::ViewAccessibility* root, std::string prefix);
+
+  const ui::AXTreeID tree_id() const { return tree_id_; }
+
+ private:
+  // The ID of the top-level object to use for the AX tree.
+  const ui::AXNodeID root_id_;
+
+  // ID to use for the AXTree.
+  const ui::AXTreeID tree_id_;
+};
+
+}  // namespace views
+
+#endif  // UI_VIEWS_ACCESSIBILITY_TREE_VIEW_ACCESSIBILITY_AX_TREE_SOURCE_H_
diff --git a/ui/views/accessibility/tree/widget_ax_manager.cc b/ui/views/accessibility/tree/widget_ax_manager.cc
index 6936c36..af8010f 100644
--- a/ui/views/accessibility/tree/widget_ax_manager.cc
+++ b/ui/views/accessibility/tree/widget_ax_manager.cc
@@ -30,6 +30,9 @@
 
 void WidgetAXManager::Enable() {
   is_enabled_ = true;
+  tree_source_ = std::make_unique<ViewAccessibilityAXTreeSource>(
+      widget_->GetRootView()->GetViewAccessibility().GetUniqueId(),
+      ax_tree_id_);
 }
 
 void WidgetAXManager::OnEvent(ViewAccessibility& view_ax,
diff --git a/ui/views/accessibility/tree/widget_ax_manager.h b/ui/views/accessibility/tree/widget_ax_manager.h
index f36f6c1..221df88 100644
--- a/ui/views/accessibility/tree/widget_ax_manager.h
+++ b/ui/views/accessibility/tree/widget_ax_manager.h
@@ -14,6 +14,7 @@
 #include "ui/accessibility/ax_node_id_forward.h"
 #include "ui/accessibility/ax_tree_id.h"
 #include "ui/accessibility/platform/ax_mode_observer.h"
+#include "ui/views/accessibility/tree/view_accessibility_ax_tree_source.h"
 #include "ui/views/views_export.h"
 
 namespace views {
@@ -59,6 +60,10 @@
   // The AXTreeID of the parent widget's accessibility tree, if any.
   ui::AXTreeID parent_ax_tree_id_;
 
+  // Holds the active views-based tree. A tree consists of all the views in the
+  // widget.
+  std::unique_ptr<ViewAccessibilityAXTreeSource> tree_source_;
+
   // Indicates whether we're actively serializing widget accessibility data.
   bool is_enabled_ = false;
 
diff --git a/ui/views/accessibility/tree/widget_ax_manager_unittest.cc b/ui/views/accessibility/tree/widget_ax_manager_unittest.cc
index 071950b0b..c7df7f5 100644
--- a/ui/views/accessibility/tree/widget_ax_manager_unittest.cc
+++ b/ui/views/accessibility/tree/widget_ax_manager_unittest.cc
@@ -32,6 +32,10 @@
     WidgetTest::TearDown();
   }
 
+  base::test::SingleThreadTaskEnvironment* task_env() {
+    return static_cast<base::test::SingleThreadTaskEnvironment*>(
+        task_environment());
+  }
   Widget* widget() { return widget_.get(); }
   WidgetAXManager* manager() { return widget_->ax_manager(); }
 
@@ -144,28 +148,10 @@
   widget.reset();
 }
 
-class WidgetAXManagerScheduleTest : public testing::Test {
- public:
-  void SetUp() override {
-    manager_ = std::make_unique<WidgetAXManager>(/*widget=*/nullptr);
-  }
-
-  base::test::SingleThreadTaskEnvironment& task_env() { return task_env_; }
-  WidgetAXManager* manager() { return manager_.get(); }
-
- private:
-  base::test::SingleThreadTaskEnvironment task_env_;
-  base::test::ScopedFeatureList scoped_feature_list_{
-      features::kAccessibilityTreeForViews};
-  std::unique_ptr<WidgetAXManager> manager_;
-};
-
-TEST_F(WidgetAXManagerScheduleTest, OnEvent_PostsSingleTaskAndQueuesCorrectly) {
+TEST_F(WidgetAXManagerTest, OnEvent_PostsSingleTaskAndQueuesCorrectly) {
   WidgetAXManagerTestApi api(manager());
   manager()->Enable();
 
-  // Nothing pending initially.
-  EXPECT_EQ(task_env().GetPendingMainThreadTaskCount(), 0u);
   EXPECT_TRUE(api.pending_events().empty());
   EXPECT_TRUE(api.pending_data_updates().empty());
   EXPECT_FALSE(api.processing_update_posted());
@@ -174,12 +160,13 @@
   auto v2 = ViewAccessibility::Create(nullptr);
 
   // Fire two events on v1, one on v2, before the first send.
+  auto before = task_env()->GetPendingMainThreadTaskCount();
   manager()->OnEvent(*v1, ax::mojom::Event::kFocus);
   manager()->OnEvent(*v1, ax::mojom::Event::kValueChanged);
   manager()->OnEvent(*v2, ax::mojom::Event::kBlur);
 
   // Still just one task posted.
-  EXPECT_EQ(task_env().GetPendingMainThreadTaskCount(), 1u);
+  EXPECT_EQ(task_env()->GetPendingMainThreadTaskCount(), before + 1u);
   EXPECT_TRUE(api.processing_update_posted());
 
   // pending_events has three entries, pending_data_updates has two unique IDs.
@@ -187,20 +174,16 @@
   EXPECT_EQ(api.pending_data_updates().size(), 2u);
 
   // After run, everything clears.
-  task_env().RunUntilIdle();
+  task_env()->RunUntilIdle();
   EXPECT_EQ(api.pending_events().size(), 0u);
   EXPECT_EQ(api.pending_data_updates().size(), 0u);
   EXPECT_FALSE(api.processing_update_posted());
-  EXPECT_EQ(task_env().GetPendingMainThreadTaskCount(), 0u);
 }
 
-TEST_F(WidgetAXManagerScheduleTest,
-       OnDataChanged_PostsSingleTaskAndQueuesCorrectly) {
+TEST_F(WidgetAXManagerTest, OnDataChanged_PostsSingleTaskAndQueuesCorrectly) {
   WidgetAXManagerTestApi api(manager());
   manager()->Enable();
 
-  // Nothing pending initially.
-  EXPECT_EQ(task_env().GetPendingMainThreadTaskCount(), 0u);
   EXPECT_TRUE(api.pending_events().empty());
   EXPECT_TRUE(api.pending_data_updates().empty());
   EXPECT_FALSE(api.processing_update_posted());
@@ -209,28 +192,29 @@
   auto v2 = ViewAccessibility::Create(nullptr);
 
   // Data-changes for both views.
+  auto before = task_env()->GetPendingMainThreadTaskCount();
   manager()->OnDataChanged(*v1);
   manager()->OnDataChanged(*v2);
 
   // One task scheduled, two unique IDs in pending_data_updates.
-  EXPECT_EQ(task_env().GetPendingMainThreadTaskCount(), 1u);
+  EXPECT_EQ(task_env()->GetPendingMainThreadTaskCount(), before + 1u);
   EXPECT_TRUE(api.processing_update_posted());
   EXPECT_EQ(api.pending_events().size(), 0u);
   EXPECT_EQ(api.pending_data_updates().size(), 2u);
 
   // Duplicate data-change for v1 should not grow the set.
+  before = task_env()->GetPendingMainThreadTaskCount();
   manager()->OnDataChanged(*v1);
   EXPECT_EQ(api.pending_data_updates().size(), 2u);
-  EXPECT_EQ(task_env().GetPendingMainThreadTaskCount(), 1u);
+  EXPECT_EQ(task_env()->GetPendingMainThreadTaskCount(), before);
 
   // After run, clear everything.
-  task_env().RunUntilIdle();
+  task_env()->RunUntilIdle();
   EXPECT_EQ(api.pending_data_updates().size(), 0u);
   EXPECT_FALSE(api.processing_update_posted());
-  EXPECT_EQ(task_env().GetPendingMainThreadTaskCount(), 0u);
 }
 
-TEST_F(WidgetAXManagerScheduleTest, OnEvent_CanScheduleAgainAfterSend) {
+TEST_F(WidgetAXManagerTest, OnEvent_CanScheduleAgainAfterSend) {
   WidgetAXManagerTestApi api(manager());
   manager()->Enable();
 
@@ -238,20 +222,21 @@
 
   // First batch.
   manager()->OnEvent(*v, ax::mojom::Event::kFocus);
-  task_env().RunUntilIdle();
+  task_env()->RunUntilIdle();
   EXPECT_FALSE(api.processing_update_posted());
   EXPECT_TRUE(api.pending_events().empty());
   EXPECT_TRUE(api.pending_data_updates().empty());
 
   // Second batch.
+  auto before = task_env()->GetPendingMainThreadTaskCount();
   manager()->OnEvent(*v, ax::mojom::Event::kBlur);
-  EXPECT_EQ(task_env().GetPendingMainThreadTaskCount(), 1u);
+  EXPECT_EQ(task_env()->GetPendingMainThreadTaskCount(), before + 1u);
   EXPECT_TRUE(api.processing_update_posted());
   EXPECT_EQ(api.pending_events().size(), 1u);
   EXPECT_EQ(api.pending_data_updates().size(), 1u);
 }
 
-TEST_F(WidgetAXManagerScheduleTest, OnDataChanged_CanScheduleAgainAfterSend) {
+TEST_F(WidgetAXManagerTest, OnDataChanged_CanScheduleAgainAfterSend) {
   WidgetAXManagerTestApi api(manager());
   manager()->Enable();
 
@@ -259,35 +244,37 @@
 
   // First batch.
   manager()->OnDataChanged(*v);
-  task_env().RunUntilIdle();
+  task_env()->RunUntilIdle();
   EXPECT_FALSE(api.processing_update_posted());
   EXPECT_TRUE(api.pending_events().empty());
   EXPECT_TRUE(api.pending_data_updates().empty());
 
   // Second batch.
+  auto before = task_env()->GetPendingMainThreadTaskCount();
   manager()->OnDataChanged(*v);
-  EXPECT_EQ(task_env().GetPendingMainThreadTaskCount(), 1u);
+  EXPECT_EQ(task_env()->GetPendingMainThreadTaskCount(), before + 1u);
   EXPECT_TRUE(api.processing_update_posted());
   EXPECT_EQ(api.pending_events().size(), 0u);
   EXPECT_EQ(api.pending_data_updates().size(), 1u);
 }
 
-TEST_F(WidgetAXManagerScheduleTest, UpdatesIgnoredWhenDisabled) {
+TEST_F(WidgetAXManagerTest, UpdatesIgnoredWhenDisabled) {
   WidgetAXManagerTestApi api(manager());
 
   // Manager is disabled by default.
   auto v = ViewAccessibility::Create(nullptr);
 
+  auto before = task_env()->GetPendingMainThreadTaskCount();
   manager()->OnEvent(*v, ax::mojom::Event::kFocus);
   EXPECT_FALSE(api.processing_update_posted());
   EXPECT_TRUE(api.pending_events().empty());
   EXPECT_TRUE(api.pending_data_updates().empty());
-  EXPECT_EQ(task_env().GetPendingMainThreadTaskCount(), 0u);
+  EXPECT_EQ(task_env()->GetPendingMainThreadTaskCount(), before);
 
   manager()->OnDataChanged(*v);
   EXPECT_FALSE(api.processing_update_posted());
   EXPECT_TRUE(api.pending_data_updates().empty());
-  EXPECT_EQ(task_env().GetPendingMainThreadTaskCount(), 0u);
+  EXPECT_EQ(task_env()->GetPendingMainThreadTaskCount(), before);
 }
 
 }  // namespace views::test
diff --git a/ui/views/accessibility/view_accessibility_utils.cc b/ui/views/accessibility/view_accessibility_utils.cc
index ba4ddb55..752f616 100644
--- a/ui/views/accessibility/view_accessibility_utils.cc
+++ b/ui/views/accessibility/view_accessibility_utils.cc
@@ -7,8 +7,6 @@
 #include <algorithm>
 #include <set>
 #include <string>
-#include <utility>
-#include <vector>
 
 #include "base/memory/raw_ptr.h"
 #include "ui/accessibility/ax_enum_util.h"
@@ -68,19 +66,8 @@
     }
   }
 
-  if (auto source_bool_vector =
-          std::get_if<std::vector<std::pair<ax::mojom::BoolAttribute, bool>>>(
-              &source.bool_attributes)) {
-    for (const auto& attr : *source_bool_vector) {
-      destination.AddBoolAttribute(attr.first, attr.second);
-    }
-
-  } else if (auto source_bool_bitset =
-                 std::get_if<ui::AXBitset<ax::mojom::BoolAttribute>>(
-                     &source.bool_attributes)) {
-    std::get<ui::AXBitset<ax::mojom::BoolAttribute>>(
-        destination.bool_attributes)
-        .Append(*source_bool_bitset);
+  for (const auto& attr : source.bool_attributes) {
+    destination.AddBoolAttribute(attr.first, attr.second);
   }
 
   for (const auto& attr : source.intlist_attributes) {
@@ -131,22 +118,9 @@
         << attributeErrorMessage(std::string(ui::ToString(attr.first)));
   }
 
-  if (auto new_bool_vector =
-          std::get_if<std::vector<std::pair<ax::mojom::BoolAttribute, bool>>>(
-              &new_data.bool_attributes)) {
-    for (const auto& attr : *new_bool_vector) {
-      DCHECK(!existing_data.HasBoolAttribute(attr.first))
-          << attributeErrorMessage(std::string(ui::ToString(attr.first)));
-    }
-  } else if (auto new_bool_bitset =
-                 std::get_if<ui::AXBitset<ax::mojom::BoolAttribute>>(
-                     &new_data.bool_attributes)) {
-    (*new_bool_bitset)
-        .ForEach([&existing_data, &attributeErrorMessage](
-                     ax::mojom::BoolAttribute attr, bool value) {
-          DCHECK(!existing_data.HasBoolAttribute(attr))
-              << attributeErrorMessage(std::string(ui::ToString(attr)));
-        });
+  for (const auto& attr : new_data.bool_attributes) {
+    DCHECK(!existing_data.HasBoolAttribute(attr.first))
+        << attributeErrorMessage(std::string(ui::ToString(attr.first)));
   }
 
   for (const auto& attr : new_data.float_attributes) {
diff --git a/ui/views/animation/animation_builder_unittest.cc b/ui/views/animation/animation_builder_unittest.cc
index 2dff650..71991140 100644
--- a/ui/views/animation/animation_builder_unittest.cc
+++ b/ui/views/animation/animation_builder_unittest.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "base/functional/bind.h"
+#include "base/functional/callback_helpers.h"
 #include "base/test/gtest_util.h"
 #include "base/time/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/ui/views/animation/ink_drop_event_handler.cc b/ui/views/animation/ink_drop_event_handler.cc
index c447874..f0ff092 100644
--- a/ui/views/animation/ink_drop_event_handler.cc
+++ b/ui/views/animation/ink_drop_event_handler.cc
@@ -136,14 +136,12 @@
 }
 
 void InkDropEventHandler::OnViewVisibilityChanged(View* observed_view,
-                                                  View* starting_view,
-                                                  bool visible) {
+                                                  View* starting_view) {
   DCHECK_EQ(host_view_, observed_view);
   // A View is *actually* visible if its visible flag is set, all its ancestors'
   // visible flags are set, it's in a Widget, and the Widget is
   // visible. |View::IsDrawn()| captures the first two conditions.
-  const bool is_visible = visible && host_view_->IsDrawn() &&
-                          host_view_->GetWidget() &&
+  const bool is_visible = host_view_->IsDrawn() && host_view_->GetWidget() &&
                           host_view_->GetWidget()->IsVisible();
   if (!is_visible && delegate_->HasInkDrop()) {
     delegate_->GetInkDrop()->AnimateToState(InkDropState::HIDDEN);
diff --git a/ui/views/animation/ink_drop_event_handler.h b/ui/views/animation/ink_drop_event_handler.h
index 1a9f28b..60658326 100644
--- a/ui/views/animation/ink_drop_event_handler.h
+++ b/ui/views/animation/ink_drop_event_handler.h
@@ -60,8 +60,7 @@
 
   // ViewObserver:
   void OnViewVisibilityChanged(View* observed_view,
-                               View* starting_view,
-                               bool visible) override;
+                               View* starting_view) override;
   void OnViewHierarchyChanged(
       View* observed_view,
       const ViewHierarchyChangedDetails& details) override;
diff --git a/ui/views/animation/widget_fade_animator.cc b/ui/views/animation/widget_fade_animator.cc
index 0f548d4..66a9c144 100644
--- a/ui/views/animation/widget_fade_animator.cc
+++ b/ui/views/animation/widget_fade_animator.cc
@@ -28,7 +28,18 @@
 
   // Widgets cannot be shown when visible and fully transparent.
   widget_->SetOpacity(0.01f);
-  widget_->Show();
+
+  switch (show_type_) {
+    case WidgetShowType::kNone:
+      break;
+    case WidgetShowType::kShowActive:
+      widget_->Show();
+      break;
+    case WidgetShowType::kShowInactive:
+      widget_->ShowInactive();
+      break;
+  }
+
   fade_animation_.Start();
 }
 
diff --git a/ui/views/animation/widget_fade_animator.h b/ui/views/animation/widget_fade_animator.h
index c7da546..85d6ef4 100644
--- a/ui/views/animation/widget_fade_animator.h
+++ b/ui/views/animation/widget_fade_animator.h
@@ -34,6 +34,13 @@
     kFadeOut,
   };
 
+  // Controls the window show type.
+  enum class WidgetShowType {
+    kNone,
+    kShowActive,
+    kShowInactive,
+  };
+
   // Defines a callback for when a fade completes. Not called on cancel. The
   // |animation_type| of the completed animation is specified (it will never be
   // kNone).
@@ -65,6 +72,9 @@
   void set_close_on_hide(bool close_on_hide) { close_on_hide_ = close_on_hide; }
   bool close_on_hide() const { return close_on_hide_; }
 
+  void set_show_type(WidgetShowType show_type) { show_type_ = show_type; }
+  WidgetShowType show_type() const { return show_type_; }
+
   Widget* widget() { return widget_; }
 
   bool IsFadingIn() const { return animation_type_ == FadeType::kFadeIn; }
@@ -122,6 +132,10 @@
   // Whether the widget should be closed at the end of a fade-out animation.
   bool close_on_hide_ = false;
 
+  // Controls the window show type. Specifically whether to show the window as
+  // active/inactive, or not show it at all.
+  WidgetShowType show_type_ = WidgetShowType::kShowActive;
+
   base::RepeatingCallbackList<FadeCompleteCallbackSignature>
       fade_complete_callbacks_;
 };
diff --git a/ui/views/animation/widget_fade_animator_unittest.cc b/ui/views/animation/widget_fade_animator_unittest.cc
index dcac141..0c8992f 100644
--- a/ui/views/animation/widget_fade_animator_unittest.cc
+++ b/ui/views/animation/widget_fade_animator_unittest.cc
@@ -274,4 +274,32 @@
   EXPECT_EQ(WidgetFadeAnimator::FadeType::kFadeOut, anim_type);
 }
 
+TEST_F(WidgetFadeAnimatorTest, FadeInDefaultIsShowActive) {
+  EXPECT_FALSE(widget_->IsVisible());
+  delegate_->FadeIn();
+
+  // Widget should be shown and active.
+  EXPECT_TRUE(widget_->IsVisible());
+  EXPECT_TRUE(widget_->IsActive());
+}
+
+TEST_F(WidgetFadeAnimatorTest, FadeInShowTypeShowInactive) {
+  EXPECT_FALSE(widget_->IsVisible());
+  delegate_->set_show_type(WidgetFadeAnimator::WidgetShowType::kShowInactive);
+  delegate_->FadeIn();
+
+  // Widget should be shown and inactive.
+  EXPECT_TRUE(widget_->IsVisible());
+  EXPECT_FALSE(widget_->IsActive());
+}
+
+TEST_F(WidgetFadeAnimatorTest, FadeInShowTypeNone) {
+  EXPECT_FALSE(widget_->IsVisible());
+  delegate_->set_show_type(WidgetFadeAnimator::WidgetShowType::kNone);
+  delegate_->FadeIn();
+
+  // Widget should not be shown.
+  EXPECT_FALSE(widget_->IsVisible());
+}
+
 }  // namespace views
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.cc b/ui/views/bubble/bubble_dialog_delegate_view.cc
index 44a8f19..addcfd0 100644
--- a/ui/views/bubble/bubble_dialog_delegate_view.cc
+++ b/ui/views/bubble/bubble_dialog_delegate_view.cc
@@ -175,7 +175,7 @@
   bubble_params.opacity = Widget::InitParams::WindowOpacity::kTranslucent;
   bubble_params.accept_events = bubble->accept_events();
   bubble_params.remove_standard_frame = true;
-  bubble_params.layer_type = bubble->GetLayerType();
+  bubble_params.layer_type = bubble->layer_type();
   // TODO(crbug.com/41493925): Remove CHECK once native frame dialogs support
   // autosize.
   CHECK(!bubble->is_autosized() || bubble->use_custom_frame())
@@ -588,7 +588,7 @@
   // rounded corner clip we must paint the client view to a layer. This is
   // necessary because layers do not respect the clip of a non-layer backed
   // parent.
-  client_view_->SetPaintToLayer();
+  client_view_->SetPaintToLayer(layer_type());
   client_view_->layer()->SetRoundedCornerRadius(
       gfx::RoundedCornersF(GetCornerRadius()));
   client_view_->layer()->SetIsFastRoundedCorner(true);
@@ -784,10 +784,6 @@
   return anchor_rect_.value();
 }
 
-ui::LayerType BubbleDialogDelegate::GetLayerType() const {
-  return ui::LAYER_TEXTURED;
-}
-
 void BubbleDialogDelegate::UseCompactMargins() {
   set_margins(gfx::Insets(6));
 }
@@ -1131,14 +1127,15 @@
     frame_view->SetBackgroundColor(background_color());
   }
 
-  // When there's an opaque layer, the bubble border background won't show
-  // through, so explicitly paint a background color.
   const bool contents_layer_opaque =
-      contents_view->layer() && contents_view->layer()->fills_bounds_opaquely();
-  contents_view->SetBackground(contents_layer_opaque ||
-                                       force_create_contents_background_
-                                   ? CreateSolidBackground(background_color())
-                                   : nullptr);
+      contents_view->layer() &&
+      contents_view->layer()->type() != ui::LAYER_NOT_DRAWN &&
+      contents_view->layer()->fills_bounds_opaquely();
+  if (contents_layer_opaque) {
+    CHECK(contents_view->background())
+        << "If contents paint to an opaque layer, the bubble border background "
+           "won't show through, so explicitly paint a background color";
+  }
 }
 
 void BubbleDialogDelegate::OnBubbleWidgetVisibilityChanged(bool visible) {
diff --git a/ui/views/bubble/bubble_dialog_delegate_view.h b/ui/views/bubble/bubble_dialog_delegate_view.h
index d0fab9ae..d542903 100644
--- a/ui/views/bubble/bubble_dialog_delegate_view.h
+++ b/ui/views/bubble/bubble_dialog_delegate_view.h
@@ -12,6 +12,7 @@
 #include <unordered_set>
 #include <utility>
 
+#include "base/check.h"
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/raw_span.h"
@@ -25,6 +26,8 @@
 #include "ui/base/mojom/dialog_button.mojom.h"
 #include "ui/base/mojom/ui_base_types.mojom-shared.h"
 #include "ui/color/color_variant.h"
+#include "ui/compositor/layer.h"
+#include "ui/compositor/layer_type.h"
 #include "ui/views/bubble/bubble_border.h"
 #include "ui/views/bubble/bubble_frame_view.h"
 #include "ui/views/metadata/view_factory.h"
@@ -450,11 +453,6 @@
   ui::ColorVariant background_color() const { return color_; }
   void SetBackgroundColor(ui::ColorVariant color);
 
-  void set_force_create_contents_background(
-      bool force_create_contents_background) {
-    force_create_contents_background_ = force_create_contents_background;
-  }
-
   void set_title_margins(const gfx::Insets& title_margins) {
     title_margins_ = title_margins;
   }
@@ -467,8 +465,13 @@
   // Sets the content margins to a default picked for smaller bubbles.
   void UseCompactMargins();
 
-  // Override to configure the layer type of the bubble widget.
-  virtual ui::LayerType GetLayerType() const;
+  // Set/Get the layer type of the bubble widget and client view.
+  ui::LayerType layer_type() const { return layer_type_; }
+  void set_layer_type(ui::LayerType layer_type) {
+    CHECK(layer_type == ui::LAYER_TEXTURED ||
+          layer_type == ui::LAYER_NOT_DRAWN);
+    layer_type_ = layer_type;
+  }
 
   // Override to provide custom parameters before widget initialization.
   virtual void OnBeforeBubbleWidgetInit(Widget::InitParams* params,
@@ -633,6 +636,7 @@
   ui::ImageModel main_image_;
   std::u16string subtitle_;
   bool subtitle_allow_character_break_ = false;
+  ui::LayerType layer_type_ = ui::LayerType::LAYER_TEXTURED;
 
   // Whether the bubble should automatically resize to match its contents'
   // preferred size.
@@ -657,10 +661,6 @@
   // Pointer to this bubble's ClientView.
   raw_ptr<ClientView> client_view_ = nullptr;
 
-  // If true, contents view will be forced to create a solid color background in
-  // `UpdateFrameColor()`.
-  bool force_create_contents_background_ = false;
-
 #if BUILDFLAG(IS_MAC)
   // Special handler for close_on_deactivate() on Mac. Window (de)activation is
   // suppressed by the WindowServer when clicking rapidly, so the bubble must
diff --git a/ui/views/interaction/element_tracker_views.cc b/ui/views/interaction/element_tracker_views.cc
index 41fc896..bce2f51 100644
--- a/ui/views/interaction/element_tracker_views.cc
+++ b/ui/views/interaction/element_tracker_views.cc
@@ -160,11 +160,8 @@
 
   // ViewObserver:
   void OnViewVisibilityChanged(View* observed_view,
-                               View* starting_view,
-                               bool visible) override {
-    // TODO(https://crbug.com/426560497): change this logic now that
-    // `OnViewVisibilityChanged()` specifies intended visibility.
-    UpdateVisible(observed_view, starting_view
+                               View* starting_view) override {
+    UpdateVisible(observed_view, starting_view->parent()
                                      ? UpdateReason::kGeneral
                                      : UpdateReason::kVisibilityFromRoot);
   }
diff --git a/ui/views/view.cc b/ui/views/view.cc
index b4bc17a..6d349bb1 100644
--- a/ui/views/view.cc
+++ b/ui/views/view.cc
@@ -3230,8 +3230,8 @@
 
 void View::VisibilityChangedImpl(View* starting_from, bool is_visible) {
   VisibilityChanged(starting_from, is_visible);
-  observers_.Notify(&ViewObserver::OnViewVisibilityChanged, this, starting_from,
-                    is_visible);
+  observers_.Notify(&ViewObserver::OnViewVisibilityChanged, this,
+                    starting_from);
 }
 
 void View::SnapLayerToPixelBoundary(const LayerOffsetData& offset_data) {
diff --git a/ui/views/view.h b/ui/views/view.h
index 23232b1..2897bc38 100644
--- a/ui/views/view.h
+++ b/ui/views/view.h
@@ -1838,10 +1838,6 @@
 
   // When SetVisible() changes the visibility of a view, this method is
   // invoked for that view as well as all the children recursively.
-  //
-  // If `starting_from` is null, this call is the result of the widget being
-  // shown or hidden. (Note that `Widget::IsVisible()` updates asynchronously
-  // and may not agree with `is_visible`.)
   virtual void VisibilityChanged(View* starting_from, bool is_visible);
 
   // This method is invoked when the view will soon no longer have a focus
diff --git a/ui/views/view_observer.h b/ui/views/view_observer.h
index a14dc2b..4e3edce 100644
--- a/ui/views/view_observer.h
+++ b/ui/views/view_observer.h
@@ -24,18 +24,11 @@
   // Called when |child| is removed as a child of |observed_view|.
   virtual void OnChildViewRemoved(View* observed_view, View* child) {}
 
-  // Called when `observed_view`, an ancestor, or its Widget has its
-  // visibility changed.
-  //
-  // The `starting_view` parameter is the View on which `SetVisible()` was
-  // actually called, or null if the Widget was shown or hidden.
-  //
-  // Note that when a widget is shown or hidden, `Widget::IsVisible()` may not
-  // update right away and may therefore disagree with the value of `visible`;
-  // in these cases `visible` is the intended Widget visibility.
+  // Called when |observed_view|, an ancestor, or its Widget has its visibility
+  // changed. |starting_view| is who |View::SetVisible()| was called on (or null
+  // if the Widget visibility changed).
   virtual void OnViewVisibilityChanged(View* observed_view,
-                                       View* starting_view,
-                                       bool visible) {}
+                                       View* starting_view) {}
 
   // Called from View::PreferredSizeChanged().
   virtual void OnViewPreferredSizeChanged(View* observed_view) {}
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc
index c6fdbfb..59debb3 100644
--- a/ui/views/view_unittest.cc
+++ b/ui/views/view_unittest.cc
@@ -9,7 +9,6 @@
 #include <algorithm>
 #include <map>
 #include <memory>
-#include <optional>
 #include <set>
 
 #include "base/command_line.h"
@@ -6971,12 +6970,9 @@
     child_view_removed_parent_ = parent;
   }
 
-  void OnViewVisibilityChanged(View* view,
-                               View* starting_view,
-                               bool visible) override {
+  void OnViewVisibilityChanged(View* view, View* starting_view) override {
     view_visibility_changed_ = view;
     view_visibility_changed_starting_ = starting_view;
-    last_view_visibility_ = visible;
   }
 
   void OnViewBoundsChanged(View* view) override { view_bounds_changed_ = view; }
@@ -7023,9 +7019,6 @@
   const View* view_visibility_changed_starting() const {
     return view_visibility_changed_starting_;
   }
-  std::optional<bool> last_view_visibility() const {
-    return last_view_visibility_;
-  }
   const View* view_bounds_changed() const { return view_bounds_changed_; }
   const View* view_reordered() const { return view_reordered_; }
 
@@ -7043,7 +7036,6 @@
   raw_ptr<View> child_view_removed_parent_ = nullptr;
   raw_ptr<View> view_visibility_changed_ = nullptr;
   raw_ptr<View> view_visibility_changed_starting_ = nullptr;
-  std::optional<bool> last_view_visibility_;
   raw_ptr<View> view_bounds_changed_ = nullptr;
   raw_ptr<View> view_reordered_ = nullptr;
 };
@@ -7120,7 +7112,6 @@
     weak_child->SetVisible(false);
     EXPECT_EQ(weak_child, observer.view_visibility_changed());
     EXPECT_EQ(weak_child, observer.view_visibility_changed_starting());
-    EXPECT_EQ(false, observer.last_view_visibility());
   }
 
   // Ditto for setting it visible.
@@ -7129,7 +7120,6 @@
     weak_child->SetVisible(true);
     EXPECT_EQ(weak_child, observer.view_visibility_changed());
     EXPECT_EQ(weak_child, observer.view_visibility_changed_starting());
-    EXPECT_EQ(true, observer.last_view_visibility());
   }
 
   // Ensure setting |parent| not visible also calls the
@@ -7139,7 +7129,6 @@
     parent->SetVisible(false);
     EXPECT_EQ(weak_child, observer.view_visibility_changed());
     EXPECT_EQ(parent.get(), observer.view_visibility_changed_starting());
-    EXPECT_EQ(false, observer.last_view_visibility());
   }
 }
 
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index 45bb7454..31f18dc 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -1905,7 +1905,7 @@
 void Widget::OnNativeWidgetVisibilityChanged(bool visible) {
   View* root = GetRootView();
   if (root) {
-    root->PropagateVisibilityNotifications(nullptr, visible);
+    root->PropagateVisibilityNotifications(root, visible);
   }
   observers_.Notify(&WidgetObserver::OnWidgetVisibilityChanged, this, visible);
   if (GetCompositor() && root && root->layer()) {