diff --git a/DEPS b/DEPS
index 87b0596..f053a4bc 100644
--- a/DEPS
+++ b/DEPS
@@ -221,7 +221,7 @@
   # 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': '8abb778cb338b88d0036379acf49acdc1a9f6e70',
+  'angle_revision': '904ac34039cf1e5f8cb1f340ad41a2ee0015f634',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -280,7 +280,7 @@
   # 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': '0cfa2c068604d31cc110728dde632ddaeeabfa97',
+  'catapult_revision': 'ca2c40743faf25ae3fdac8ba1813c33473a254ee',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -288,7 +288,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '8e642e00e8bf5d79ce4bb50967dfcfe6098b27db',
+  'devtools_frontend_revision': '417940939a7a17e0c2a6f879cae426e06bd20cc1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -328,11 +328,11 @@
   # 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': '045a02adc0c6b2d6b406507bc58131644b41dc0c',
+  'dawn_revision': '12c6305674d1e1c91320c0660c6d0f6c328e03c8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'quiche_revision': 'bef266f60b0ea199960d6d4983a0d63ee06aa30f',
+  'quiche_revision': '59de4b0760cce3b052924470c4da2ee784555483',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -946,7 +946,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' + '@' + '7787fc923b6a426431b6bf8465448255135e04e8',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '0ebeb0bbba816727d9d1c104dfdaad1498e04596',
       'condition': 'checkout_chromeos',
   },
 
@@ -966,7 +966,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'c91f5f62e284fa45ab7da18e91d3eedd96a38459',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '0e6b37448ddf1eaaf93db1d2cb2b0198d7b79188',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -1338,7 +1338,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '7dadfe6bd3985045d21280ebbc9ba336df6dedd9',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '36d5d47a5168725d3a4fbef751f44212f6f4cb5f',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1613,7 +1613,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@e26f1c188c76368b7169e110d0cbb86f7876bda9',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@93ae6ed257ec929ba5ed7f3014099c58244a16ce',
     'condition': 'checkout_src_internal',
   },
 
@@ -1632,7 +1632,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'U8FvFN0i9074Z-3onM3FldpTloQ08QiZ-6TDmy6Ayb4C',
+        'version': 'guDtOxCcCWk0mOQG5WjKF6zBwJGPvT2ks3pw-06sGSMC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1643,7 +1643,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'Pe_jX_7WvKIfSkmVqfg8fKGTovOhrGycxXrRQN9d08oC',
+        'version': '4jMTXapOwjspzJpdZ4oHRPsnAOhC2WukJWizXb-H-ZcC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/browser/aw_feature_list.cc b/android_webview/browser/aw_feature_list.cc
index ee4d137..100bb62 100644
--- a/android_webview/browser/aw_feature_list.cc
+++ b/android_webview/browser/aw_feature_list.cc
@@ -8,9 +8,7 @@
 #include "android_webview/common/aw_features.h"
 #include "base/android/jni_string.h"
 #include "base/feature_list.h"
-#include "base/macros.h"
 #include "base/notreached.h"
-#include "base/stl_util.h"
 #include "components/safe_browsing/core/features.h"
 
 using base::android::ConvertJavaStringToUTF8;
@@ -23,7 +21,7 @@
 // Array of features exposed through the Java AwFeatureList API. Entries in
 // this array may either refer to features defined in the header of this file or
 // in other locations in the code base (e.g. content/, components/, etc).
-const base::Feature* kFeaturesExposedToJava[] = {
+const base::Feature* const kFeaturesExposedToJava[] = {
     &features::kWebViewConnectionlessSafeBrowsing,
     &features::kWebViewDisplayCutout,
     &features::kWebViewMixedContentAutoupgrades,
@@ -33,9 +31,9 @@
 };
 
 const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
-  for (size_t i = 0; i < base::size(kFeaturesExposedToJava); ++i) {
-    if (kFeaturesExposedToJava[i]->name == feature_name)
-      return kFeaturesExposedToJava[i];
+  for (const base::Feature* feature : kFeaturesExposedToJava) {
+    if (feature->name == feature_name)
+      return feature;
   }
   NOTREACHED() << "Queried feature cannot be found in AwFeatureList: "
                << feature_name;
diff --git a/android_webview/expectations/system_webview_bundle.AndroidManifest.expected b/android_webview/expectations/system_webview_bundle.AndroidManifest.expected
index 44fe36b..6466512 100644
--- a/android_webview/expectations/system_webview_bundle.AndroidManifest.expected
+++ b/android_webview/expectations/system_webview_bundle.AndroidManifest.expected
@@ -1,12 +1,12 @@
 <?xml version="1.0" ?>
 <manifest
-    android:isolatedSplits="true"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="com.android.webview"
     platformBuildVersionCode="30"
     platformBuildVersionName="11"
-    tools:ignore="MissingLeanbackLauncher"
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
+    android:isolatedSplits="true"
+    tools:ignore="MissingLeanbackLauncher">
   <queries>  # DIFF-ANCHOR: 0c3a615d
     <intent>  # DIFF-ANCHOR: 28c960ba
       <action android:name="android.media.browse.MediaBrowserService"/>
@@ -19,23 +19,23 @@
   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30"/>
   <application
+      android:name="org.chromium.android_webview.nonembedded.WebViewApkApplication"
       android:extractNativeLibs="True"
       android:icon="@$PACKAGE:drawable/icon_webview"
       android:label="Android System WebView"
       android:multiArch="true"
-      android:name="org.chromium.android_webview.nonembedded.WebViewApkApplication"
       android:use32bitAbi="true">
     <activity  # DIFF-ANCHOR: ea1a94af
-        android:exported="false"
         android:name="com.google.android.gms.common.api.GoogleApiActivity"
+        android:exported="false"
         android:theme="@android:style/Theme.Translucent.NoTitleBar">
     </activity>  # DIFF-ANCHOR: ea1a94af
     <activity  # DIFF-ANCHOR: a4438884
+        android:name="org.chromium.android_webview.devui.MainActivity"
         android:exported="true"
         android:icon="@drawable/icon_webview"
         android:label="WebView DevTools"
         android:launchMode="singleTask"
-        android:name="org.chromium.android_webview.devui.MainActivity"
         android:process=":webview_apk"
         android:taskAffinity="$PACKAGE.org.chromium.android_webview.devui"
         android:theme="@style/Theme.DevUi.DayNight"
@@ -47,9 +47,9 @@
       </intent-filter>  # DIFF-ANCHOR: b80aa336
     </activity>  # DIFF-ANCHOR: a4438884
     <activity  # DIFF-ANCHOR: aeabab17
+        android:name="org.chromium.android_webview.nonembedded.LicenseActivity"
         android:exported="true"
         android:label="@string/license_activity_title"
-        android:name="org.chromium.android_webview.nonembedded.LicenseActivity"
         android:process=":webview_apk">
       <intent-filter>  # DIFF-ANCHOR: 23298d3b
         <action android:name="android.settings.WEBVIEW_LICENSE"/>
@@ -58,8 +58,8 @@
       <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED" android:value="true"/>
     </activity>  # DIFF-ANCHOR: aeabab17
     <activity-alias  # DIFF-ANCHOR: b7cc06e9
-        android:enabled="false"
         android:name="org.chromium.android_webview.devui.DeveloperModeState"
+        android:enabled="false"
         android:process=":webview_apk"
         android:targetActivity="org.chromium.android_webview.devui.MainActivity"
         android:visibleToInstantApps="true">
@@ -69,439 +69,439 @@
     <meta-data android:name="org.chromium.content.browser.NUM_PRIVILEGED_SERVICES" android:value="0"/>
     <meta-data android:name="org.chromium.content.browser.NUM_SANDBOXED_SERVICES" android:value="40"/>
     <provider  # DIFF-ANCHOR: a5e78e63
+        android:name="org.chromium.android_webview.nonembedded.LicenseContentProvider"
         android:authorities="$PACKAGE.LicenseContentProvider"
         android:exported="true"
         android:grantUriPermissions="true"
-        android:name="org.chromium.android_webview.nonembedded.LicenseContentProvider"
         android:process=":webview_apk"
         tools:ignore="ExportedContentProvider">
     </provider>  # DIFF-ANCHOR: a5e78e63
     <provider  # DIFF-ANCHOR: bfe37944
+        android:name="org.chromium.android_webview.services.DeveloperModeContentProvider"
         android:authorities="$PACKAGE.DeveloperModeContentProvider"
         android:exported="true"
-        android:name="org.chromium.android_webview.services.DeveloperModeContentProvider"
         android:process=":webview_service"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedContentProvider">
     </provider>  # DIFF-ANCHOR: bfe37944
-    <receiver  # DIFF-ANCHOR: 1091f66b
-        android:exported="false"
-        android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver">
-    </receiver>  # DIFF-ANCHOR: 1091f66b
-    <service  # DIFF-ANCHOR: 41539e3c
-        android:exported="false"
-        android:name="com.google.android.gms.cast.framework.ReconnectionService">
-    </service>  # DIFF-ANCHOR: 41539e3c
-    <service  # DIFF-ANCHOR: 7dad1ec5
-        android:exported="false"
-        android:name="com.google.android.gms.cast.framework.media.MediaNotificationService">
-    </service>  # DIFF-ANCHOR: 7dad1ec5
+    <receiver  # DIFF-ANCHOR: 0a6f8fa5
+        android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 0a6f8fa5
+    <service  # DIFF-ANCHOR: 749391ed
+        android:name="com.google.android.gms.cast.framework.ReconnectionService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 749391ed
+    <service  # DIFF-ANCHOR: 48ce9d28
+        android:name="com.google.android.gms.cast.framework.media.MediaNotificationService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 48ce9d28
     <service  # DIFF-ANCHOR: b9ec52c4
-        android:exported="false"
         android:name="org.chromium.android_webview.nonembedded.AwComponentUpdateService"
+        android:exported="false"
         android:permission="android.permission.BIND_JOB_SERVICE"
         android:process=":webview_apk">
     </service>  # DIFF-ANCHOR: b9ec52c4
     <service  # DIFF-ANCHOR: 3cd6d713
-        android:exported="true"
         android:name="org.chromium.android_webview.services.AwMinidumpUploadJobService"
+        android:exported="true"
         android:permission="android.permission.BIND_JOB_SERVICE"
         android:process=":webview_service">
     </service>  # DIFF-ANCHOR: 3cd6d713
     <service  # DIFF-ANCHOR: 65cddb26
-        android:exported="false"
         android:name="org.chromium.android_webview.services.AwVariationsSeedFetcher"
+        android:exported="false"
         android:permission="android.permission.BIND_JOB_SERVICE"
         android:process=":webview_service">
     </service>  # DIFF-ANCHOR: 65cddb26
     <service  # DIFF-ANCHOR: c756cf8d
-        android:exported="true"
         android:name="org.chromium.android_webview.services.ComponentsProviderService"
+        android:exported="true"
         android:process=":webview_service"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: c756cf8d
     <service  # DIFF-ANCHOR: 5cda9608
-        android:exported="true"
         android:name="org.chromium.android_webview.services.CrashReceiverService"
+        android:exported="true"
         android:process=":webview_service"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 5cda9608
     <service  # DIFF-ANCHOR: adce9ea1
-        android:exported="true"
         android:name="org.chromium.android_webview.services.DeveloperUiService"
+        android:exported="true"
         android:process=":webview_service"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: adce9ea1
     <service  # DIFF-ANCHOR: eecf2fee
-        android:exported="true"
         android:name="org.chromium.android_webview.services.MetricsBridgeService"
+        android:exported="true"
         android:process=":webview_service"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: eecf2fee
     <service  # DIFF-ANCHOR: dc926e35
-        android:exported="true"
         android:name="org.chromium.android_webview.services.VariationsSeedServer"
+        android:exported="true"
         android:process=":webview_service"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: dc926e35
     <service  # DIFF-ANCHOR: b1e3e8bd
+        android:name="org.chromium.content.app.SandboxedProcessService0"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService0"
         android:process=":sandboxed_process0"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: b1e3e8bd
     <service  # DIFF-ANCHOR: 76d1ccf8
+        android:name="org.chromium.content.app.SandboxedProcessService1"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService1"
         android:process=":sandboxed_process1"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 76d1ccf8
     <service  # DIFF-ANCHOR: 38b95266
+        android:name="org.chromium.content.app.SandboxedProcessService10"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService10"
         android:process=":sandboxed_process10"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 38b95266
     <service  # DIFF-ANCHOR: e4a2e4a2
+        android:name="org.chromium.content.app.SandboxedProcessService11"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService11"
         android:process=":sandboxed_process11"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: e4a2e4a2
     <service  # DIFF-ANCHOR: d9b2ffba
+        android:name="org.chromium.content.app.SandboxedProcessService12"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService12"
         android:process=":sandboxed_process12"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: d9b2ffba
     <service  # DIFF-ANCHOR: b41bb17d
+        android:name="org.chromium.content.app.SandboxedProcessService13"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService13"
         android:process=":sandboxed_process13"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: b41bb17d
     <service  # DIFF-ANCHOR: aec0ea21
+        android:name="org.chromium.content.app.SandboxedProcessService14"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService14"
         android:process=":sandboxed_process14"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: aec0ea21
     <service  # DIFF-ANCHOR: cf88a5e5
+        android:name="org.chromium.content.app.SandboxedProcessService15"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService15"
         android:process=":sandboxed_process15"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: cf88a5e5
     <service  # DIFF-ANCHOR: 7d85889d
+        android:name="org.chromium.content.app.SandboxedProcessService16"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService16"
         android:process=":sandboxed_process16"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 7d85889d
     <service  # DIFF-ANCHOR: dae26ed4
+        android:name="org.chromium.content.app.SandboxedProcessService17"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService17"
         android:process=":sandboxed_process17"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: dae26ed4
     <service  # DIFF-ANCHOR: 2c6cf029
+        android:name="org.chromium.content.app.SandboxedProcessService18"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService18"
         android:process=":sandboxed_process18"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 2c6cf029
     <service  # DIFF-ANCHOR: 1d2f0988
+        android:name="org.chromium.content.app.SandboxedProcessService19"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService19"
         android:process=":sandboxed_process19"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 1d2f0988
     <service  # DIFF-ANCHOR: 4a39041b
+        android:name="org.chromium.content.app.SandboxedProcessService2"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService2"
         android:process=":sandboxed_process2"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 4a39041b
     <service  # DIFF-ANCHOR: 073533bf
+        android:name="org.chromium.content.app.SandboxedProcessService20"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService20"
         android:process=":sandboxed_process20"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 073533bf
     <service  # DIFF-ANCHOR: d24da41d
+        android:name="org.chromium.content.app.SandboxedProcessService21"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService21"
         android:process=":sandboxed_process21"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: d24da41d
     <service  # DIFF-ANCHOR: 594d8b32
+        android:name="org.chromium.content.app.SandboxedProcessService22"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService22"
         android:process=":sandboxed_process22"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 594d8b32
     <service  # DIFF-ANCHOR: 5528c0c3
+        android:name="org.chromium.content.app.SandboxedProcessService23"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService23"
         android:process=":sandboxed_process23"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 5528c0c3
     <service  # DIFF-ANCHOR: b7ab2ba3
+        android:name="org.chromium.content.app.SandboxedProcessService24"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService24"
         android:process=":sandboxed_process24"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: b7ab2ba3
     <service  # DIFF-ANCHOR: cec6cb64
+        android:name="org.chromium.content.app.SandboxedProcessService25"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService25"
         android:process=":sandboxed_process25"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: cec6cb64
     <service  # DIFF-ANCHOR: 5b4a00fe
+        android:name="org.chromium.content.app.SandboxedProcessService26"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService26"
         android:process=":sandboxed_process26"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 5b4a00fe
     <service  # DIFF-ANCHOR: ad49d203
+        android:name="org.chromium.content.app.SandboxedProcessService27"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService27"
         android:process=":sandboxed_process27"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: ad49d203
     <service  # DIFF-ANCHOR: 573298e9
+        android:name="org.chromium.content.app.SandboxedProcessService28"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService28"
         android:process=":sandboxed_process28"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 573298e9
     <service  # DIFF-ANCHOR: 79897b32
+        android:name="org.chromium.content.app.SandboxedProcessService29"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService29"
         android:process=":sandboxed_process29"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 79897b32
     <service  # DIFF-ANCHOR: 84335864
+        android:name="org.chromium.content.app.SandboxedProcessService3"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService3"
         android:process=":sandboxed_process3"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 84335864
     <service  # DIFF-ANCHOR: c4bd371e
+        android:name="org.chromium.content.app.SandboxedProcessService30"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService30"
         android:process=":sandboxed_process30"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: c4bd371e
     <service  # DIFF-ANCHOR: 394a9fd0
+        android:name="org.chromium.content.app.SandboxedProcessService31"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService31"
         android:process=":sandboxed_process31"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 394a9fd0
     <service  # DIFF-ANCHOR: b811afb8
+        android:name="org.chromium.content.app.SandboxedProcessService32"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService32"
         android:process=":sandboxed_process32"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: b811afb8
     <service  # DIFF-ANCHOR: 2811ddd3
+        android:name="org.chromium.content.app.SandboxedProcessService33"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService33"
         android:process=":sandboxed_process33"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 2811ddd3
     <service  # DIFF-ANCHOR: 73ae1688
+        android:name="org.chromium.content.app.SandboxedProcessService34"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService34"
         android:process=":sandboxed_process34"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 73ae1688
     <service  # DIFF-ANCHOR: c476f324
+        android:name="org.chromium.content.app.SandboxedProcessService35"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService35"
         android:process=":sandboxed_process35"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: c476f324
     <service  # DIFF-ANCHOR: 75d5304b
+        android:name="org.chromium.content.app.SandboxedProcessService36"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService36"
         android:process=":sandboxed_process36"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 75d5304b
     <service  # DIFF-ANCHOR: dc6d0617
+        android:name="org.chromium.content.app.SandboxedProcessService37"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService37"
         android:process=":sandboxed_process37"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: dc6d0617
     <service  # DIFF-ANCHOR: e31efe49
+        android:name="org.chromium.content.app.SandboxedProcessService38"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService38"
         android:process=":sandboxed_process38"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: e31efe49
     <service  # DIFF-ANCHOR: 5736507e
+        android:name="org.chromium.content.app.SandboxedProcessService39"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService39"
         android:process=":sandboxed_process39"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 5736507e
     <service  # DIFF-ANCHOR: a161be24
+        android:name="org.chromium.content.app.SandboxedProcessService4"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService4"
         android:process=":sandboxed_process4"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: a161be24
     <service  # DIFF-ANCHOR: 8e591688
+        android:name="org.chromium.content.app.SandboxedProcessService5"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService5"
         android:process=":sandboxed_process5"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 8e591688
     <service  # DIFF-ANCHOR: 705141d0
+        android:name="org.chromium.content.app.SandboxedProcessService6"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService6"
         android:process=":sandboxed_process6"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 705141d0
     <service  # DIFF-ANCHOR: 38ed2189
+        android:name="org.chromium.content.app.SandboxedProcessService7"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService7"
         android:process=":sandboxed_process7"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 38ed2189
     <service  # DIFF-ANCHOR: aa417956
+        android:name="org.chromium.content.app.SandboxedProcessService8"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService8"
         android:process=":sandboxed_process8"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: aa417956
     <service  # DIFF-ANCHOR: e2f3bbbd
+        android:name="org.chromium.content.app.SandboxedProcessService9"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService9"
         android:process=":sandboxed_process9"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
diff --git a/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected b/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected
index f2e9541..e30efcd 100644
--- a/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected
+++ b/android_webview/expectations/trichrome_webview_bundle.AndroidManifest.expected
@@ -1,12 +1,12 @@
 <?xml version="1.0" ?>
 <manifest
-    android:isolatedSplits="true"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="com.android.webview"
     platformBuildVersionCode="30"
     platformBuildVersionName="11"
-    tools:ignore="MissingLeanbackLauncher"
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
+    android:isolatedSplits="true"
+    tools:ignore="MissingLeanbackLauncher">
   <queries>  # DIFF-ANCHOR: 0c3a615d
     <intent>  # DIFF-ANCHOR: 28c960ba
       <action android:name="android.media.browse.MediaBrowserService"/>
@@ -19,23 +19,23 @@
   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="30"/>
   <application
+      android:name="org.chromium.android_webview.nonembedded.WebViewApkApplication"
       android:extractNativeLibs="False"
       android:icon="@$PACKAGE:drawable/icon_webview"
       android:label="Android System WebView"
       android:multiArch="true"
-      android:name="org.chromium.android_webview.nonembedded.WebViewApkApplication"
       android:use32bitAbi="true">
     <activity  # DIFF-ANCHOR: ea1a94af
-        android:exported="false"
         android:name="com.google.android.gms.common.api.GoogleApiActivity"
+        android:exported="false"
         android:theme="@android:style/Theme.Translucent.NoTitleBar">
     </activity>  # DIFF-ANCHOR: ea1a94af
     <activity  # DIFF-ANCHOR: a4438884
+        android:name="org.chromium.android_webview.devui.MainActivity"
         android:exported="true"
         android:icon="@drawable/icon_webview"
         android:label="WebView DevTools"
         android:launchMode="singleTask"
-        android:name="org.chromium.android_webview.devui.MainActivity"
         android:process=":webview_apk"
         android:taskAffinity="$PACKAGE.org.chromium.android_webview.devui"
         android:theme="@style/Theme.DevUi.DayNight"
@@ -47,9 +47,9 @@
       </intent-filter>  # DIFF-ANCHOR: b80aa336
     </activity>  # DIFF-ANCHOR: a4438884
     <activity  # DIFF-ANCHOR: aeabab17
+        android:name="org.chromium.android_webview.nonembedded.LicenseActivity"
         android:exported="true"
         android:label="@string/license_activity_title"
-        android:name="org.chromium.android_webview.nonembedded.LicenseActivity"
         android:process=":webview_apk">
       <intent-filter>  # DIFF-ANCHOR: 23298d3b
         <action android:name="android.settings.WEBVIEW_LICENSE"/>
@@ -58,8 +58,8 @@
       <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED" android:value="true"/>
     </activity>  # DIFF-ANCHOR: aeabab17
     <activity-alias  # DIFF-ANCHOR: b7cc06e9
-        android:enabled="false"
         android:name="org.chromium.android_webview.devui.DeveloperModeState"
+        android:enabled="false"
         android:process=":webview_apk"
         android:targetActivity="org.chromium.android_webview.devui.MainActivity"
         android:visibleToInstantApps="true">
@@ -69,443 +69,443 @@
     <meta-data android:name="org.chromium.content.browser.NUM_PRIVILEGED_SERVICES" android:value="0"/>
     <meta-data android:name="org.chromium.content.browser.NUM_SANDBOXED_SERVICES" android:value="40"/>
     <provider  # DIFF-ANCHOR: a5e78e63
+        android:name="org.chromium.android_webview.nonembedded.LicenseContentProvider"
         android:authorities="$PACKAGE.LicenseContentProvider"
         android:exported="true"
         android:grantUriPermissions="true"
-        android:name="org.chromium.android_webview.nonembedded.LicenseContentProvider"
         android:process=":webview_apk"
         tools:ignore="ExportedContentProvider">
     </provider>  # DIFF-ANCHOR: a5e78e63
     <provider  # DIFF-ANCHOR: bfe37944
+        android:name="org.chromium.android_webview.services.DeveloperModeContentProvider"
         android:authorities="$PACKAGE.DeveloperModeContentProvider"
         android:exported="true"
-        android:name="org.chromium.android_webview.services.DeveloperModeContentProvider"
         android:process=":webview_service"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedContentProvider">
     </provider>  # DIFF-ANCHOR: bfe37944
-    <receiver  # DIFF-ANCHOR: 1091f66b
-        android:exported="false"
-        android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver">
-    </receiver>  # DIFF-ANCHOR: 1091f66b
-    <service  # DIFF-ANCHOR: 41539e3c
-        android:exported="false"
-        android:name="com.google.android.gms.cast.framework.ReconnectionService">
-    </service>  # DIFF-ANCHOR: 41539e3c
-    <service  # DIFF-ANCHOR: 7dad1ec5
-        android:exported="false"
-        android:name="com.google.android.gms.cast.framework.media.MediaNotificationService">
-    </service>  # DIFF-ANCHOR: 7dad1ec5
+    <receiver  # DIFF-ANCHOR: 0a6f8fa5
+        android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 0a6f8fa5
+    <service  # DIFF-ANCHOR: 749391ed
+        android:name="com.google.android.gms.cast.framework.ReconnectionService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 749391ed
+    <service  # DIFF-ANCHOR: 48ce9d28
+        android:name="com.google.android.gms.cast.framework.media.MediaNotificationService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 48ce9d28
     <service  # DIFF-ANCHOR: b9ec52c4
-        android:exported="false"
         android:name="org.chromium.android_webview.nonembedded.AwComponentUpdateService"
+        android:exported="false"
         android:permission="android.permission.BIND_JOB_SERVICE"
         android:process=":webview_apk">
     </service>  # DIFF-ANCHOR: b9ec52c4
     <service  # DIFF-ANCHOR: 3cd6d713
-        android:exported="true"
         android:name="org.chromium.android_webview.services.AwMinidumpUploadJobService"
+        android:exported="true"
         android:permission="android.permission.BIND_JOB_SERVICE"
         android:process=":webview_service">
     </service>  # DIFF-ANCHOR: 3cd6d713
     <service  # DIFF-ANCHOR: 65cddb26
-        android:exported="false"
         android:name="org.chromium.android_webview.services.AwVariationsSeedFetcher"
+        android:exported="false"
         android:permission="android.permission.BIND_JOB_SERVICE"
         android:process=":webview_service">
     </service>  # DIFF-ANCHOR: 65cddb26
     <service  # DIFF-ANCHOR: c756cf8d
-        android:exported="true"
         android:name="org.chromium.android_webview.services.ComponentsProviderService"
+        android:exported="true"
         android:process=":webview_service"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: c756cf8d
     <service  # DIFF-ANCHOR: 5cda9608
-        android:exported="true"
         android:name="org.chromium.android_webview.services.CrashReceiverService"
+        android:exported="true"
         android:process=":webview_service"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 5cda9608
     <service  # DIFF-ANCHOR: adce9ea1
-        android:exported="true"
         android:name="org.chromium.android_webview.services.DeveloperUiService"
+        android:exported="true"
         android:process=":webview_service"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: adce9ea1
     <service  # DIFF-ANCHOR: eecf2fee
-        android:exported="true"
         android:name="org.chromium.android_webview.services.MetricsBridgeService"
+        android:exported="true"
         android:process=":webview_service"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: eecf2fee
     <service  # DIFF-ANCHOR: dc926e35
-        android:exported="true"
         android:name="org.chromium.android_webview.services.VariationsSeedServer"
+        android:exported="true"
         android:process=":webview_service"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: dc926e35
     <service  # DIFF-ANCHOR: b1e3e8bd
+        android:name="org.chromium.content.app.SandboxedProcessService0"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService0"
         android:process=":sandboxed_process0"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: b1e3e8bd
     <service  # DIFF-ANCHOR: 76d1ccf8
+        android:name="org.chromium.content.app.SandboxedProcessService1"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService1"
         android:process=":sandboxed_process1"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 76d1ccf8
     <service  # DIFF-ANCHOR: 38b95266
+        android:name="org.chromium.content.app.SandboxedProcessService10"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService10"
         android:process=":sandboxed_process10"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 38b95266
     <service  # DIFF-ANCHOR: e4a2e4a2
+        android:name="org.chromium.content.app.SandboxedProcessService11"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService11"
         android:process=":sandboxed_process11"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: e4a2e4a2
     <service  # DIFF-ANCHOR: d9b2ffba
+        android:name="org.chromium.content.app.SandboxedProcessService12"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService12"
         android:process=":sandboxed_process12"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: d9b2ffba
     <service  # DIFF-ANCHOR: b41bb17d
+        android:name="org.chromium.content.app.SandboxedProcessService13"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService13"
         android:process=":sandboxed_process13"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: b41bb17d
     <service  # DIFF-ANCHOR: aec0ea21
+        android:name="org.chromium.content.app.SandboxedProcessService14"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService14"
         android:process=":sandboxed_process14"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: aec0ea21
     <service  # DIFF-ANCHOR: cf88a5e5
+        android:name="org.chromium.content.app.SandboxedProcessService15"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService15"
         android:process=":sandboxed_process15"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: cf88a5e5
     <service  # DIFF-ANCHOR: 7d85889d
+        android:name="org.chromium.content.app.SandboxedProcessService16"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService16"
         android:process=":sandboxed_process16"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 7d85889d
     <service  # DIFF-ANCHOR: dae26ed4
+        android:name="org.chromium.content.app.SandboxedProcessService17"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService17"
         android:process=":sandboxed_process17"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: dae26ed4
     <service  # DIFF-ANCHOR: 2c6cf029
+        android:name="org.chromium.content.app.SandboxedProcessService18"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService18"
         android:process=":sandboxed_process18"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 2c6cf029
     <service  # DIFF-ANCHOR: 1d2f0988
+        android:name="org.chromium.content.app.SandboxedProcessService19"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService19"
         android:process=":sandboxed_process19"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 1d2f0988
     <service  # DIFF-ANCHOR: 4a39041b
+        android:name="org.chromium.content.app.SandboxedProcessService2"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService2"
         android:process=":sandboxed_process2"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 4a39041b
     <service  # DIFF-ANCHOR: 073533bf
+        android:name="org.chromium.content.app.SandboxedProcessService20"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService20"
         android:process=":sandboxed_process20"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 073533bf
     <service  # DIFF-ANCHOR: d24da41d
+        android:name="org.chromium.content.app.SandboxedProcessService21"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService21"
         android:process=":sandboxed_process21"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: d24da41d
     <service  # DIFF-ANCHOR: 594d8b32
+        android:name="org.chromium.content.app.SandboxedProcessService22"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService22"
         android:process=":sandboxed_process22"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 594d8b32
     <service  # DIFF-ANCHOR: 5528c0c3
+        android:name="org.chromium.content.app.SandboxedProcessService23"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService23"
         android:process=":sandboxed_process23"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 5528c0c3
     <service  # DIFF-ANCHOR: b7ab2ba3
+        android:name="org.chromium.content.app.SandboxedProcessService24"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService24"
         android:process=":sandboxed_process24"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: b7ab2ba3
     <service  # DIFF-ANCHOR: cec6cb64
+        android:name="org.chromium.content.app.SandboxedProcessService25"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService25"
         android:process=":sandboxed_process25"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: cec6cb64
     <service  # DIFF-ANCHOR: 5b4a00fe
+        android:name="org.chromium.content.app.SandboxedProcessService26"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService26"
         android:process=":sandboxed_process26"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 5b4a00fe
     <service  # DIFF-ANCHOR: ad49d203
+        android:name="org.chromium.content.app.SandboxedProcessService27"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService27"
         android:process=":sandboxed_process27"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: ad49d203
     <service  # DIFF-ANCHOR: 573298e9
+        android:name="org.chromium.content.app.SandboxedProcessService28"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService28"
         android:process=":sandboxed_process28"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 573298e9
     <service  # DIFF-ANCHOR: 79897b32
+        android:name="org.chromium.content.app.SandboxedProcessService29"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService29"
         android:process=":sandboxed_process29"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 79897b32
     <service  # DIFF-ANCHOR: 84335864
+        android:name="org.chromium.content.app.SandboxedProcessService3"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService3"
         android:process=":sandboxed_process3"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 84335864
     <service  # DIFF-ANCHOR: c4bd371e
+        android:name="org.chromium.content.app.SandboxedProcessService30"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService30"
         android:process=":sandboxed_process30"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: c4bd371e
     <service  # DIFF-ANCHOR: 394a9fd0
+        android:name="org.chromium.content.app.SandboxedProcessService31"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService31"
         android:process=":sandboxed_process31"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 394a9fd0
     <service  # DIFF-ANCHOR: b811afb8
+        android:name="org.chromium.content.app.SandboxedProcessService32"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService32"
         android:process=":sandboxed_process32"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: b811afb8
     <service  # DIFF-ANCHOR: 2811ddd3
+        android:name="org.chromium.content.app.SandboxedProcessService33"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService33"
         android:process=":sandboxed_process33"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 2811ddd3
     <service  # DIFF-ANCHOR: 73ae1688
+        android:name="org.chromium.content.app.SandboxedProcessService34"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService34"
         android:process=":sandboxed_process34"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 73ae1688
     <service  # DIFF-ANCHOR: c476f324
+        android:name="org.chromium.content.app.SandboxedProcessService35"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService35"
         android:process=":sandboxed_process35"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: c476f324
     <service  # DIFF-ANCHOR: 75d5304b
+        android:name="org.chromium.content.app.SandboxedProcessService36"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService36"
         android:process=":sandboxed_process36"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 75d5304b
     <service  # DIFF-ANCHOR: dc6d0617
+        android:name="org.chromium.content.app.SandboxedProcessService37"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService37"
         android:process=":sandboxed_process37"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: dc6d0617
     <service  # DIFF-ANCHOR: e31efe49
+        android:name="org.chromium.content.app.SandboxedProcessService38"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService38"
         android:process=":sandboxed_process38"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: e31efe49
     <service  # DIFF-ANCHOR: 5736507e
+        android:name="org.chromium.content.app.SandboxedProcessService39"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService39"
         android:process=":sandboxed_process39"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 5736507e
     <service  # DIFF-ANCHOR: a161be24
+        android:name="org.chromium.content.app.SandboxedProcessService4"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService4"
         android:process=":sandboxed_process4"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: a161be24
     <service  # DIFF-ANCHOR: 8e591688
+        android:name="org.chromium.content.app.SandboxedProcessService5"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService5"
         android:process=":sandboxed_process5"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 8e591688
     <service  # DIFF-ANCHOR: 705141d0
+        android:name="org.chromium.content.app.SandboxedProcessService6"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService6"
         android:process=":sandboxed_process6"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 705141d0
     <service  # DIFF-ANCHOR: 38ed2189
+        android:name="org.chromium.content.app.SandboxedProcessService7"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService7"
         android:process=":sandboxed_process7"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 38ed2189
     <service  # DIFF-ANCHOR: aa417956
+        android:name="org.chromium.content.app.SandboxedProcessService8"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService8"
         android:process=":sandboxed_process8"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: aa417956
     <service  # DIFF-ANCHOR: e2f3bbbd
+        android:name="org.chromium.content.app.SandboxedProcessService9"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService9"
         android:process=":sandboxed_process9"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: e2f3bbbd
-    <uses-static-library android:certDigest="32a2fc74d731105859e5a85df16d95f102d85b22099b8064c5d8915c61dad1e0" android:name="org.chromium.trichromelibrary" android:version="$VERSION_NUMBER"/>
+    <uses-static-library android:name="org.chromium.trichromelibrary" android:certDigest="32a2fc74d731105859e5a85df16d95f102d85b22099b8064c5d8915c61dad1e0" android:version="$VERSION_NUMBER"/>
   </application>
 </manifest>
diff --git a/android_webview/glue/BUILD.gn b/android_webview/glue/BUILD.gn
index 379a8db..b456caf 100644
--- a/android_webview/glue/BUILD.gn
+++ b/android_webview/glue/BUILD.gn
@@ -21,6 +21,7 @@
     "//components/content_capture/android:java",
     "//components/embedder_support/android:application_java",
     "//components/embedder_support/android:util_java",
+    "//components/version_info/android:version_constants_java",
     "//content/public/android:content_java",
     "//net/android:net_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
index a5f6359a..495ebe0 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
@@ -54,9 +54,11 @@
 import org.chromium.base.annotations.VerifiesOnP;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.ScopedSysTraceEvent;
+import org.chromium.build.BuildConfig;
 import org.chromium.build.NativeLibraries;
 import org.chromium.components.embedder_support.application.ClassLoaderContextWrapperFactory;
 import org.chromium.components.embedder_support.application.FirebaseConfig;
+import org.chromium.components.version_info.VersionConstants;
 import org.chromium.content_public.browser.LGEmailActionModeWorkaround;
 
 import java.io.File;
@@ -315,6 +317,12 @@
                 CommandLine cl = CommandLine.getInstance();
                 cl.appendSwitch(AwSwitches.WEBVIEW_SANDBOXED_RENDERER);
             }
+            // Using concatenation rather than %s to allow values to be inlined by R8.
+            Log.i(TAG,
+                    "Loaded version=" + VersionConstants.PRODUCT_VERSION + " minSdkVersion="
+                            + BuildConfig.MIN_SDK_VERSION + " isBundle=" + ProductConfig.IS_BUNDLE
+                            + " multiprocess=%s packageId=%s",
+                    multiProcess, packageId);
 
             // Enable modern SameSite cookie behavior if the app targets at least S.
             if (BuildInfo.targetsAtLeastS()) {
diff --git a/android_webview/lib/aw_main_delegate.cc b/android_webview/lib/aw_main_delegate.cc
index 180643ed..2b81b342 100644
--- a/android_webview/lib/aw_main_delegate.cc
+++ b/android_webview/lib/aw_main_delegate.cc
@@ -220,13 +220,6 @@
     // Enable VizForWebView by default.
     features.EnableIfNotSet(::features::kVizForWebViewDefault);
 
-    // WebView doesn't support surface embedding without viz.The media code
-    // checks for both media::kDisableSurfaceLayerForVideo and VizForWebView to
-    // decide if it can embed, so we always enable kDisableSurfaceLayerForVideo
-    // here.
-    // https://crbug.com/853832
-    features.EnableIfNotSet(media::kDisableSurfaceLayerForVideo);
-
     // WebView does not support overlay fullscreen yet for video overlays.
     features.DisableIfNotSet(media::kOverlayFullscreenVideo);
 
diff --git a/android_webview/lib/webview_jni_onload.cc b/android_webview/lib/webview_jni_onload.cc
index 1a59dbb..cefe289 100644
--- a/android_webview/lib/webview_jni_onload.cc
+++ b/android_webview/lib/webview_jni_onload.cc
@@ -5,8 +5,6 @@
 #include "android_webview/lib/webview_jni_onload.h"
 
 #include "android_webview/lib/aw_main_delegate.h"
-#include "base/android/library_loader/library_loader_hooks.h"
-#include "components/version_info/version_info_values.h"
 #include "content/public/app/content_jni_onload.h"
 #include "content/public/app/content_main.h"
 
@@ -16,7 +14,6 @@
   if (!content::android::OnJNIOnLoadInit())
     return false;
 
-  base::android::SetVersionNumber(PRODUCT_VERSION);
   content::SetContentMainDelegate(new android_webview::AwMainDelegate());
   return true;
 }
diff --git a/android_webview/nonembedded/BUILD.gn b/android_webview/nonembedded/BUILD.gn
index d9f061a7..c4e8573d 100644
--- a/android_webview/nonembedded/BUILD.gn
+++ b/android_webview/nonembedded/BUILD.gn
@@ -37,6 +37,7 @@
     "//base:base_java",
     "//components/about_ui/android:aboutui_java",
     "//components/embedder_support/android:application_java",
+    "//components/version_info/android:version_constants_java",
     "//third_party/android_deps:com_google_code_findbugs_jsr305_java",
     "//third_party/android_deps:protobuf_lite_runtime_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
index 5442c6a..73a9db6 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
@@ -13,9 +13,11 @@
 import com.android.webview.chromium.WebViewLibraryPreloader;
 
 import org.chromium.android_webview.AwLocaleConfig;
+import org.chromium.android_webview.ProductConfig;
 import org.chromium.android_webview.common.CommandLineUtil;
 import org.chromium.android_webview.devui.util.WebViewPackageHelper;
 import org.chromium.base.ContextUtils;
+import org.chromium.base.Log;
 import org.chromium.base.PathUtils;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
@@ -25,7 +27,9 @@
 import org.chromium.base.metrics.UmaRecorderHolder;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
+import org.chromium.build.BuildConfig;
 import org.chromium.components.embedder_support.application.FontPreloadingWorkaround;
+import org.chromium.components.version_info.VersionConstants;
 import org.chromium.ui.base.ResourceBundle;
 
 /**
@@ -38,11 +42,20 @@
  */
 @JNINamespace("android_webview")
 public class WebViewApkApplication extends Application {
+    private static final String TAG = "WebViewApkApp";
+
     // Called by the framework for ALL processes. Runs before ContentProviders are created.
     // Quirk: context.getApplicationContext() returns null during this method.
     @Override
     protected void attachBaseContext(Context context) {
         super.attachBaseContext(context);
+        // Using concatenation rather than %s to allow values to be inlined by R8.
+        Log.i(TAG,
+                "Launched version=" + VersionConstants.PRODUCT_VERSION
+                        + " minSdkVersion=" + BuildConfig.MIN_SDK_VERSION
+                        + " isBundle=" + ProductConfig.IS_BUNDLE + " processName=%s",
+                ContextUtils.getProcessName());
+
         ContextUtils.initApplicationContext(this);
         maybeInitProcessGlobals();
 
diff --git a/android_webview/system_webview_apk_tmpl.gni b/android_webview/system_webview_apk_tmpl.gni
index 55e2773..e8b79134 100644
--- a/android_webview/system_webview_apk_tmpl.gni
+++ b/android_webview/system_webview_apk_tmpl.gni
@@ -179,15 +179,6 @@
       }
     }
 
-    if (!_use_trichrome_library || android_64bit_target_cpu) {
-      # 32-bit TrichromeWebView doesn't have a native library, so only do this
-      # for other configs.
-      native_lib_version_rule = "//build/util:chrome_version_json"
-      _native_lib_file =
-          rebase_path("$root_gen_dir/CHROME_VERSION.json", root_out_dir)
-      native_lib_version_arg = "@FileArg($_native_lib_file:full-quoted)"
-    }
-
     aapt_locale_allowlist = locales
 
     resource_exclusion_regex = common_resource_exclusion_regex
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn
index b73b055..126f8123 100644
--- a/android_webview/test/BUILD.gn
+++ b/android_webview/test/BUILD.gn
@@ -91,11 +91,6 @@
 
   shared_libraries = [ ":libstandalonelibwebviewchromium" ]
 
-  native_lib_version_rule = "//build/util:chrome_version_json"
-  _native_lib_file =
-      rebase_path("$root_gen_dir/CHROME_VERSION.json", root_build_dir)
-  native_lib_version_arg = "@FileArg($_native_lib_file:full-quoted)"
-
   command_line_flags_file = "android-webview-command-line"
 }
 
diff --git a/ash/accessibility/magnifier/magnification_controller_unittest.cc b/ash/accessibility/magnifier/magnification_controller_unittest.cc
index 803802b..23b1df80 100644
--- a/ash/accessibility/magnifier/magnification_controller_unittest.cc
+++ b/ash/accessibility/magnifier/magnification_controller_unittest.cc
@@ -19,6 +19,7 @@
 #include "ui/aura/test/aura_test_utils.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/ime/input_method.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/screen.h"
 #include "ui/display/test/display_manager_test_api.h"
diff --git a/ash/accessibility/sticky_keys/sticky_keys_overlay.cc b/ash/accessibility/sticky_keys/sticky_keys_overlay.cc
index 8c70f75..2dfed827 100644
--- a/ash/accessibility/sticky_keys/sticky_keys_overlay.cc
+++ b/ash/accessibility/sticky_keys/sticky_keys_overlay.cc
@@ -14,6 +14,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/font_list.h"
diff --git a/ash/accessibility/ui/accessibility_focus_ring_controller_unittest.cc b/ash/accessibility/ui/accessibility_focus_ring_controller_unittest.cc
index eb7328c..383411d 100644
--- a/ash/accessibility/ui/accessibility_focus_ring_controller_unittest.cc
+++ b/ash/accessibility/ui/accessibility_focus_ring_controller_unittest.cc
@@ -11,6 +11,7 @@
 #include "ash/test/ash_test_base.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/ime/dummy_text_input_client.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
 
diff --git a/ash/accessibility/ui/accessibility_highlight_controller_unittest.cc b/ash/accessibility/ui/accessibility_highlight_controller_unittest.cc
index 349947e4..9b37f1e 100644
--- a/ash/accessibility/ui/accessibility_highlight_controller_unittest.cc
+++ b/ash/accessibility/ui/accessibility_highlight_controller_unittest.cc
@@ -23,6 +23,7 @@
 #include "ui/aura/window.h"
 #include "ui/base/ime/dummy_text_input_client.h"
 #include "ui/compositor/compositor_switches.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/events/event.h"
 #include "ui/gfx/image/image.h"
diff --git a/ash/ambient/ui/ambient_background_image_view.cc b/ash/ambient/ui/ambient_background_image_view.cc
index 81c6e001..a5158d1 100644
--- a/ash/ambient/ui/ambient_background_image_view.cc
+++ b/ash/ambient/ui/ambient_background_image_view.cc
@@ -13,6 +13,7 @@
 #include "ash/ambient/ui/media_string_view.h"
 #include "ash/ambient/util/ambient_util.h"
 #include "base/rand_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/event.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/image/image_skia_operations.h"
diff --git a/ash/ambient/ui/ambient_info_view.cc b/ash/ambient/ui/ambient_info_view.cc
index feba612..9d73cfaa 100644
--- a/ash/ambient/ui/ambient_info_view.cc
+++ b/ash/ambient/ui/ambient_info_view.cc
@@ -10,6 +10,7 @@
 #include "ash/ambient/ui/ambient_view_ids.h"
 #include "ash/ambient/ui/glanceable_info_view.h"
 #include "ash/ambient/util/ambient_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/box_layout.h"
diff --git a/ash/ambient/ui/glanceable_info_view.cc b/ash/ambient/ui/glanceable_info_view.cc
index 5a21e045..1a589f4 100644
--- a/ash/ambient/ui/glanceable_info_view.cc
+++ b/ash/ambient/ui/glanceable_info_view.cc
@@ -21,6 +21,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/font_list.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/geometry/rect.h"
diff --git a/ash/ambient/ui/media_string_view_unittest.cc b/ash/ambient/ui/media_string_view_unittest.cc
index d2594c2..fb694d9 100644
--- a/ash/ambient/ui/media_string_view_unittest.cc
+++ b/ash/ambient/ui/media_string_view_unittest.cc
@@ -13,6 +13,7 @@
 #include "ash/shell.h"
 #include "base/strings/utf_string_conversions.h"
 #include "services/media_session/public/mojom/media_session.mojom.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/views/controls/label.h"
 
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc
index fd23b18..953f5da 100644
--- a/ash/app_list/app_list_controller_impl.cc
+++ b/ash/app_list/app_list_controller_impl.cc
@@ -65,6 +65,7 @@
 #include "components/services/app_service/public/cpp/app_registry_cache_wrapper.h"
 #include "extensions/common/constants.h"
 #include "ui/base/ui_base_features.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/screen.h"
 #include "ui/views/controls/textfield/textfield.h"
diff --git a/ash/app_list/app_list_controller_impl_unittest.cc b/ash/app_list/app_list_controller_impl_unittest.cc
index 0c5678d5..fbfc934 100644
--- a/ash/app_list/app_list_controller_impl_unittest.cc
+++ b/ash/app_list/app_list_controller_impl_unittest.cc
@@ -52,6 +52,7 @@
 #include "base/test/with_feature_override.h"
 #include "ui/base/emoji/emoji_panel_helper.h"
 #include "ui/base/ui_base_features.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/message_center/message_center.h"
diff --git a/ash/app_list/views/app_list_folder_view.cc b/ash/app_list/views/app_list_folder_view.cc
index 29074073..a309a8e7 100644
--- a/ash/app_list/views/app_list_folder_view.cc
+++ b/ash/app_list/views/app_list_folder_view.cc
@@ -30,6 +30,7 @@
 #include "ash/public/cpp/pagination/pagination_model.h"
 #include "base/strings/utf_string_conversions.h"
 #include "ui/accessibility/ax_node_data.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/events/event.h"
diff --git a/ash/app_list/views/app_list_main_view.cc b/ash/app_list/views/app_list_main_view.cc
index ec6a754..e0b5acb 100644
--- a/ash/app_list/views/app_list_main_view.cc
+++ b/ash/app_list/views/app_list_main_view.cc
@@ -32,6 +32,7 @@
 #include "base/metrics/user_metrics.h"
 #include "base/strings/string_util.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/button/button.h"
diff --git a/ash/app_list/views/app_list_main_view_unittest.cc b/ash/app_list/views/app_list_main_view_unittest.cc
index a20173f..7ea99b4b 100644
--- a/ash/app_list/views/app_list_main_view_unittest.cc
+++ b/ash/app_list/views/app_list_main_view_unittest.cc
@@ -17,6 +17,7 @@
 #include "ash/app_list/views/page_switcher.h"
 #include "ash/app_list/views/search_box_view.h"
 #include "ash/public/cpp/test/test_app_list_color_provider.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/views/controls/textfield/textfield.h"
 #include "ui/views/test/views_test_base.h"
diff --git a/ash/app_list/views/app_list_view_unittest.cc b/ash/app_list/views/app_list_view_unittest.cc
index b9f5604..c6b427c 100644
--- a/ash/app_list/views/app_list_view_unittest.cc
+++ b/ash/app_list/views/app_list_view_unittest.cc
@@ -56,6 +56,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/models/simple_menu_model.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/display/display.h"
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc
index fb617fda..c9cfd7c 100644
--- a/ash/app_list/views/apps_grid_view.cc
+++ b/ash/app_list/views/apps_grid_view.cc
@@ -49,6 +49,7 @@
 #include "ui/base/dragdrop/drag_drop_types.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/animation_throughput_reporter.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/paint_recorder.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/display.h"
diff --git a/ash/app_list/views/apps_grid_view_unittest.cc b/ash/app_list/views/apps_grid_view_unittest.cc
index a067eece..ace49fb 100644
--- a/ash/app_list/views/apps_grid_view_unittest.cc
+++ b/ash/app_list/views/apps_grid_view_unittest.cc
@@ -49,6 +49,7 @@
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/event_utils.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/controls/textfield/textfield.h"
diff --git a/ash/app_list/views/assistant/assistant_dialog_plate.cc b/ash/app_list/views/assistant/assistant_dialog_plate.cc
index 149e75a2..703433a 100644
--- a/ash/app_list/views/assistant/assistant_dialog_plate.cc
+++ b/ash/app_list/views/assistant/assistant_dialog_plate.cc
@@ -24,6 +24,7 @@
 #include "chromeos/ui/vector_icons/vector_icons.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/callback_layer_animation_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_palette.h"
diff --git a/ash/app_list/views/assistant/assistant_main_stage.cc b/ash/app_list/views/assistant/assistant_main_stage.cc
index c5fc998..70786b6 100644
--- a/ash/app_list/views/assistant/assistant_main_stage.cc
+++ b/ash/app_list/views/assistant/assistant_main_stage.cc
@@ -23,6 +23,7 @@
 #include "base/bind.h"
 #include "base/time/time.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_element.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/gfx/canvas.h"
diff --git a/ash/app_list/views/assistant/assistant_main_view.cc b/ash/app_list/views/assistant/assistant_main_view.cc
index e7c76f38..10b22ff 100644
--- a/ash/app_list/views/assistant/assistant_main_view.cc
+++ b/ash/app_list/views/assistant/assistant_main_view.cc
@@ -18,6 +18,7 @@
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "ash/public/cpp/assistant/controller/assistant_ui_controller.h"
 #include "ash/search_box/search_box_constants.h"
+#include "ui/compositor/layer.h"
 #include "ui/views/layout/box_layout.h"
 
 namespace ash {
diff --git a/ash/app_list/views/assistant/assistant_page_view.cc b/ash/app_list/views/assistant/assistant_page_view.cc
index e193692..fe82930f 100644
--- a/ash/app_list/views/assistant/assistant_page_view.cc
+++ b/ash/app_list/views/assistant/assistant_page_view.cc
@@ -27,6 +27,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/animation_throughput_reporter.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/compositor_extra/shadow.h"
 #include "ui/views/background.h"
diff --git a/ash/app_list/views/contents_view.cc b/ash/app_list/views/contents_view.cc
index 29107e6..5b27c0e 100644
--- a/ash/app_list/views/contents_view.cc
+++ b/ash/app_list/views/contents_view.cc
@@ -27,6 +27,7 @@
 #include "base/notreached.h"
 #include "base/numerics/ranges.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/display.h"
diff --git a/ash/app_list/views/folder_header_view.cc b/ash/app_list/views/folder_header_view.cc
index d2e2cd9..8153fba5 100644
--- a/ash/app_list/views/folder_header_view.cc
+++ b/ash/app_list/views/folder_header_view.cc
@@ -18,6 +18,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/text_elider.h"
diff --git a/ash/app_list/views/ghost_image_view.cc b/ash/app_list/views/ghost_image_view.cc
index c24bd29..d300978 100644
--- a/ash/app_list/views/ghost_image_view.cc
+++ b/ash/app_list/views/ghost_image_view.cc
@@ -12,6 +12,7 @@
 #include "ash/app_list/views/app_list_item_view.h"
 #include "ash/public/cpp/app_list/app_list_config.h"
 #include "third_party/skia/include/core/SkPaint.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/animation/tween.h"
 #include "ui/gfx/canvas.h"
diff --git a/ash/app_list/views/search_box_view.cc b/ash/app_list/views/search_box_view.cc
index b4d2a0f..985042e8 100644
--- a/ash/app_list/views/search_box_view.cc
+++ b/ash/app_list/views/search_box_view.cc
@@ -39,6 +39,7 @@
 #include "ui/base/ime/composition_text.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/event.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_palette.h"
diff --git a/ash/app_list/views/search_result_page_anchored_dialog.cc b/ash/app_list/views/search_result_page_anchored_dialog.cc
index c6059f5..8aa01729e 100644
--- a/ash/app_list/views/search_result_page_anchored_dialog.cc
+++ b/ash/app_list/views/search_result_page_anchored_dialog.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
diff --git a/ash/app_list/views/search_result_view.cc b/ash/app_list/views/search_result_view.cc
index af7f15c0..556464d 100644
--- a/ash/app_list/views/search_result_view.cc
+++ b/ash/app_list/views/search_result_view.cc
@@ -30,6 +30,7 @@
 #include "ui/gfx/font.h"
 #include "ui/gfx/image/image_skia_operations.h"
 #include "ui/gfx/render_text.h"
+#include "ui/gfx/skia_util.h"
 #include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/controls/menu/menu_runner.h"
diff --git a/ash/app_list/views/suggestion_chip_container_view.cc b/ash/app_list/views/suggestion_chip_container_view.cc
index 2ab468b8..1f2f818 100644
--- a/ash/app_list/views/suggestion_chip_container_view.cc
+++ b/ash/app_list/views/suggestion_chip_container_view.cc
@@ -18,6 +18,7 @@
 #include "ash/public/cpp/app_list/internal_app_id_constants.h"
 #include "base/bind.h"
 #include "base/callback.h"
+#include "ui/compositor/layer.h"
 #include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/controls/textfield/textfield.h"
 #include "ui/views/focus/focus_manager.h"
diff --git a/ash/app_list/views/top_icon_animation_view.cc b/ash/app_list/views/top_icon_animation_view.cc
index 89e6477..0b062d39 100644
--- a/ash/app_list/views/top_icon_animation_view.cc
+++ b/ash/app_list/views/top_icon_animation_view.cc
@@ -4,11 +4,15 @@
 
 #include "ash/app_list/views/top_icon_animation_view.h"
 
+#include <memory>
+#include <utility>
+
 #include "ash/app_list/views/app_list_item_view.h"
 #include "ash/app_list/views/apps_grid_view.h"
 #include "ash/public/cpp/app_list/app_list_color_provider.h"
 #include "ash/public/cpp/app_list/app_list_config.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/image/image_skia_operations.h"
 #include "ui/views/controls/image_view.h"
diff --git a/ash/app_menu/notification_item_view.cc b/ash/app_menu/notification_item_view.cc
index 1f8dbfd..4bce2740 100644
--- a/ash/app_menu/notification_item_view.cc
+++ b/ash/app_menu/notification_item_view.cc
@@ -5,6 +5,7 @@
 #include "ash/app_menu/notification_item_view.h"
 
 #include "ash/public/cpp/app_menu_constants.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/image/image.h"
 #include "ui/gfx/text_elider.h"
diff --git a/ash/app_menu/notification_menu_view_unittest.cc b/ash/app_menu/notification_menu_view_unittest.cc
index c4a40af..cd0cd066 100644
--- a/ash/app_menu/notification_menu_view_unittest.cc
+++ b/ash/app_menu/notification_menu_view_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/events/test/event_generator.h"
diff --git a/ash/assistant/assistant_screen_context_controller_impl.cc b/ash/assistant/assistant_screen_context_controller_impl.cc
index 2f3f68f..83f3b94c 100644
--- a/ash/assistant/assistant_screen_context_controller_impl.cc
+++ b/ash/assistant/assistant_screen_context_controller_impl.cc
@@ -26,6 +26,7 @@
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "ui/accessibility/ax_assistant_structure.h"
 #include "ui/aura/client/aura_constants.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_tree_owner.h"
 #include "ui/gfx/codec/jpeg_codec.h"
 #include "ui/gfx/skbitmap_operations.h"
diff --git a/ash/assistant/ui/main_stage/animated_container_view.cc b/ash/assistant/ui/main_stage/animated_container_view.cc
index 3aef32d..22e81f3 100644
--- a/ash/assistant/ui/main_stage/animated_container_view.cc
+++ b/ash/assistant/ui/main_stage/animated_container_view.cc
@@ -13,6 +13,7 @@
 #include "ash/public/cpp/assistant/controller/assistant_interaction_controller.h"
 #include "chromeos/services/assistant/public/cpp/features.h"
 #include "ui/compositor/callback_layer_animation_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/views/metadata/metadata_impl_macros.h"
 
diff --git a/ash/assistant/ui/main_stage/assistant_footer_view.cc b/ash/assistant/ui/main_stage/assistant_footer_view.cc
index 4dce6a9..604fe35c 100644
--- a/ash/assistant/ui/main_stage/assistant_footer_view.cc
+++ b/ash/assistant/ui/main_stage/assistant_footer_view.cc
@@ -15,6 +15,7 @@
 #include "base/bind.h"
 #include "base/time/time.h"
 #include "ui/compositor/callback_layer_animation_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_element.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/views/layout/fill_layout.h"
diff --git a/ash/assistant/ui/main_stage/assistant_progress_indicator.cc b/ash/assistant/ui/main_stage/assistant_progress_indicator.cc
index b8c1f32..20b62449 100644
--- a/ash/assistant/ui/main_stage/assistant_progress_indicator.cc
+++ b/ash/assistant/ui/main_stage/assistant_progress_indicator.cc
@@ -11,6 +11,7 @@
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "base/bind.h"
 #include "base/time/time.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_element.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
diff --git a/ash/assistant/ui/main_stage/assistant_text_element_view.cc b/ash/assistant/ui/main_stage/assistant_text_element_view.cc
index 4913803..3852b92 100644
--- a/ash/assistant/ui/main_stage/assistant_text_element_view.cc
+++ b/ash/assistant/ui/main_stage/assistant_text_element_view.cc
@@ -10,6 +10,7 @@
 #include "ash/assistant/ui/assistant_ui_constants.h"
 #include "ash/assistant/ui/main_stage/assistant_ui_element_view_animator.h"
 #include "base/strings/utf_string_conversions.h"
+#include "ui/compositor/layer.h"
 #include "ui/views/background.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/fill_layout.h"
diff --git a/ash/assistant/ui/main_stage/assistant_ui_element_view_animator.cc b/ash/assistant/ui/main_stage/assistant_ui_element_view_animator.cc
index d7b11ef9..f177f429 100644
--- a/ash/assistant/ui/main_stage/assistant_ui_element_view_animator.cc
+++ b/ash/assistant/ui/main_stage/assistant_ui_element_view_animator.cc
@@ -9,6 +9,7 @@
 #include "ash/assistant/util/animation_util.h"
 #include "base/metrics/histogram_functions.h"
 #include "ui/compositor/callback_layer_animation_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/animation/tween.h"
 
 namespace ash {
diff --git a/ash/assistant/ui/main_stage/suggestion_container_view.cc b/ash/assistant/ui/main_stage/suggestion_container_view.cc
index af77d03..e9e4d623 100644
--- a/ash/assistant/ui/main_stage/suggestion_container_view.cc
+++ b/ash/assistant/ui/main_stage/suggestion_container_view.cc
@@ -24,6 +24,7 @@
 #include "base/bind.h"
 #include "base/metrics/histogram_functions.h"
 #include "ui/compositor/callback_layer_animation_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_element.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/metadata/metadata_impl_macros.h"
diff --git a/ash/assistant/ui/main_stage/ui_element_container_view.cc b/ash/assistant/ui/main_stage/ui_element_container_view.cc
index 0e2cf45..3ef2025 100644
--- a/ash/assistant/ui/main_stage/ui_element_container_view.cc
+++ b/ash/assistant/ui/main_stage/ui_element_container_view.cc
@@ -22,6 +22,7 @@
 #include "cc/base/math_util.h"
 #include "chromeos/services/assistant/public/cpp/features.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/views/background.h"
 #include "ui/views/border.h"
 #include "ui/views/layout/box_layout.h"
diff --git a/ash/assistant/util/animation_util.cc b/ash/assistant/util/animation_util.cc
index 958cb1d..6583e8f39 100644
--- a/ash/assistant/util/animation_util.cc
+++ b/ash/assistant/util/animation_util.cc
@@ -8,6 +8,7 @@
 #include "base/time/time.h"
 #include "ui/compositor/animation_throughput_reporter.h"
 #include "ui/compositor/callback_layer_animation_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_element.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/layer_animation_sequence.h"
diff --git a/ash/autotest_private_api_utils.cc b/ash/autotest_private_api_utils.cc
index 9095adbe..281f9e19 100644
--- a/ash/autotest_private_api_utils.cc
+++ b/ash/autotest_private_api_utils.cc
@@ -12,6 +12,7 @@
 #include "base/callback_helpers.h"
 #include "base/optional.h"
 #include "base/scoped_observation.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 
 namespace ash {
diff --git a/ash/capture_mode/capture_label_view.cc b/ash/capture_mode/capture_label_view.cc
index 91ae15f8..61b93201 100644
--- a/ash/capture_mode/capture_label_view.cc
+++ b/ash/capture_mode/capture_label_view.cc
@@ -15,6 +15,7 @@
 #include "base/task_runner.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/callback_layer_animation_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_element.h"
 #include "ui/compositor/layer_animation_sequence.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
diff --git a/ash/capture_mode/capture_mode_bar_view.cc b/ash/capture_mode/capture_mode_bar_view.cc
index 650dacef..f5704b1 100644
--- a/ash/capture_mode/capture_mode_bar_view.cc
+++ b/ash/capture_mode/capture_mode_bar_view.cc
@@ -22,6 +22,7 @@
 #include "base/bind.h"
 #include "ui/aura/window.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/strings/grit/ui_strings.h"
 #include "ui/views/background.h"
diff --git a/ash/capture_mode/capture_mode_controller.cc b/ash/capture_mode/capture_mode_controller.cc
index 20ef70e..67bb0b49 100644
--- a/ash/capture_mode/capture_mode_controller.cc
+++ b/ash/capture_mode/capture_mode_controller.cc
@@ -48,6 +48,7 @@
 #include "ui/base/clipboard/clipboard_buffer.h"
 #include "ui/base/clipboard/scoped_clipboard_writer.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/types/display_constants.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/public/cpp/notification.h"
diff --git a/ash/capture_mode/capture_mode_settings_view.cc b/ash/capture_mode/capture_mode_settings_view.cc
index 5155315..722edafd 100644
--- a/ash/capture_mode/capture_mode_settings_view.cc
+++ b/ash/capture_mode/capture_mode_settings_view.cc
@@ -14,6 +14,7 @@
 #include "ash/style/ash_color_provider.h"
 #include "base/bind.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/views/background.h"
 #include "ui/views/controls/button/toggle_button.h"
 #include "ui/views/layout/box_layout.h"
diff --git a/ash/capture_mode/capture_mode_unittests.cc b/ash/capture_mode/capture_mode_unittests.cc
index eee7256d..9695c215 100644
--- a/ash/capture_mode/capture_mode_unittests.cc
+++ b/ash/capture_mode/capture_mode_unittests.cc
@@ -60,6 +60,7 @@
 #include "ui/base/clipboard/clipboard.h"
 #include "ui/base/clipboard/clipboard_buffer.h"
 #include "ui/compositor/compositor.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/display/types/display_constants.h"
 #include "ui/events/keycodes/keyboard_codes_posix.h"
diff --git a/ash/capture_mode/capture_window_observer.cc b/ash/capture_mode/capture_window_observer.cc
index 774ee1e8..b1882b30 100644
--- a/ash/capture_mode/capture_window_observer.cc
+++ b/ash/capture_mode/capture_window_observer.cc
@@ -10,6 +10,7 @@
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/public/cpp/window_finder.h"
 #include "ash/shell.h"
+#include "ui/compositor/layer.h"
 #include "ui/wm/public/activation_client.h"
 
 namespace ash {
diff --git a/ash/capture_mode/video_recording_watcher.cc b/ash/capture_mode/video_recording_watcher.cc
index 0806803..a4b2d99 100644
--- a/ash/capture_mode/video_recording_watcher.cc
+++ b/ash/capture_mode/video_recording_watcher.cc
@@ -22,6 +22,7 @@
 #include "ui/aura/window.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/cursor/cursor_lookup.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/paint_recorder.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/canvas.h"
diff --git a/ash/clipboard/clipboard_nudge.cc b/ash/clipboard/clipboard_nudge.cc
index 179e274..09a35b0 100644
--- a/ash/clipboard/clipboard_nudge.cc
+++ b/ash/clipboard/clipboard_nudge.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "ash/clipboard/clipboard_nudge.h"
+
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/assistant/assistant_state.h"
 #include "ash/public/cpp/shelf_config.h"
@@ -15,6 +16,7 @@
 #include "ash/style/ash_color_provider.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/chromeos/events/keyboard_layout_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/paint_vector_icon.h"
diff --git a/ash/clipboard/clipboard_nudge_controller.cc b/ash/clipboard/clipboard_nudge_controller.cc
index 50cf857..d6a2a7f 100644
--- a/ash/clipboard/clipboard_nudge_controller.cc
+++ b/ash/clipboard/clipboard_nudge_controller.cc
@@ -20,6 +20,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "ui/base/clipboard/clipboard_monitor.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 
 namespace ash {
diff --git a/ash/clipboard/clipboard_nudge_controller_unittest.cc b/ash/clipboard/clipboard_nudge_controller_unittest.cc
index b212d586f..6ce63d0a 100644
--- a/ash/clipboard/clipboard_nudge_controller_unittest.cc
+++ b/ash/clipboard/clipboard_nudge_controller_unittest.cc
@@ -19,6 +19,7 @@
 #include "chromeos/crosapi/mojom/clipboard_history.mojom.h"
 #include "ui/base/clipboard/clipboard_data.h"
 #include "ui/base/clipboard/clipboard_non_backed.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/views/widget/widget_observer.h"
 
diff --git a/ash/clipboard/views/clipboard_history_delete_button.cc b/ash/clipboard/views/clipboard_history_delete_button.cc
index dfc3dd42..6a1268b 100644
--- a/ash/clipboard/views/clipboard_history_delete_button.cc
+++ b/ash/clipboard/views/clipboard_history_delete_button.cc
@@ -10,6 +10,7 @@
 #include "ash/style/ash_color_provider.h"
 #include "ash/style/scoped_light_mode_as_default.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/strings/grit/ui_strings.h"
 #include "ui/views/animation/ink_drop.h"
 #include "ui/views/controls/highlight_path_generator.h"
diff --git a/ash/content/scanning/resources/scan_done_section.html b/ash/content/scanning/resources/scan_done_section.html
index 3efd02f..4ca1af0 100644
--- a/ash/content/scanning/resources/scan_done_section.html
+++ b/ash/content/scanning/resources/scan_done_section.html
@@ -58,6 +58,14 @@
       inner-h-t-m-l="[[fileSavedTextContent_]]">
   </span>
 </div>
+<div class="container" on-click="showFileInLocation_" >
+  <span id="showInFolderButtonLabel" class="label" aria-hidden="true">
+    [[i18n('showInFolderButtonLabel')]]
+  </span>
+  <cr-icon-button id="showInFolderButton" class="button"
+      iron-icon="cr:open-in-new" aria-labelledby="showInFolderButtonLabel">
+  </cr-icon-button>
+</div>
 <div class="container" hidden="[[!showEditButton_]]"
     on-click="openMediaApp_" >
   <span id="editButtonLabel" class="label" aria-hidden="true">
diff --git a/ash/content/scanning/scanning_ui.cc b/ash/content/scanning/scanning_ui.cc
index 1443222c..e9c2d75e 100644
--- a/ash/content/scanning/scanning_ui.cc
+++ b/ash/content/scanning/scanning_ui.cc
@@ -104,6 +104,7 @@
       {"scannersLoadingText", IDS_SCANNING_APP_SCANNERS_LOADING_TEXT},
       {"scanningImagesAriaLabel", IDS_SCANNING_APP_SCANNING_IMAGES_ARIA_LABEL},
       {"selectFolderOption", IDS_SCANNING_APP_SELECT_FOLDER_OPTION},
+      {"showInFolderButtonLabel", IDS_SCANNING_APP_SHOW_IN_FOLDER_BUTTON_LABEL},
       {"sourceDropdownLabel", IDS_SCANNING_APP_SOURCE_DROPDOWN_LABEL},
       {"startScanFailedToast", IDS_SCANNING_APP_START_SCAN_FAILED_TOAST},
       {"twoSidedDocFeederOptionText",
diff --git a/ash/content/shimless_rma/resources/BUILD.gn b/ash/content/shimless_rma/resources/BUILD.gn
index 39c64e8..5ce38d2 100644
--- a/ash/content/shimless_rma/resources/BUILD.gn
+++ b/ash/content/shimless_rma/resources/BUILD.gn
@@ -11,7 +11,10 @@
 preprocessed_dir = "preprocessed"
 preprocessed_gen_manifest = "preprocessed_gen_manifest.json"
 
-polymer_element_files = [ "shimless_rma.js" ]
+polymer_element_files = [
+  "shimless_rma.js",
+  "shimless_rma_shared_css.js",
+]
 
 generate_grd("build_grd") {
   input_files = [
diff --git a/ash/content/shimless_rma/resources/index.html b/ash/content/shimless_rma/resources/index.html
index fbd7ea6..5bb94ed6b 100644
--- a/ash/content/shimless_rma/resources/index.html
+++ b/ash/content/shimless_rma/resources/index.html
@@ -11,8 +11,9 @@
     <shimless-rma></shimless-rma>
 
     <script type="module" src="shimless_rma.js"></script>
+    <link rel="stylesheet" src="shimless_rma_shared_css.js"></script>
     <!-- Below mojo script required to run browser tests -->
     <script src="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js">
     </script>
   </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/ash/content/shimless_rma/resources/shimless_rma_shared_css.html b/ash/content/shimless_rma/resources/shimless_rma_shared_css.html
new file mode 100644
index 0000000..83a1683b
--- /dev/null
+++ b/ash/content/shimless_rma/resources/shimless_rma_shared_css.html
@@ -0,0 +1,11 @@
+<link rel="stylesheet"
+    href="chrome://resources/chromeos/colors/cros_colors.generated.css">
+<link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
+<link rel="stylesheet" href="chrome://resources/css/md_colors.css">
+<template>
+  <style include="cr-shared-style">
+    html {
+      background-color: var(--cros-bg-color);
+    }
+  </style>
+</template>
\ No newline at end of file
diff --git a/ash/content/shimless_rma/resources/shimless_rma_shared_css.js b/ash/content/shimless_rma/resources/shimless_rma_shared_css.js
new file mode 100644
index 0000000..86d1a0d
--- /dev/null
+++ b/ash/content/shimless_rma/resources/shimless_rma_shared_css.js
@@ -0,0 +1,13 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://resources/cr_elements/shared_style_css.m.js';
+import 'chrome://resources/cr_elements/shared_vars_css.m.js';
+import 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+const template = document.createElement('template');
+template.innerHTML = `
+<dom-module id="shimless-rma-shared">{__html_template__}</dom-module>
+`;
+document.body.appendChild(template.content.cloneNode(true));
diff --git a/ash/debug.cc b/ash/debug.cc
index af78fdf..c2e81055 100644
--- a/ash/debug.cc
+++ b/ash/debug.cc
@@ -20,6 +20,7 @@
 #include "ui/aura/window_tree_host.h"
 #include "ui/compositor/compositor.h"
 #include "ui/compositor/debug_utils.h"
+#include "ui/compositor/layer.h"
 #include "ui/views/debug_utils.h"
 #include "ui/views/widget/widget.h"
 
diff --git a/ash/display/display_alignment_indicator.cc b/ash/display/display_alignment_indicator.cc
index dcc6c18..a40cb17 100644
--- a/ash/display/display_alignment_indicator.cc
+++ b/ash/display/display_alignment_indicator.cc
@@ -10,6 +10,7 @@
 #include "ash/shell.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/display.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/image/image_skia_operations.h"
diff --git a/ash/display/mirror_window_controller.cc b/ash/display/mirror_window_controller.cc
index 0fb6998..0aa3d73 100644
--- a/ash/display/mirror_window_controller.cc
+++ b/ash/display/mirror_window_controller.cc
@@ -25,6 +25,7 @@
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/layout.h"
 #include "ui/base/ui_base_features.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/display_layout.h"
 #include "ui/display/display_transform.h"
 #include "ui/display/manager/display_layout_store.h"
diff --git a/ash/display/root_window_transformers_unittest.cc b/ash/display/root_window_transformers_unittest.cc
index 3f58eef..0400707 100644
--- a/ash/display/root_window_transformers_unittest.cc
+++ b/ash/display/root_window_transformers_unittest.cc
@@ -21,6 +21,7 @@
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_tracker.h"
 #include "ui/aura/window_tree_host.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/display.h"
diff --git a/ash/display/shared_display_edge_indicator.cc b/ash/display/shared_display_edge_indicator.cc
index 2703652c..d86834d 100644
--- a/ash/display/shared_display_edge_indicator.cc
+++ b/ash/display/shared_display_edge_indicator.cc
@@ -10,6 +10,7 @@
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/aura/client/screen_position_client.h"
 #include "ui/aura/window_event_dispatcher.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/animation/animation_container.h"
diff --git a/ash/display/touch_calibrator_view.cc b/ash/display/touch_calibrator_view.cc
index b75bf87c..3428b1da6 100644
--- a/ash/display/touch_calibrator_view.cc
+++ b/ash/display/touch_calibrator_view.cc
@@ -12,6 +12,7 @@
 #include "base/memory/ptr_util.h"
 #include "ui/aura/window.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/animation/throb_animation.h"
 #include "ui/gfx/canvas.h"
diff --git a/ash/drag_drop/tab_drag_drop_delegate.cc b/ash/drag_drop/tab_drag_drop_delegate.cc
index c546105..1d337426 100644
--- a/ash/drag_drop/tab_drag_drop_delegate.cc
+++ b/ash/drag_drop/tab_drag_drop_delegate.cc
@@ -21,6 +21,7 @@
 #include "ui/base/clipboard/clipboard_format_type.h"
 #include "ui/base/clipboard/custom_data_helper.h"
 #include "ui/base/dragdrop/os_exchange_data.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/geometry/rect.h"
diff --git a/ash/drag_drop/tab_drag_drop_delegate_unittest.cc b/ash/drag_drop/tab_drag_drop_delegate_unittest.cc
index 6607a06..45c63eb8 100644
--- a/ash/drag_drop/tab_drag_drop_delegate_unittest.cc
+++ b/ash/drag_drop/tab_drag_drop_delegate_unittest.cc
@@ -29,6 +29,7 @@
 #include "ui/base/clipboard/clipboard_format_type.h"
 #include "ui/base/clipboard/custom_data_helper.h"
 #include "ui/base/dragdrop/os_exchange_data.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/test/test_utils.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/gfx/geometry/vector2d.h"
diff --git a/ash/fast_ink/fast_ink_host.cc b/ash/fast_ink/fast_ink_host.cc
index 4f6f248..02d7d34b 100644
--- a/ash/fast_ink/fast_ink_host.cc
+++ b/ash/fast_ink/fast_ink_host.cc
@@ -28,6 +28,7 @@
 #include "ui/aura/window.h"
 #include "ui/aura/window_observer.h"
 #include "ui/aura/window_tree_host.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/dip_util.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/rect_conversions.h"
diff --git a/ash/fast_ink/view_tree_host_root_view.cc b/ash/fast_ink/view_tree_host_root_view.cc
index 325c015..da5cfed 100644
--- a/ash/fast_ink/view_tree_host_root_view.cc
+++ b/ash/fast_ink/view_tree_host_root_view.cc
@@ -25,6 +25,7 @@
 #include "ui/aura/window.h"
 #include "ui/aura/window_observer.h"
 #include "ui/aura/window_tree_host.h"
+#include "ui/compositor/compositor.h"
 #include "ui/compositor/paint_context.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
diff --git a/ash/frame/default_frame_header_unittest.cc b/ash/frame/default_frame_header_unittest.cc
index 28b5ccf..2e19583 100644
--- a/ash/frame/default_frame_header_unittest.cc
+++ b/ash/frame/default_frame_header_unittest.cc
@@ -18,6 +18,7 @@
 #include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h"
 #include "chromeos/ui/frame/frame_header.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/gfx/animation/animation_test_api.h"
 #include "ui/gfx/color_utils.h"
diff --git a/ash/frame/header_view.cc b/ash/frame/header_view.cc
index 3d9f48d..30be384 100644
--- a/ash/frame/header_view.cc
+++ b/ash/frame/header_view.cc
@@ -17,6 +17,7 @@
 #include "chromeos/ui/frame/default_frame_header.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/base/ui_base_features.h"
+#include "ui/compositor/layer.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/metadata/metadata_impl_macros.h"
 #include "ui/views/widget/widget.h"
diff --git a/ash/frame/non_client_frame_view_ash_unittest.cc b/ash/frame/non_client_frame_view_ash_unittest.cc
index b1b0f64e..939a01bf 100644
--- a/ash/frame/non_client_frame_view_ash_unittest.cc
+++ b/ash/frame/non_client_frame_view_ash_unittest.cc
@@ -34,6 +34,7 @@
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/base/accelerators/test_accelerator_target.h"
 #include "ui/base/ui_base_features.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/test/draw_waiter_for_test.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/gfx/geometry/rect.h"
diff --git a/ash/frame_throttler/frame_throttling_controller.cc b/ash/frame_throttler/frame_throttling_controller.cc
index cbb8ba2..f8f124ed 100644
--- a/ash/frame_throttler/frame_throttling_controller.cc
+++ b/ash/frame_throttler/frame_throttling_controller.cc
@@ -17,6 +17,7 @@
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_tree_host.h"
+#include "ui/compositor/compositor.h"
 
 namespace ash {
 
diff --git a/ash/highlighter/highlighter_result_view.cc b/ash/highlighter/highlighter_result_view.cc
index f396601d..e2811b5 100644
--- a/ash/highlighter/highlighter_result_view.cc
+++ b/ash/highlighter/highlighter_result_view.cc
@@ -12,6 +12,7 @@
 #include "ash/shell.h"
 #include "base/bind.h"
 #include "base/timer/timer.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/paint_recorder.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/geometry/rect_conversions.h"
diff --git a/ash/highlighter/highlighter_view.cc b/ash/highlighter/highlighter_view.cc
index fd67e03..0944fde 100644
--- a/ash/highlighter/highlighter_view.cc
+++ b/ash/highlighter/highlighter_view.cc
@@ -14,6 +14,7 @@
 #include "third_party/skia/include/core/SkColor.h"
 #include "third_party/skia/include/core/SkTypes.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/gfx/canvas.h"
diff --git a/ash/hud_display/fps_graph_page_view.cc b/ash/hud_display/fps_graph_page_view.cc
index 9628ea6..fd65896 100644
--- a/ash/hud_display/fps_graph_page_view.cc
+++ b/ash/hud_display/fps_graph_page_view.cc
@@ -14,6 +14,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "ui/aura/window_tree_host.h"
+#include "ui/compositor/compositor.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/presentation_feedback.h"
 #include "ui/views/metadata/metadata_impl_macros.h"
diff --git a/ash/hud_display/hud_display.cc b/ash/hud_display/hud_display.cc
index d9ba5e54..41640cb 100644
--- a/ash/hud_display/hud_display.cc
+++ b/ash/hud_display/hud_display.cc
@@ -20,6 +20,7 @@
 #include "components/vector_icons/vector_icons.h"
 #include "ui/aura/window.h"
 #include "ui/base/hit_test.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/views/background.h"
 #include "ui/views/border.h"
diff --git a/ash/in_session_auth/auth_dialog_contents_view.cc b/ash/in_session_auth/auth_dialog_contents_view.cc
index dae5553..8760fcae 100644
--- a/ash/in_session_auth/auth_dialog_contents_view.cc
+++ b/ash/in_session_auth/auth_dialog_contents_view.cc
@@ -24,6 +24,7 @@
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/background.h"
 #include "ui/views/bubble/bubble_border.h"
diff --git a/ash/keyboard/ui/container_floating_behavior.cc b/ash/keyboard/ui/container_floating_behavior.cc
index cd347523..8375176 100644
--- a/ash/keyboard/ui/container_floating_behavior.cc
+++ b/ash/keyboard/ui/container_floating_behavior.cc
@@ -10,6 +10,7 @@
 #include "ash/keyboard/ui/drag_descriptor.h"
 #include "base/optional.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/display.h"
 #include "ui/events/event.h"
diff --git a/ash/keyboard/ui/container_full_width_behavior.cc b/ash/keyboard/ui/container_full_width_behavior.cc
index 1135c13..f7d3a1e 100644
--- a/ash/keyboard/ui/container_full_width_behavior.cc
+++ b/ash/keyboard/ui/container_full_width_behavior.cc
@@ -5,6 +5,7 @@
 #include "ash/keyboard/ui/container_full_width_behavior.h"
 
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/transform.h"
 #include "ui/wm/core/window_animations.h"
diff --git a/ash/keyboard/ui/keyboard_ui_controller.cc b/ash/keyboard/ui/keyboard_ui_controller.cc
index 564c895..0899db0 100644
--- a/ash/keyboard/ui/keyboard_ui_controller.cc
+++ b/ash/keyboard/ui/keyboard_ui_controller.cc
@@ -36,6 +36,7 @@
 #include "ui/base/hit_test.h"
 #include "ui/base/ime/text_input_client.h"
 #include "ui/base/ime/text_input_flags.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/types/display_constants.h"
diff --git a/ash/keyboard/ui/keyboard_ui_controller_unittest.cc b/ash/keyboard/ui/keyboard_ui_controller_unittest.cc
index 9d1fe16..8a8a8832 100644
--- a/ash/keyboard/ui/keyboard_ui_controller_unittest.cc
+++ b/ash/keyboard/ui/keyboard_ui_controller_unittest.cc
@@ -34,6 +34,7 @@
 #include "ui/base/ime/text_input_client.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/compositor/compositor.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_type.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/compositor/test/layer_animator_test_controller.h"
diff --git a/ash/login/login_screen_test_api.cc b/ash/login/login_screen_test_api.cc
index ba3877fb..ea7ee43 100644
--- a/ash/login/login_screen_test_api.cc
+++ b/ash/login/login_screen_test_api.cc
@@ -28,6 +28,7 @@
 #include "base/check.h"
 #include "base/run_loop.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/views/controls/button/label_button.h"
diff --git a/ash/login/ui/access_code_input.cc b/ash/login/ui/access_code_input.cc
index 283a78f3..c514209 100644
--- a/ash/login/ui/access_code_input.cc
+++ b/ash/login/ui/access_code_input.cc
@@ -13,6 +13,7 @@
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/keycodes/dom/dom_code.h"
 #include "ui/gfx/range/range.h"
 #include "ui/views/accessibility/view_accessibility.h"
diff --git a/ash/login/ui/arrow_button_view.cc b/ash/login/ui/arrow_button_view.cc
index 08082135..2dde716 100644
--- a/ash/login/ui/arrow_button_view.cc
+++ b/ash/login/ui/arrow_button_view.cc
@@ -11,6 +11,7 @@
 #include "base/time/time.h"
 #include "cc/paint/paint_flags.h"
 #include "ui/accessibility/ax_node_data.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/animation/multi_animation.h"
 #include "ui/gfx/animation/tween.h"
 #include "ui/gfx/canvas.h"
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc
index ee8dccd9..d0a7ff2 100644
--- a/ash/login/ui/lock_contents_view.cc
+++ b/ash/login/ui/lock_contents_view.cc
@@ -63,6 +63,7 @@
 #include "ui/base/user_activity/user_activity_detector.h"
 #include "ui/base/user_activity/user_activity_observer.h"
 #include "ui/chromeos/devicetype_utils.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/display.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/manager/managed_display_info.h"
diff --git a/ash/login/ui/lock_screen_media_controls_view.cc b/ash/login/ui/lock_screen_media_controls_view.cc
index f08c994e..ef7068d2 100644
--- a/ash/login/ui/lock_screen_media_controls_view.cc
+++ b/ash/login/ui/lock_screen_media_controls_view.cc
@@ -25,6 +25,7 @@
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/font.h"
 #include "ui/gfx/font_list.h"
diff --git a/ash/login/ui/lock_screen_media_controls_view_unittest.cc b/ash/login/ui/lock_screen_media_controls_view_unittest.cc
index 9dbbeddb..5fdc575 100644
--- a/ash/login/ui/lock_screen_media_controls_view_unittest.cc
+++ b/ash/login/ui/lock_screen_media_controls_view_unittest.cc
@@ -19,6 +19,7 @@
 #include "services/media_session/public/cpp/test/test_media_controller.h"
 #include "services/media_session/public/mojom/media_session.mojom.h"
 #include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/gfx/paint_vector_icon.h"
diff --git a/ash/login/ui/login_auth_user_view.cc b/ash/login/ui/login_auth_user_view.cc
index dbfa967..ae2460c 100644
--- a/ash/login/ui/login_auth_user_view.cc
+++ b/ash/login/ui/login_auth_user_view.cc
@@ -44,6 +44,7 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/compositor/callback_layer_animation_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_sequence.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
diff --git a/ash/login/ui/login_big_user_view.cc b/ash/login/ui/login_big_user_view.cc
index bc37837..860407c 100644
--- a/ash/login/ui/login_big_user_view.cc
+++ b/ash/login/ui/login_big_user_view.cc
@@ -9,6 +9,7 @@
 #include "ash/style/default_color_constants.h"
 #include "ash/wallpaper/wallpaper_controller_impl.h"
 #include "components/account_id/account_id.h"
+#include "ui/compositor/layer.h"
 #include "ui/views/background.h"
 #include "ui/views/layout/fill_layout.h"
 
diff --git a/ash/login/ui/login_expanded_public_account_view.cc b/ash/login/ui/login_expanded_public_account_view.cc
index f07444e..51df61ac 100644
--- a/ash/login/ui/login_expanded_public_account_view.cc
+++ b/ash/login/ui/login_expanded_public_account_view.cc
@@ -28,6 +28,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/vector_icons/vector_icons.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/border.h"
diff --git a/ash/login/ui/login_password_view.cc b/ash/login/ui/login_password_view.cc
index 5f93f98..3010ec0 100644
--- a/ash/login/ui/login_password_view.cc
+++ b/ash/login/ui/login_password_view.cc
@@ -23,6 +23,7 @@
 #include "base/timer/timer.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/layer_animation_sequence.h"
 #include "ui/events/event_constants.h"
diff --git a/ash/login/ui/login_public_account_user_view.cc b/ash/login/ui/login_public_account_user_view.cc
index 96ea7b86..3b225300 100644
--- a/ash/login/ui/login_public_account_user_view.cc
+++ b/ash/login/ui/login_public_account_user_view.cc
@@ -11,6 +11,7 @@
 #include "ash/login/ui/login_display_style.h"
 #include "ash/login/ui/views_utils.h"
 #include "base/bind.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/views/layout/box_layout.h"
 
diff --git a/ash/login/ui/login_public_account_user_view_unittest.cc b/ash/login/ui/login_public_account_user_view_unittest.cc
index c0772c0d..0e12dab5 100644
--- a/ash/login/ui/login_public_account_user_view_unittest.cc
+++ b/ash/login/ui/login_public_account_user_view_unittest.cc
@@ -7,6 +7,7 @@
 #include "ash/login/ui/login_test_utils.h"
 #include "ash/login/ui/login_user_view.h"
 #include "base/bind.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/widget/widget.h"
diff --git a/ash/login/ui/login_user_view.cc b/ash/login/ui/login_user_view.cc
index 9483e20..8b7fff3 100644
--- a/ash/login/ui/login_user_view.cc
+++ b/ash/login/ui/login_user_view.cc
@@ -27,6 +27,7 @@
 #include "components/user_manager/user_type.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_sequence.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
diff --git a/ash/login/ui/pin_request_view.cc b/ash/login/ui/pin_request_view.cc
index 24e8f59..d031a9b 100644
--- a/ash/login/ui/pin_request_view.cc
+++ b/ash/login/ui/pin_request_view.cc
@@ -16,6 +16,7 @@
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_analysis.h"
 #include "ui/gfx/color_utils.h"
diff --git a/ash/login/ui/scrollable_users_list_view.cc b/ash/login/ui/scrollable_users_list_view.cc
index feb1ffd9..62a49748 100644
--- a/ash/login/ui/scrollable_users_list_view.cc
+++ b/ash/login/ui/scrollable_users_list_view.cc
@@ -20,6 +20,7 @@
 #include "base/numerics/ranges.h"
 #include "base/optional.h"
 #include "base/timer/timer.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/canvas.h"
diff --git a/ash/login/ui/system_label_button.cc b/ash/login/ui/system_label_button.cc
index b5a85075..78f98661 100644
--- a/ash/login/ui/system_label_button.cc
+++ b/ash/login/ui/system_label_button.cc
@@ -7,6 +7,7 @@
 #include "ash/public/cpp/shelf_config.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/style/ash_color_provider.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/color_utils.h"
diff --git a/ash/media/media_notification_container_impl.cc b/ash/media/media_notification_container_impl.cc
index fdb223b..bd83ef1c 100644
--- a/ash/media/media_notification_container_impl.cc
+++ b/ash/media/media_notification_container_impl.cc
@@ -6,6 +6,7 @@
 
 #include "components/media_message_center/media_notification_view_impl.h"
 #include "components/media_message_center/media_session_notification_item.h"
+#include "ui/compositor/layer.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/public/cpp/message_center_constants.h"
 #include "ui/message_center/views/notification_control_buttons_view.h"
diff --git a/ash/multi_user/user_switch_animator.cc b/ash/multi_user/user_switch_animator.cc
index 6908ab8..14a8ea9f 100644
--- a/ash/multi_user/user_switch_animator.cc
+++ b/ash/multi_user/user_switch_animator.cc
@@ -16,6 +16,7 @@
 #include "ash/wm/window_positioner.h"
 #include "base/bind.h"
 #include "ui/aura/client/aura_constants.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/layer_tree_owner.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
diff --git a/ash/perftests/ash_background_filter_blur_perftest.cc b/ash/perftests/ash_background_filter_blur_perftest.cc
index 1bbdf3a5..287bc7a 100644
--- a/ash/perftests/ash_background_filter_blur_perftest.cc
+++ b/ash/perftests/ash_background_filter_blur_perftest.cc
@@ -9,6 +9,7 @@
 #include "base/timer/lap_timer.h"
 #include "testing/perf/perf_test.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/test/draw_waiter_for_test.h"
 
 namespace ash {
diff --git a/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc b/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc
index 57d23227..d373e7db0 100644
--- a/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc
+++ b/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc
@@ -9,7 +9,6 @@
 #include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/external_arc/message_center/arc_notification_surface.h"
 #include "ash/public/cpp/external_arc/message_center/arc_notification_view.h"
-// TODO(https://crbug.com/768439): Remove nogncheck when moved to ash.
 #include "base/auto_reset.h"
 #include "base/metrics/histogram_macros.h"
 #include "components/arc/metrics/arc_metrics_constants.h"
@@ -18,6 +17,7 @@
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/layer_tree_owner.h"
 #include "ui/events/event_handler.h"
diff --git a/ash/public/cpp/external_arc/message_center/arc_notification_view_unittest.cc b/ash/public/cpp/external_arc/message_center/arc_notification_view_unittest.cc
index 4841cc49..f69232a 100644
--- a/ash/public/cpp/external_arc/message_center/arc_notification_view_unittest.cc
+++ b/ash/public/cpp/external_arc/message_center/arc_notification_view_unittest.cc
@@ -22,6 +22,7 @@
 #include "ui/base/ime/dummy_text_input_client.h"
 #include "ui/base/ime/input_method.h"
 #include "ui/base/ime/text_input_client.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/events/event.h"
 #include "ui/events/event_utils.h"
diff --git a/ash/public/cpp/holding_space/holding_space_image.cc b/ash/public/cpp/holding_space/holding_space_image.cc
index c5ff720..981a46a 100644
--- a/ash/public/cpp/holding_space/holding_space_image.cc
+++ b/ash/public/cpp/holding_space/holding_space_image.cc
@@ -114,6 +114,7 @@
 gfx::Size HoldingSpaceImage::GetMaxSizeForType(HoldingSpaceItem::Type type) {
   gfx::Size size;
   switch (type) {
+    case HoldingSpaceItem::Type::kArcDownload:
     case HoldingSpaceItem::Type::kDownload:
     case HoldingSpaceItem::Type::kNearbyShare:
     case HoldingSpaceItem::Type::kPinnedFile:
diff --git a/ash/public/cpp/holding_space/holding_space_item.cc b/ash/public/cpp/holding_space/holding_space_item.cc
index 46e161a..b5212cf 100644
--- a/ash/public/cpp/holding_space/holding_space_item.cc
+++ b/ash/public/cpp/holding_space/holding_space_item.cc
@@ -145,12 +145,13 @@
 
 bool HoldingSpaceItem::IsScreenCapture() const {
   switch (type_) {
-    case HoldingSpaceItem::Type::kScreenshot:
-    case HoldingSpaceItem::Type::kScreenRecording:
+    case Type::kScreenRecording:
+    case Type::kScreenshot:
       return true;
-    case HoldingSpaceItem::Type::kDownload:
-    case HoldingSpaceItem::Type::kNearbyShare:
-    case HoldingSpaceItem::Type::kPinnedFile:
+    case Type::kArcDownload:
+    case Type::kDownload:
+    case Type::kNearbyShare:
+    case Type::kPinnedFile:
       return false;
   }
 }
diff --git a/ash/public/cpp/holding_space/holding_space_item.h b/ash/public/cpp/holding_space/holding_space_item.h
index 358bcf4..ae8c26fb 100644
--- a/ash/public/cpp/holding_space/holding_space_item.h
+++ b/ash/public/cpp/holding_space/holding_space_item.h
@@ -36,7 +36,8 @@
     kDownload = 2,
     kNearbyShare = 3,
     kScreenRecording = 4,
-    kMaxValue = kScreenRecording,
+    kArcDownload = 5,
+    kMaxValue = kArcDownload,
   };
 
   HoldingSpaceItem(const HoldingSpaceItem&) = delete;
diff --git a/ash/public/cpp/holding_space/holding_space_metrics.cc b/ash/public/cpp/holding_space/holding_space_metrics.cc
index a6de74b3..acb3a76 100644
--- a/ash/public/cpp/holding_space/holding_space_metrics.cc
+++ b/ash/public/cpp/holding_space/holding_space_metrics.cc
@@ -85,6 +85,8 @@
 // values are persisted to histograms so should remain unchanged.
 std::string ItemTypeToString(HoldingSpaceItem::Type type) {
   switch (type) {
+    case HoldingSpaceItem::Type::kArcDownload:
+      return "ArcDownload";
     case HoldingSpaceItem::Type::kDownload:
       return "Download";
     case HoldingSpaceItem::Type::kPinnedFile:
diff --git a/ash/public/cpp/holding_space/holding_space_test_api.h b/ash/public/cpp/holding_space/holding_space_test_api.h
index 0c9f6bb3..2bd64a21 100644
--- a/ash/public/cpp/holding_space/holding_space_test_api.h
+++ b/ash/public/cpp/holding_space/holding_space_test_api.h
@@ -5,6 +5,7 @@
 #ifndef ASH_PUBLIC_CPP_HOLDING_SPACE_HOLDING_SPACE_TEST_API_H_
 #define ASH_PUBLIC_CPP_HOLDING_SPACE_HOLDING_SPACE_TEST_API_H_
 
+#include <string>
 #include <vector>
 
 #include "ash/ash_export.h"
@@ -46,6 +47,16 @@
   // otherwise.
   bool IsShowingInShelf();
 
+  // Returns the `item_id` associated with the given `item_view`.
+  const std::string& GetHoldingSpaceItemId(const views::View* item_view) const;
+
+  // Returns the holding space item view within `item_views` associated with the
+  // specified `item_id`. If no associated holding space item view exists,
+  // `nullptr` is returned.
+  views::View* GetHoldingSpaceItemView(
+      const std::vector<views::View*>& item_views,
+      const std::string& item_id);
+
   // Returns the header of the downloads section in holding space UI.
   views::View* GetDownloadsSectionHeader();
 
diff --git a/ash/session/fullscreen_alert_bubble.cc b/ash/session/fullscreen_alert_bubble.cc
index b091502..812c024 100644
--- a/ash/session/fullscreen_alert_bubble.cc
+++ b/ash/session/fullscreen_alert_bubble.cc
@@ -19,6 +19,7 @@
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/event.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/views/background.h"
diff --git a/ash/shelf/back_button_unittest.cc b/ash/shelf/back_button_unittest.cc
index bd97ed1..f1ca631 100644
--- a/ash/shelf/back_button_unittest.cc
+++ b/ash/shelf/back_button_unittest.cc
@@ -23,6 +23,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/base/accelerators/test_accelerator_target.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/test/event_generator.h"
 
 namespace ash {
diff --git a/ash/shelf/contextual_nudge.cc b/ash/shelf/contextual_nudge.cc
index 15025c33..e5af3ee4 100644
--- a/ash/shelf/contextual_nudge.cc
+++ b/ash/shelf/contextual_nudge.cc
@@ -10,6 +10,7 @@
 #include "ash/system/tray/tray_constants.h"
 #include "ash/wm/collision_detection/collision_detection_utils.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/views/border.h"
diff --git a/ash/shelf/drag_handle.cc b/ash/shelf/drag_handle.cc
index 10eb2da..0e2f2d8 100644
--- a/ash/shelf/drag_handle.cc
+++ b/ash/shelf/drag_handle.cc
@@ -19,6 +19,7 @@
 #include "base/timer/timer.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/wm/core/coordinate_conversion.h"
 
diff --git a/ash/shelf/drag_window_from_shelf_controller.cc b/ash/shelf/drag_window_from_shelf_controller.cc
index e3483d8..792fbdd4 100644
--- a/ash/shelf/drag_window_from_shelf_controller.cc
+++ b/ash/shelf/drag_window_from_shelf_controller.cc
@@ -37,6 +37,7 @@
 #include "base/numerics/ranges.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/hit_test.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/screen.h"
diff --git a/ash/shelf/drag_window_from_shelf_controller_unittest.cc b/ash/shelf/drag_window_from_shelf_controller_unittest.cc
index 7bda8b9..010deab 100644
--- a/ash/shelf/drag_window_from_shelf_controller_unittest.cc
+++ b/ash/shelf/drag_window_from_shelf_controller_unittest.cc
@@ -31,6 +31,7 @@
 #include "ash/wm/window_state.h"
 #include "ash/wm/window_util.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/gfx/geometry/point_f.h"
 #include "ui/views/widget/widget.h"
diff --git a/ash/shelf/home_button_unittest.cc b/ash/shelf/home_button_unittest.cc
index 5ff42553..5c807b45 100644
--- a/ash/shelf/home_button_unittest.cc
+++ b/ash/shelf/home_button_unittest.cc
@@ -31,6 +31,7 @@
 #include "base/command_line.h"
 #include "base/run_loop.h"
 #include "base/test/scoped_feature_list.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/views/animation/bounds_animator.h"
diff --git a/ash/shelf/login_shelf_gesture_controller_unittest.cc b/ash/shelf/login_shelf_gesture_controller_unittest.cc
index 7dd5179..f54c460 100644
--- a/ash/shelf/login_shelf_gesture_controller_unittest.cc
+++ b/ash/shelf/login_shelf_gesture_controller_unittest.cc
@@ -12,6 +12,7 @@
 #include "ash/shell.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller_test_api.h"
 #include "base/callback_helpers.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 
 namespace ash {
diff --git a/ash/shelf/shelf_container_view.cc b/ash/shelf/shelf_container_view.cc
index bf07f6bb1..e6eb05b 100644
--- a/ash/shelf/shelf_container_view.cc
+++ b/ash/shelf/shelf_container_view.cc
@@ -5,6 +5,7 @@
 #include "ash/shelf/shelf_container_view.h"
 
 #include "ash/public/cpp/shelf_config.h"
+#include "ui/compositor/layer.h"
 
 namespace ash {
 
diff --git a/ash/shelf/shelf_navigation_widget.cc b/ash/shelf/shelf_navigation_widget.cc
index 09c28a4..33ff91e 100644
--- a/ash/shelf/shelf_navigation_widget.cc
+++ b/ash/shelf/shelf_navigation_widget.cc
@@ -24,6 +24,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/animation_throughput_reporter.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
diff --git a/ash/shelf/shelf_widget_unittest.cc b/ash/shelf/shelf_widget_unittest.cc
index bfb512f..b06804c 100644
--- a/ash/shelf/shelf_widget_unittest.cc
+++ b/ash/shelf/shelf_widget_unittest.cc
@@ -32,6 +32,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "components/session_manager/session_manager_types.h"
 #include "ui/aura/window_event_dispatcher.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/display/display.h"
 #include "ui/events/event_utils.h"
diff --git a/ash/shelf/swipe_home_to_overview_controller_unittest.cc b/ash/shelf/swipe_home_to_overview_controller_unittest.cc
index abc0fbc..ed04c0cc 100644
--- a/ash/shelf/swipe_home_to_overview_controller_unittest.cc
+++ b/ash/shelf/swipe_home_to_overview_controller_unittest.cc
@@ -23,6 +23,7 @@
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/simple_test_tick_clock.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/compositor/test/test_utils.h"
 #include "ui/gfx/geometry/point_f.h"
diff --git a/ash/shelf/test/widget_animation_smoothness_inspector.cc b/ash/shelf/test/widget_animation_smoothness_inspector.cc
index 97fa642..7aa7597 100644
--- a/ash/shelf/test/widget_animation_smoothness_inspector.cc
+++ b/ash/shelf/test/widget_animation_smoothness_inspector.cc
@@ -5,6 +5,7 @@
 #include "ash/shelf/test/widget_animation_smoothness_inspector.h"
 
 #include "base/strings/stringprintf.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_sequence.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/views/widget/widget.h"
diff --git a/ash/shelf/test/widget_animation_waiter.cc b/ash/shelf/test/widget_animation_waiter.cc
index a748892..ec5cc3ba 100644
--- a/ash/shelf/test/widget_animation_waiter.cc
+++ b/ash/shelf/test/widget_animation_waiter.cc
@@ -5,6 +5,7 @@
 #include "ash/shelf/test/widget_animation_waiter.h"
 
 #include "ash/test/ash_test_base.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_delegate.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/views/widget/widget.h"
diff --git a/ash/shell_test_api.cc b/ash/shell_test_api.cc
index c959428..87a3760a 100644
--- a/ash/shell_test_api.cc
+++ b/ash/shell_test_api.cc
@@ -29,6 +29,7 @@
 #include "ui/aura/window_tree_host.h"
 #include "ui/compositor/compositor.h"
 #include "ui/compositor/compositor_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/events/devices/device_data_manager_test_api.h"
diff --git a/ash/shortcut_viewer/views/keyboard_shortcut_view.cc b/ash/shortcut_viewer/views/keyboard_shortcut_view.cc
index 0972fe5f..67cec64 100644
--- a/ash/shortcut_viewer/views/keyboard_shortcut_view.cc
+++ b/ash/shortcut_viewer/views/keyboard_shortcut_view.cc
@@ -40,6 +40,7 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/chromeos/events/keyboard_layout_util.h"
+#include "ui/compositor/compositor.h"
 #include "ui/events/event_constants.h"
 #include "ui/events/types/event_type.h"
 #include "ui/gfx/paint_vector_icon.h"
diff --git a/ash/system/accessibility/autoclick_scroll_bubble_controller.cc b/ash/system/accessibility/autoclick_scroll_bubble_controller.cc
index e76a204..072f5b8f5 100644
--- a/ash/system/accessibility/autoclick_scroll_bubble_controller.cc
+++ b/ash/system/accessibility/autoclick_scroll_bubble_controller.cc
@@ -15,6 +15,7 @@
 #include "ash/wm/workspace/workspace_layout_manager.h"
 #include "ash/wm/workspace_controller.h"
 #include "ui/aura/window_tree_host.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/events/event_utils.h"
 
diff --git a/ash/system/accessibility/autoclick_scroll_view.cc b/ash/system/accessibility/autoclick_scroll_view.cc
index 933bc0b..1c583557 100644
--- a/ash/system/accessibility/autoclick_scroll_view.cc
+++ b/ash/system/accessibility/autoclick_scroll_view.cc
@@ -17,6 +17,7 @@
 #include "base/metrics/user_metrics.h"
 #include "base/timer/timer.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/gfx/vector_icon_types.h"
diff --git a/ash/system/accessibility/floating_accessibility_controller.cc b/ash/system/accessibility/floating_accessibility_controller.cc
index 4ba63e6..90079cce 100644
--- a/ash/system/accessibility/floating_accessibility_controller.cc
+++ b/ash/system/accessibility/floating_accessibility_controller.cc
@@ -17,6 +17,7 @@
 #include "base/check.h"
 #include "base/notreached.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 
 namespace ash {
diff --git a/ash/system/accessibility/floating_accessibility_detailed_controller.cc b/ash/system/accessibility/floating_accessibility_detailed_controller.cc
index 0b779f97..c6032b9 100644
--- a/ash/system/accessibility/floating_accessibility_detailed_controller.cc
+++ b/ash/system/accessibility/floating_accessibility_detailed_controller.cc
@@ -14,6 +14,7 @@
 #include "ash/system/tray/tray_constants.h"
 #include "ash/wm/collision_detection/collision_detection_utils.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/controls/button/image_button.h"
diff --git a/ash/system/accessibility/select_to_speak_menu_bubble_controller.cc b/ash/system/accessibility/select_to_speak_menu_bubble_controller.cc
index df5f506..a9fc72a0 100644
--- a/ash/system/accessibility/select_to_speak_menu_bubble_controller.cc
+++ b/ash/system/accessibility/select_to_speak_menu_bubble_controller.cc
@@ -14,6 +14,7 @@
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/unified/unified_system_tray_view.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/wm/public/activation_client.h"
 
 namespace ash {
@@ -154,4 +155,4 @@
       SelectToSpeakPanelAction::kChangeSpeed, /*value=*/speech_rate);
 }
 
-}  // namespace ash
\ No newline at end of file
+}  // namespace ash
diff --git a/ash/system/accessibility/select_to_speak_speed_bubble_controller.cc b/ash/system/accessibility/select_to_speak_speed_bubble_controller.cc
index 4463c66..cbe045c3 100644
--- a/ash/system/accessibility/select_to_speak_speed_bubble_controller.cc
+++ b/ash/system/accessibility/select_to_speak_speed_bubble_controller.cc
@@ -14,6 +14,7 @@
 #include "ash/system/tray/tray_background_view.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/unified/unified_system_tray_view.h"
+#include "ui/compositor/layer.h"
 #include "ui/wm/public/activation_client.h"
 
 namespace ash {
@@ -115,4 +116,4 @@
   delegate_->OnSpeechRateSelected(speech_rate);
 }
 
-}  // namespace ash
\ No newline at end of file
+}  // namespace ash
diff --git a/ash/system/accessibility/switch_access_back_button_bubble_controller.cc b/ash/system/accessibility/switch_access_back_button_bubble_controller.cc
index e8a85ab..571936d 100644
--- a/ash/system/accessibility/switch_access_back_button_bubble_controller.cc
+++ b/ash/system/accessibility/switch_access_back_button_bubble_controller.cc
@@ -10,6 +10,7 @@
 #include "ash/system/tray/tray_background_view.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 
diff --git a/ash/system/accessibility/switch_access_menu_bubble_controller.cc b/ash/system/accessibility/switch_access_menu_bubble_controller.cc
index aa6b83a4..6b268707 100644
--- a/ash/system/accessibility/switch_access_menu_bubble_controller.cc
+++ b/ash/system/accessibility/switch_access_menu_bubble_controller.cc
@@ -13,6 +13,7 @@
 #include "ash/system/unified/unified_system_tray_view.h"
 #include "ash/wm/collision_detection/collision_detection_utils.h"
 #include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/compositor/layer.h"
 
 namespace ash {
 
diff --git a/ash/system/holding_space/downloads_section.cc b/ash/system/holding_space/downloads_section.cc
index 25e772c..55eddf1 100644
--- a/ash/system/holding_space/downloads_section.cc
+++ b/ash/system/holding_space/downloads_section.cc
@@ -17,6 +17,7 @@
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/controls/button/button.h"
@@ -128,7 +129,8 @@
 DownloadsSection::DownloadsSection(HoldingSpaceItemViewDelegate* delegate)
     : HoldingSpaceItemViewsSection(delegate,
                                    /*supported_types=*/
-                                   {HoldingSpaceItem::Type::kDownload,
+                                   {HoldingSpaceItem::Type::kArcDownload,
+                                    HoldingSpaceItem::Type::kDownload,
                                     HoldingSpaceItem::Type::kNearbyShare},
                                    /*max_count=*/kMaxDownloads) {}
 
diff --git a/ash/system/holding_space/holding_space_drag_util.cc b/ash/system/holding_space/holding_space_drag_util.cc
index c4b7eda..ff99388 100644
--- a/ash/system/holding_space/holding_space_drag_util.cc
+++ b/ash/system/holding_space/holding_space_drag_util.cc
@@ -17,6 +17,7 @@
 #include "base/containers/adapters.h"
 #include "base/i18n/rtl.h"
 #include "ui/compositor/canvas_painter.h"
+#include "ui/compositor/compositor.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/image/image_skia.h"
 #include "ui/gfx/shadow_util.h"
diff --git a/ash/system/holding_space/holding_space_item_chip_view.cc b/ash/system/holding_space/holding_space_item_chip_view.cc
index f5a0678..15d5b8d6 100644
--- a/ash/system/holding_space/holding_space_item_chip_view.cc
+++ b/ash/system/holding_space/holding_space_item_chip_view.cc
@@ -13,6 +13,7 @@
 #include "ash/system/holding_space/holding_space_item_view.h"
 #include "ash/system/holding_space/holding_space_item_view_delegate.h"
 #include "ash/system/holding_space/holding_space_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_owner.h"
 #include "ui/compositor/paint_recorder.h"
 #include "ui/gfx/scoped_canvas.h"
diff --git a/ash/system/holding_space/holding_space_item_view.cc b/ash/system/holding_space/holding_space_item_view.cc
index c6196c93..14d3a31 100644
--- a/ash/system/holding_space/holding_space_item_view.cc
+++ b/ash/system/holding_space/holding_space_item_view.cc
@@ -16,6 +16,7 @@
 #include "base/bind.h"
 #include "ui/base/class_property.h"
 #include "ui/base/dragdrop/drag_drop_types.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/paint_vector_icon.h"
@@ -133,12 +134,19 @@
 
 // static
 HoldingSpaceItemView* HoldingSpaceItemView::Cast(views::View* view) {
-  DCHECK(HoldingSpaceItemView::IsInstance(view));
-  return static_cast<HoldingSpaceItemView*>(view);
+  return const_cast<HoldingSpaceItemView*>(
+      Cast(const_cast<const views::View*>(view)));
 }
 
 // static
-bool HoldingSpaceItemView::IsInstance(views::View* view) {
+const HoldingSpaceItemView* HoldingSpaceItemView::Cast(
+    const views::View* view) {
+  DCHECK(HoldingSpaceItemView::IsInstance(view));
+  return static_cast<const HoldingSpaceItemView*>(view);
+}
+
+// static
+bool HoldingSpaceItemView::IsInstance(const views::View* view) {
   return view->GetProperty(kIsHoldingSpaceItemViewProperty);
 }
 
diff --git a/ash/system/holding_space/holding_space_item_view.h b/ash/system/holding_space/holding_space_item_view.h
index d644d4bd..84ae8c0 100644
--- a/ash/system/holding_space/holding_space_item_view.h
+++ b/ash/system/holding_space/holding_space_item_view.h
@@ -42,9 +42,10 @@
   // Returns `view` cast as a `HoldingSpaceItemView`. Note that this performs a
   // DCHECK to assert that `view` is in fact a `HoldingSpaceItemView` instance.
   static HoldingSpaceItemView* Cast(views::View* view);
+  static const HoldingSpaceItemView* Cast(const views::View* view);
 
   // Returns if `view` is an instance of `HoldingSpaceItemView`.
-  static bool IsInstance(views::View* view);
+  static bool IsInstance(const views::View* view);
 
   // Resets the view. Called when the tray bubble starts closing to ensure
   // that any references that may be outlived are cleared out.
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 60ab4ef..9015dbf 100644
--- a/ash/system/holding_space/holding_space_item_views_section.cc
+++ b/ash/system/holding_space/holding_space_item_views_section.cc
@@ -13,6 +13,7 @@
 #include "base/auto_reset.h"
 #include "base/callback_helpers.h"
 #include "ui/compositor/callback_layer_animation_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/views/accessibility/view_accessibility.h"
diff --git a/ash/system/holding_space/holding_space_test_api.cc b/ash/system/holding_space/holding_space_test_api.cc
index 526ee76f..11183ed 100644
--- a/ash/system/holding_space/holding_space_test_api.cc
+++ b/ash/system/holding_space/holding_space_test_api.cc
@@ -6,12 +6,14 @@
 
 #include "ash/drag_drop/drag_drop_controller.h"
 #include "ash/public/cpp/holding_space/holding_space_constants.h"
+#include "ash/public/cpp/holding_space/holding_space_item.h"
 #include "ash/public/cpp/test/shell_test_api.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/system/holding_space/holding_space_item_chip_view.h"
 #include "ash/system/holding_space/holding_space_item_screen_capture_view.h"
+#include "ash/system/holding_space/holding_space_item_view.h"
 #include "ash/system/holding_space/holding_space_tray.h"
 #include "ash/system/status_area_widget.h"
 #include "ui/aura/window.h"
@@ -95,6 +97,22 @@
   return holding_space_tray_ && holding_space_tray_->GetVisible();
 }
 
+const std::string& HoldingSpaceTestApi::GetHoldingSpaceItemId(
+    const views::View* item_view) const {
+  return HoldingSpaceItemView::Cast(item_view)->item_id();
+}
+
+views::View* HoldingSpaceTestApi::GetHoldingSpaceItemView(
+    const std::vector<views::View*>& item_views,
+    const std::string& item_id) {
+  auto it = std::find_if(
+      item_views.begin(), item_views.end(), [&](const views::View* item_view) {
+        return !strcmp(HoldingSpaceItemView::Cast(item_view)->item_id().c_str(),
+                       item_id.c_str());
+      });
+  return it != item_views.end() ? *it : nullptr;
+}
+
 views::View* HoldingSpaceTestApi::GetDownloadsSectionHeader() {
   return holding_space_tray_->GetBubbleView()
              ? holding_space_tray_->GetBubbleView()->GetViewByID(
diff --git a/ash/system/holding_space/holding_space_tray.cc b/ash/system/holding_space/holding_space_tray.cc
index 2d3a9480..26d17e9 100644
--- a/ash/system/holding_space/holding_space_tray.cc
+++ b/ash/system/holding_space/holding_space_tray.cc
@@ -35,6 +35,7 @@
 #include "ui/base/dragdrop/drag_drop_types.h"
 #include "ui/base/dragdrop/mojom/drag_drop_types.mojom.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/animation/ink_drop.h"
diff --git a/ash/system/holding_space/holding_space_tray_bubble.cc b/ash/system/holding_space/holding_space_tray_bubble.cc
index 76c639f..2fbe5e0 100644
--- a/ash/system/holding_space/holding_space_tray_bubble.cc
+++ b/ash/system/holding_space/holding_space_tray_bubble.cc
@@ -24,6 +24,7 @@
 #include "base/containers/adapters.h"
 #include "ui/aura/env.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/compositor.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/gfx/animation/slide_animation.h"
 #include "ui/gfx/geometry/insets.h"
diff --git a/ash/system/holding_space/holding_space_tray_child_bubble.cc b/ash/system/holding_space/holding_space_tray_child_bubble.cc
index c3894d6..7e5e110 100644
--- a/ash/system/holding_space/holding_space_tray_child_bubble.cc
+++ b/ash/system/holding_space/holding_space_tray_child_bubble.cc
@@ -13,6 +13,7 @@
 #include "ash/system/holding_space/holding_space_util.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ui/compositor/callback_layer_animation_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/views/layout/box_layout.h"
diff --git a/ash/system/holding_space/holding_space_tray_icon.cc b/ash/system/holding_space/holding_space_tray_icon.cc
index 8b33aa429..ab9fc21 100644
--- a/ash/system/holding_space/holding_space_tray_icon.cc
+++ b/ash/system/holding_space/holding_space_tray_icon.cc
@@ -20,6 +20,7 @@
 #include "base/containers/unique_ptr_adapters.h"
 #include "base/stl_util.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/gfx/animation/slide_animation.h"
 #include "ui/gfx/paint_vector_icon.h"
diff --git a/ash/system/holding_space/holding_space_tray_unittest.cc b/ash/system/holding_space/holding_space_tray_unittest.cc
index fb5693f..4c10fbb 100644
--- a/ash/system/holding_space/holding_space_tray_unittest.cc
+++ b/ash/system/holding_space/holding_space_tray_unittest.cc
@@ -37,6 +37,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/gfx/image/image_skia.h"
@@ -865,9 +866,25 @@
   }
 }
 
+// Base class for tests of the holding space downloads section parameterized by
+// the set of holding space item types which are expected to appear there.
+class HoldingSpaceTrayDownloadsSectionTest
+    : public HoldingSpaceTrayTest,
+      public ::testing::WithParamInterface<HoldingSpaceItem::Type> {
+ public:
+  HoldingSpaceItem::Type GetType() const { return GetParam(); }
+};
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    HoldingSpaceTrayDownloadsSectionTest,
+    ::testing::Values(HoldingSpaceItem::Type::kArcDownload,
+                      HoldingSpaceItem::Type::kDownload,
+                      HoldingSpaceItem::Type::kNearbyShare));
+
 // Tests how download chips are updated during item addition, removal and
 // finalization.
-TEST_F(HoldingSpaceTrayTest, DownloadsSection) {
+TEST_P(HoldingSpaceTrayDownloadsSectionTest, DownloadsSection) {
   StartSession();
 
   test_api()->Show();
@@ -877,8 +894,7 @@
   EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
 
   // Add a download item and verify recent file bubble gets shown.
-  HoldingSpaceItem* item_1 =
-      AddItem(HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_1"));
+  HoldingSpaceItem* item_1 = AddItem(GetType(), base::FilePath("/tmp/fake_1"));
 
   EXPECT_TRUE(test_api()->PinnedFilesBubbleShown());
   EXPECT_TRUE(test_api()->RecentFilesBubbleShown());
@@ -889,8 +905,8 @@
 
   // Add partially initialized download item - verify it doesn't get shown in
   // the UI yet.
-  HoldingSpaceItem* item_2 = AddPartiallyInitializedItem(
-      HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_2"));
+  HoldingSpaceItem* item_2 =
+      AddPartiallyInitializedItem(GetType(), base::FilePath("/tmp/fake_2"));
 
   EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
   EXPECT_TRUE(test_api()->GetScreenCaptureViews().empty());
@@ -900,8 +916,7 @@
             HoldingSpaceItemView::Cast(download_chips[0])->item()->id());
 
   // Add another download, and verify it's shown in the UI.
-  HoldingSpaceItem* item_3 =
-      AddItem(HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_3"));
+  HoldingSpaceItem* item_3 = AddItem(GetType(), base::FilePath("/tmp/fake_3"));
 
   EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
   EXPECT_TRUE(test_api()->GetScreenCaptureViews().empty());
@@ -957,16 +972,16 @@
 
 // Verifies the downloads section is shown and orders items as expected when the
 // model contains a number of finalized items prior to showing UI.
-TEST_F(HoldingSpaceTrayTest, DownloadsSectionWithFinalizedItemsOnly) {
+TEST_P(HoldingSpaceTrayDownloadsSectionTest,
+       DownloadsSectionWithFinalizedItemsOnly) {
   MarkTimeOfFirstPin();
   StartSession();
 
   // Add a number of finalized download items.
   std::deque<HoldingSpaceItem*> items;
   for (size_t i = 0; i < kMaxDownloads; ++i) {
-    items.push_back(
-        AddItem(HoldingSpaceItem::Type::kDownload,
-                base::FilePath("/tmp/fake_" + base::NumberToString(i))));
+    items.push_back(AddItem(
+        GetType(), base::FilePath("/tmp/fake_" + base::NumberToString(i))));
   }
 
   test_api()->Show();
@@ -987,7 +1002,8 @@
   test_api()->Close();
 }
 
-TEST_F(HoldingSpaceTrayTest, FinalizingDownloadItemThatShouldBeInvisible) {
+TEST_P(HoldingSpaceTrayDownloadsSectionTest,
+       FinalizingDownloadItemThatShouldBeInvisible) {
   StartSession();
   test_api()->Show();
 
@@ -995,14 +1011,12 @@
 
   // Add partially initialized download item - verify it doesn't get shown in
   // the UI yet.
-  HoldingSpaceItem* item_1 = AddPartiallyInitializedItem(
-      HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_1"));
+  HoldingSpaceItem* item_1 =
+      AddPartiallyInitializedItem(GetType(), base::FilePath("/tmp/fake_1"));
 
   // Add two download items.
-  HoldingSpaceItem* item_2 =
-      AddItem(HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_2"));
-  HoldingSpaceItem* item_3 =
-      AddItem(HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_3"));
+  HoldingSpaceItem* item_2 = AddItem(GetType(), base::FilePath("/tmp/fake_2"));
+  HoldingSpaceItem* item_3 = AddItem(GetType(), base::FilePath("/tmp/fake_3"));
   EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
   EXPECT_TRUE(test_api()->GetScreenCaptureViews().empty());
   std::vector<views::View*> download_chips = test_api()->GetDownloadChips();
@@ -1040,7 +1054,8 @@
 
 // Tests that a partially initialized download item does not get shown if a full
 // download item gets removed from the holding space.
-TEST_F(HoldingSpaceTrayTest, PartialItemNowShownOnRemovingADownloadItem) {
+TEST_P(HoldingSpaceTrayDownloadsSectionTest,
+       PartialItemNowShownOnRemovingADownloadItem) {
   StartSession();
   test_api()->Show();
 
@@ -1048,14 +1063,11 @@
 
   // Add partially initialized download item - verify it doesn't get shown in
   // the UI yet.
-  AddPartiallyInitializedItem(HoldingSpaceItem::Type::kDownload,
-                              base::FilePath("/tmp/fake_1"));
+  AddPartiallyInitializedItem(GetType(), base::FilePath("/tmp/fake_1"));
 
   // Add two download items.
-  HoldingSpaceItem* item_2 =
-      AddItem(HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_2"));
-  HoldingSpaceItem* item_3 =
-      AddItem(HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_3"));
+  HoldingSpaceItem* item_2 = AddItem(GetType(), base::FilePath("/tmp/fake_2"));
+  HoldingSpaceItem* item_3 = AddItem(GetType(), base::FilePath("/tmp/fake_3"));
   EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
   EXPECT_TRUE(test_api()->GetScreenCaptureViews().empty());
   std::vector<views::View*> download_chips = test_api()->GetDownloadChips();
@@ -1502,194 +1514,6 @@
   test_api()->Close();
 }
 
-// Tests that as nearby shared files are added to the model, they show on the
-// downloads section.
-TEST_F(HoldingSpaceTrayTest, DownloadsSectionWithNearbySharedFiles) {
-  StartSession();
-
-  test_api()->Show();
-  EXPECT_TRUE(test_api()->PinnedFilesBubbleShown());
-  EXPECT_FALSE(test_api()->RecentFilesBubbleShown());
-
-  EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
-  ASSERT_TRUE(test_api()->GetDownloadChips().empty());
-
-  // Add a nearby share item and verify recent files bubble gets shown.
-  HoldingSpaceItem* item_1 = AddItem(HoldingSpaceItem::Type::kNearbyShare,
-                                     base::FilePath("/tmp/fake_1"));
-  ASSERT_TRUE(item_1->IsFinalized());
-
-  EXPECT_TRUE(test_api()->PinnedFilesBubbleShown());
-  EXPECT_TRUE(test_api()->RecentFilesBubbleShown());
-
-  EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
-  EXPECT_TRUE(test_api()->GetScreenCaptureViews().empty());
-  ASSERT_EQ(1u, test_api()->GetDownloadChips().size());
-
-  // Add a download item, and verify it's also shown in the UI in the order they
-  // were added.
-  HoldingSpaceItem* item_2 =
-      AddItem(HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_2"));
-
-  EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
-  EXPECT_TRUE(test_api()->GetScreenCaptureViews().empty());
-  std::vector<views::View*> download_chips = test_api()->GetDownloadChips();
-  ASSERT_EQ(2u, download_chips.size());
-  EXPECT_EQ(item_2->id(),
-            HoldingSpaceItemView::Cast(download_chips[0])->item()->id());
-  EXPECT_EQ(item_1->id(),
-            HoldingSpaceItemView::Cast(download_chips[1])->item()->id());
-
-  // Remove the first item, and verify the section gets updated.
-  model()->RemoveItem(item_1->id());
-
-  EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
-  EXPECT_TRUE(test_api()->GetScreenCaptureViews().empty());
-  download_chips = test_api()->GetDownloadChips();
-  ASSERT_EQ(1u, download_chips.size());
-  EXPECT_EQ(item_2->id(),
-            HoldingSpaceItemView::Cast(download_chips[0])->item()->id());
-
-  test_api()->Close();
-}
-
-// Tests that a partially initialized nearby share item does not get shown if a
-// full download item gets removed from the holding space.
-TEST_F(HoldingSpaceTrayTest, PartialNearbyShareItemWithExistingDownloadItems) {
-  StartSession();
-  test_api()->Show();
-
-  EXPECT_FALSE(test_api()->RecentFilesBubbleShown());
-  ASSERT_TRUE(test_api()->GetDownloadChips().empty());
-
-  // Add partially initialized nearby share item - verify it doesn't get shown
-  // in the UI yet.
-  HoldingSpaceItem* nearby_share_item =
-      AddPartiallyInitializedItem(HoldingSpaceItem::Type::kNearbyShare,
-                                  base::FilePath("/tmp/nearby_share"));
-  EXPECT_FALSE(test_api()->RecentFilesBubbleShown());
-  EXPECT_TRUE(test_api()->GetDownloadChips().empty());
-
-  // Add partially initialized screenshot item - verify it doesn't get shown in
-  // the UI yet.
-  HoldingSpaceItem* screenshot_item = AddPartiallyInitializedItem(
-      HoldingSpaceItem::Type::kScreenshot, base::FilePath("/tmp/screenshot"));
-  EXPECT_FALSE(test_api()->RecentFilesBubbleShown());
-
-  // Add two download items.
-  HoldingSpaceItem* download_item_1 = AddItem(
-      HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/download_1"));
-  HoldingSpaceItem* download_item_2 = AddItem(
-      HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/download_2"));
-  EXPECT_TRUE(test_api()->RecentFilesBubbleShown());
-  EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
-  EXPECT_TRUE(test_api()->GetScreenCaptureViews().empty());
-  std::vector<views::View*> download_chips = test_api()->GetDownloadChips();
-  ASSERT_EQ(2u, download_chips.size());
-  EXPECT_EQ(download_item_2->id(),
-            HoldingSpaceItemView::Cast(download_chips[0])->item()->id());
-  EXPECT_EQ(download_item_1->id(),
-            HoldingSpaceItemView::Cast(download_chips[1])->item()->id());
-
-  // Finalize the nearby share item and verify it is not shown.
-  model()->FinalizeOrRemoveItem(nearby_share_item->id(),
-                                GURL("filesystem:nearby_share"));
-
-  EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
-  EXPECT_TRUE(test_api()->GetScreenCaptureViews().empty());
-  download_chips = test_api()->GetDownloadChips();
-  ASSERT_EQ(2u, download_chips.size());
-  EXPECT_EQ(download_item_2->id(),
-            HoldingSpaceItemView::Cast(download_chips[0])->item()->id());
-  EXPECT_EQ(download_item_1->id(),
-            HoldingSpaceItemView::Cast(download_chips[1])->item()->id());
-
-  // Finalize the screenshot item and verify it is shown. Note that the
-  // finalized screenshot item should not affect appearance of the downloads
-  // section of holding space UI. It shows in the screen captures section.
-  model()->FinalizeOrRemoveItem(screenshot_item->id(),
-                                GURL("filesystem:screenshot"));
-
-  EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
-  EXPECT_EQ(1u, test_api()->GetScreenCaptureViews().size());
-  download_chips = test_api()->GetDownloadChips();
-  ASSERT_EQ(2u, download_chips.size());
-  EXPECT_EQ(download_item_2->id(),
-            HoldingSpaceItemView::Cast(download_chips[0])->item()->id());
-  EXPECT_EQ(download_item_1->id(),
-            HoldingSpaceItemView::Cast(download_chips[1])->item()->id());
-
-  // Remove one of the fully initialized items, and verify the nearby share item
-  // that was finalized late is shown.
-  model()->RemoveItem(download_item_1->id());
-
-  download_chips = test_api()->GetDownloadChips();
-  ASSERT_EQ(2u, download_chips.size());
-  EXPECT_EQ(download_item_2->id(),
-            HoldingSpaceItemView::Cast(download_chips[0])->item()->id());
-  EXPECT_EQ(nearby_share_item->id(),
-            HoldingSpaceItemView::Cast(download_chips[1])->item()->id());
-
-  test_api()->Close();
-}
-
-// Tests that a partially initialized download item does not get shown if a
-// full download item gets removed from the holding space.
-TEST_F(HoldingSpaceTrayTest, PartialDownloadItemWithExistingNearbyShareItems) {
-  StartSession();
-  test_api()->Show();
-
-  EXPECT_FALSE(test_api()->RecentFilesBubbleShown());
-  ASSERT_TRUE(test_api()->GetDownloadChips().empty());
-
-  // Add partially initialized download item - verify it doesn't get shown
-  // in the UI yet.
-  HoldingSpaceItem* item_1 = AddPartiallyInitializedItem(
-      HoldingSpaceItem::Type::kDownload, base::FilePath("/tmp/fake_1"));
-  EXPECT_FALSE(test_api()->RecentFilesBubbleShown());
-  EXPECT_TRUE(test_api()->GetDownloadChips().empty());
-
-  // Add two nearby share items.
-  HoldingSpaceItem* item_2 = AddItem(HoldingSpaceItem::Type::kNearbyShare,
-                                     base::FilePath("/tmp/fake_2"));
-  HoldingSpaceItem* item_3 = AddItem(HoldingSpaceItem::Type::kNearbyShare,
-                                     base::FilePath("/tmp/fake_3"));
-  EXPECT_TRUE(test_api()->RecentFilesBubbleShown());
-  EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
-  EXPECT_TRUE(test_api()->GetScreenCaptureViews().empty());
-  std::vector<views::View*> download_chips = test_api()->GetDownloadChips();
-  ASSERT_EQ(2u, download_chips.size());
-  EXPECT_EQ(item_3->id(),
-            HoldingSpaceItemView::Cast(download_chips[0])->item()->id());
-  EXPECT_EQ(item_2->id(),
-            HoldingSpaceItemView::Cast(download_chips[1])->item()->id());
-
-  // Finalize the download item and verify it is not shown.
-  model()->FinalizeOrRemoveItem(item_1->id(), GURL("filesystem:fake_1"));
-
-  EXPECT_TRUE(test_api()->GetPinnedFileChips().empty());
-  EXPECT_TRUE(test_api()->GetScreenCaptureViews().empty());
-  download_chips = test_api()->GetDownloadChips();
-  ASSERT_EQ(2u, download_chips.size());
-  EXPECT_EQ(item_3->id(),
-            HoldingSpaceItemView::Cast(download_chips[0])->item()->id());
-  EXPECT_EQ(item_2->id(),
-            HoldingSpaceItemView::Cast(download_chips[1])->item()->id());
-
-  // Remove one of the fully initialized items, and verify the partially
-  // initialized item is not shown.
-  model()->RemoveItem(item_2->id());
-
-  download_chips = test_api()->GetDownloadChips();
-  ASSERT_EQ(2u, download_chips.size());
-  EXPECT_EQ(item_3->id(),
-            HoldingSpaceItemView::Cast(download_chips[0])->item()->id());
-  EXPECT_EQ(item_1->id(),
-            HoldingSpaceItemView::Cast(download_chips[1])->item()->id());
-
-  test_api()->Close();
-}
-
 // Right clicking the holding space tray should show a context menu if the
 // previews feature is enabled. Otherwise it should do nothing.
 TEST_F(HoldingSpaceTrayTest, ShouldMaybeShowContextMenuOnRightClick) {
diff --git a/ash/system/holding_space/holding_space_util.cc b/ash/system/holding_space/holding_space_util.cc
index 8580a40..bb77f96f 100644
--- a/ash/system/holding_space/holding_space_util.cc
+++ b/ash/system/holding_space/holding_space_util.cc
@@ -5,6 +5,7 @@
 #include "ash/system/holding_space/holding_space_util.h"
 
 #include "ash/style/ash_color_provider.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_element.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/layer_animation_sequence.h"
diff --git a/ash/system/holding_space/pinned_files_section.cc b/ash/system/holding_space/pinned_files_section.cc
index 9f8c78b..06ec925 100644
--- a/ash/system/holding_space/pinned_files_section.cc
+++ b/ash/system/holding_space/pinned_files_section.cc
@@ -20,6 +20,7 @@
 #include "ash/system/holding_space/holding_space_util.h"
 #include "base/callback_helpers.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/background.h"
diff --git a/ash/system/holding_space/screen_captures_section.cc b/ash/system/holding_space/screen_captures_section.cc
index 2d365ecb..fa1c597 100644
--- a/ash/system/holding_space/screen_captures_section.cc
+++ b/ash/system/holding_space/screen_captures_section.cc
@@ -10,6 +10,7 @@
 #include "ash/system/holding_space/holding_space_item_screen_capture_view.h"
 #include "ash/system/holding_space/holding_space_util.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/flex_layout.h"
diff --git a/ash/system/ime_menu/ime_menu_tray.cc b/ash/system/ime_menu/ime_menu_tray.cc
index 76ca682..99ded39 100644
--- a/ash/system/ime_menu/ime_menu_tray.cc
+++ b/ash/system/ime_menu/ime_menu_tray.cc
@@ -38,6 +38,7 @@
 #include "ui/base/ime/text_input_client.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/gfx/range/range.h"
diff --git a/ash/system/media/media_tray.cc b/ash/system/media/media_tray.cc
index 9cad7c0..7113da95 100644
--- a/ash/system/media/media_tray.cc
+++ b/ash/system/media/media_tray.cc
@@ -27,6 +27,7 @@
 #include "components/prefs/pref_service.h"
 #include "media/base/media_switches.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/manager/managed_display_info.h"
 #include "ui/gfx/geometry/insets.h"
diff --git a/ash/system/media/unified_media_controls_container.cc b/ash/system/media/unified_media_controls_container.cc
index 6627c6d..60a34533 100644
--- a/ash/system/media/unified_media_controls_container.cc
+++ b/ash/system/media/unified_media_controls_container.cc
@@ -5,6 +5,7 @@
 #include "ash/system/media/unified_media_controls_container.h"
 
 #include "ash/system/tray/tray_constants.h"
+#include "ui/compositor/layer.h"
 #include "ui/views/border.h"
 
 namespace ash {
diff --git a/ash/system/message_center/message_center_scroll_bar.cc b/ash/system/message_center/message_center_scroll_bar.cc
index 6bc6df3..8f420b55 100644
--- a/ash/system/message_center/message_center_scroll_bar.cc
+++ b/ash/system/message_center/message_center_scroll_bar.cc
@@ -6,6 +6,7 @@
 
 #include "ash/public/cpp/ash_features.h"
 #include "base/metrics/histogram_macros.h"
+#include "ui/compositor/layer.h"
 
 namespace {
 
diff --git a/ash/system/message_center/notification_swipe_control_view.cc b/ash/system/message_center/notification_swipe_control_view.cc
index 90410409..ca94008 100644
--- a/ash/system/message_center/notification_swipe_control_view.cc
+++ b/ash/system/message_center/notification_swipe_control_view.cc
@@ -7,6 +7,7 @@
 #include "ash/system/message_center/message_center_style.h"
 #include "ash/system/message_center/metrics_utils.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/event.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/paint_vector_icon.h"
diff --git a/ash/system/message_center/notifier_settings_view.cc b/ash/system/message_center/notifier_settings_view.cc
index 0fea8f6f..763b727 100644
--- a/ash/system/message_center/notifier_settings_view.cc
+++ b/ash/system/message_center/notifier_settings_view.cc
@@ -33,6 +33,7 @@
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/ui_base_features.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/paint_recorder.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/keycodes/keyboard_codes.h"
diff --git a/ash/system/message_center/unified_message_center_bubble.cc b/ash/system/message_center/unified_message_center_bubble.cc
index 13536a9..682e2416 100644
--- a/ash/system/message_center/unified_message_center_bubble.cc
+++ b/ash/system/message_center/unified_message_center_bubble.cc
@@ -19,6 +19,7 @@
 #include "ash/system/unified/unified_system_tray_bubble.h"
 #include "ash/system/unified/unified_system_tray_view.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/paint_recorder.h"
 #include "ui/views/focus/focus_search.h"
 #include "ui/views/widget/widget.h"
diff --git a/ash/system/message_center/unified_message_list_view_unittest.cc b/ash/system/message_center/unified_message_list_view_unittest.cc
index 31fb2af..e9e284c 100644
--- a/ash/system/message_center/unified_message_list_view_unittest.cc
+++ b/ash/system/message_center/unified_message_list_view_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/views/message_view.h"
diff --git a/ash/system/night_light/night_light_controller_impl.h b/ash/system/night_light/night_light_controller_impl.h
index 4f1ca5a..19c342b 100644
--- a/ash/system/night_light/night_light_controller_impl.h
+++ b/ash/system/night_light/night_light_controller_impl.h
@@ -19,6 +19,7 @@
 #include "chromeos/dbus/power/power_manager_client.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "ui/aura/env_observer.h"
+#include "ui/gfx/geometry/vector3d_f.h"
 #include "ui/message_center/public/cpp/notification_delegate.h"
 
 class PrefRegistrySimple;
diff --git a/ash/system/palette/palette_tray.cc b/ash/system/palette/palette_tray.cc
index ce418e5..324bb16 100644
--- a/ash/system/palette/palette_tray.cc
+++ b/ash/system/palette/palette_tray.cc
@@ -39,6 +39,7 @@
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/events/devices/device_data_manager.h"
diff --git a/ash/system/phonehub/notification_opt_in_view.cc b/ash/system/phonehub/notification_opt_in_view.cc
index ad7f719f..7c245ed 100644
--- a/ash/system/phonehub/notification_opt_in_view.cc
+++ b/ash/system/phonehub/notification_opt_in_view.cc
@@ -17,6 +17,7 @@
 #include "chromeos/components/phonehub/notification_access_manager.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/chromeos/devicetype_utils.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/label.h"
diff --git a/ash/system/phonehub/phone_connected_view.cc b/ash/system/phonehub/phone_connected_view.cc
index d008330..29a177e 100644
--- a/ash/system/phonehub/phone_connected_view.cc
+++ b/ash/system/phonehub/phone_connected_view.cc
@@ -17,6 +17,7 @@
 #include "chromeos/components/phonehub/notification_access_manager.h"
 #include "chromeos/components/phonehub/phone_hub_manager.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/controls/image_view.h"
diff --git a/ash/system/phonehub/phone_hub_interstitial_view.cc b/ash/system/phonehub/phone_hub_interstitial_view.cc
index 9a380e8..2a027b1c 100644
--- a/ash/system/phonehub/phone_hub_interstitial_view.cc
+++ b/ash/system/phonehub/phone_hub_interstitial_view.cc
@@ -18,6 +18,7 @@
 #include "skia/ext/image_operations.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/image/image_skia_operations.h"
diff --git a/ash/system/phonehub/phone_status_view.cc b/ash/system/phonehub/phone_status_view.cc
index aeb6a910..71078df 100644
--- a/ash/system/phonehub/phone_status_view.cc
+++ b/ash/system/phonehub/phone_status_view.cc
@@ -22,6 +22,7 @@
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/image/image_skia.h"
diff --git a/ash/system/phonehub/quick_action_item.cc b/ash/system/phonehub/quick_action_item.cc
index 8a3a836d..231fcbb 100644
--- a/ash/system/phonehub/quick_action_item.cc
+++ b/ash/system/phonehub/quick_action_item.cc
@@ -9,6 +9,7 @@
 #include "ash/style/ash_color_provider.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/box_layout.h"
diff --git a/ash/system/power/power_button_controller.cc b/ash/system/power/power_button_controller.cc
index 5cc8108..b29e47b 100644
--- a/ash/system/power/power_button_controller.cc
+++ b/ash/system/power/power_button_controller.cc
@@ -30,6 +30,7 @@
 #include "base/json/json_reader.h"
 #include "base/time/default_tick_clock.h"
 #include "chromeos/dbus/power_manager/backlight.pb.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/types/display_snapshot.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_observer.h"
diff --git a/ash/system/power/power_button_menu_view.cc b/ash/system/power/power_button_menu_view.cc
index 4d01734..ea514630 100644
--- a/ash/system/power/power_button_menu_view.cc
+++ b/ash/system/power/power_button_menu_view.cc
@@ -24,6 +24,7 @@
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "base/callback_helpers.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/vector_icon_types.h"
diff --git a/ash/system/privacy_screen/privacy_screen_toast_view.cc b/ash/system/privacy_screen/privacy_screen_toast_view.cc
index 5534395..8eea7e33 100644
--- a/ash/system/privacy_screen/privacy_screen_toast_view.cc
+++ b/ash/system/privacy_screen/privacy_screen_toast_view.cc
@@ -11,6 +11,7 @@
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/unified/feature_pod_button.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/controls/image_view.h"
diff --git a/ash/system/status_area_widget.cc b/ash/system/status_area_widget.cc
index fcd2391f..21508dc 100644
--- a/ash/system/status_area_widget.cc
+++ b/ash/system/status_area_widget.cc
@@ -39,6 +39,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "chromeos/services/assistant/public/cpp/features.h"
 #include "media/base/media_switches.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/display.h"
 
diff --git a/ash/system/toast/toast_manager_unittest.cc b/ash/system/toast/toast_manager_unittest.cc
index f28b057..2335dcc 100644
--- a/ash/system/toast/toast_manager_unittest.cc
+++ b/ash/system/toast/toast_manager_unittest.cc
@@ -20,6 +20,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/session_manager/session_manager_types.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/views/widget/widget.h"
diff --git a/ash/system/toast/toast_overlay.cc b/ash/system/toast/toast_overlay.cc
index b1351b8..533a9520 100644
--- a/ash/system/toast/toast_overlay.cc
+++ b/ash/system/toast/toast_overlay.cc
@@ -20,6 +20,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/display_observer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/font_list.h"
diff --git a/ash/system/tray/status_area_overflow_button_tray.cc b/ash/system/tray/status_area_overflow_button_tray.cc
index f1b324b..86f4b8d 100644
--- a/ash/system/tray/status_area_overflow_button_tray.cc
+++ b/ash/system/tray/status_area_overflow_button_tray.cc
@@ -11,6 +11,7 @@
 #include "ash/system/status_area_widget.h"
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/tray/tray_container.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/animation/slide_animation.h"
 #include "ui/gfx/animation/tween.h"
 #include "ui/gfx/paint_vector_icon.h"
diff --git a/ash/system/tray/tray_container.cc b/ash/system/tray/tray_container.cc
index 605bb5d..cc8186f 100644
--- a/ash/system/tray/tray_container.cc
+++ b/ash/system/tray/tray_container.cc
@@ -10,6 +10,7 @@
 #include "ash/public/cpp/shelf_config.h"
 #include "ash/shelf/shelf.h"
 #include "ash/system/tray/tray_constants.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/views/border.h"
 #include "ui/views/layout/box_layout.h"
diff --git a/ash/system/unified/unified_system_tray_bubble.cc b/ash/system/unified/unified_system_tray_bubble.cc
index 65f5a1c..e6092a3 100644
--- a/ash/system/unified/unified_system_tray_bubble.cc
+++ b/ash/system/unified/unified_system_tray_bubble.cc
@@ -20,6 +20,7 @@
 #include "ash/wm/work_area_insets.h"
 #include "base/metrics/histogram_macros.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/wm/core/window_util.h"
 #include "ui/wm/public/activation_client.h"
 
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc
index df5c714..9bdcf16 100644
--- a/ash/system/unified/unified_system_tray_controller.cc
+++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -64,6 +64,7 @@
 #include "base/numerics/ranges.h"
 #include "media/base/media_switches.h"
 #include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/compositor/compositor.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/animation/slide_animation.h"
 #include "ui/message_center/message_center.h"
diff --git a/ash/system/unified/unified_system_tray_view.cc b/ash/system/unified/unified_system_tray_view.cc
index cac8bba..c7a7034 100644
--- a/ash/system/unified/unified_system_tray_view.cc
+++ b/ash/system/unified/unified_system_tray_view.cc
@@ -28,6 +28,7 @@
 #include "media/base/media_switches.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_node_data.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/scoped_canvas.h"
 #include "ui/message_center/message_center.h"
diff --git a/ash/touch/touch_hud_debug.cc b/ash/touch/touch_hud_debug.cc
index d7be7ec7..554028d 100644
--- a/ash/touch/touch_hud_debug.cc
+++ b/ash/touch/touch_hud_debug.cc
@@ -14,6 +14,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "third_party/skia/include/core/SkPath.h"
 #include "ui/aura/window_event_dispatcher.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/display.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/events/event.h"
diff --git a/ash/utility/occlusion_tracker_pauser.h b/ash/utility/occlusion_tracker_pauser.h
index c8fbb441..f9d4c5f2 100644
--- a/ash/utility/occlusion_tracker_pauser.h
+++ b/ash/utility/occlusion_tracker_pauser.h
@@ -13,6 +13,7 @@
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "ui/aura/window_occlusion_tracker.h"
+#include "ui/compositor/compositor.h"
 #include "ui/compositor/compositor_observer.h"
 
 namespace ash {
diff --git a/ash/utility/screenshot_controller.cc b/ash/utility/screenshot_controller.cc
index 380381b..9a33540 100644
--- a/ash/utility/screenshot_controller.cc
+++ b/ash/utility/screenshot_controller.cc
@@ -19,6 +19,7 @@
 #include "ui/aura/client/screen_position_client.h"
 #include "ui/aura/window_targeter.h"
 #include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/paint_recorder.h"
 #include "ui/display/screen.h"
 #include "ui/events/event.h"
diff --git a/ash/utility/screenshot_controller_unittest.cc b/ash/utility/screenshot_controller_unittest.cc
index 30c2acdc..6e2e626c 100644
--- a/ash/utility/screenshot_controller_unittest.cc
+++ b/ash/utility/screenshot_controller_unittest.cc
@@ -20,6 +20,7 @@
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/base/cursor/cursor.h"
 #include "ui/base/cursor/cursor_size.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/types/display_constants.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/gfx/codec/png_codec.h"
diff --git a/ash/wallpaper/wallpaper_controller_impl.cc b/ash/wallpaper/wallpaper_controller_impl.cc
index 39175458..be14e9d 100644
--- a/ash/wallpaper/wallpaper_controller_impl.cc
+++ b/ash/wallpaper/wallpaper_controller_impl.cc
@@ -57,6 +57,7 @@
 #include "components/user_manager/user_type.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "services/data_decoder/public/cpp/decode_image.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/manager/managed_display_info.h"
 #include "ui/display/screen.h"
diff --git a/ash/wallpaper/wallpaper_controller_unittest.cc b/ash/wallpaper/wallpaper_controller_unittest.cc
index af4feb56..6c26261 100644
--- a/ash/wallpaper/wallpaper_controller_unittest.cc
+++ b/ash/wallpaper/wallpaper_controller_unittest.cc
@@ -49,6 +49,7 @@
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_tree_owner.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/compositor/test/layer_animator_test_controller.h"
diff --git a/ash/wallpaper/wallpaper_utils/wallpaper_decoder.cc b/ash/wallpaper/wallpaper_utils/wallpaper_decoder.cc
index 3be05255..39d2919 100644
--- a/ash/wallpaper/wallpaper_utils/wallpaper_decoder.cc
+++ b/ash/wallpaper/wallpaper_utils/wallpaper_decoder.cc
@@ -8,6 +8,7 @@
 #include "ash/shell_delegate.h"
 #include "base/bind.h"
 #include "ipc/ipc_channel.h"
+#include "ui/gfx/image/image_skia.h"
 
 namespace ash {
 namespace {
diff --git a/ash/wallpaper/wallpaper_view.cc b/ash/wallpaper/wallpaper_view.cc
index 0b0faa6..f027dc8 100644
--- a/ash/wallpaper/wallpaper_view.cc
+++ b/ash/wallpaper/wallpaper_view.cc
@@ -14,6 +14,7 @@
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "cc/paint/render_surface_filters.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/display.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/manager/managed_display_info.h"
diff --git a/ash/wm/base_state.cc b/ash/wm/base_state.cc
index 1b11a51..31f6058d 100644
--- a/ash/wm/base_state.cc
+++ b/ash/wm/base_state.cc
@@ -17,6 +17,7 @@
 #include "chromeos/ui/base/window_state_type.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 
 namespace ash {
 
diff --git a/ash/wm/default_state.cc b/ash/wm/default_state.cc
index 57a2e23..e72264e3 100644
--- a/ash/wm/default_state.cc
+++ b/ash/wm/default_state.cc
@@ -25,6 +25,7 @@
 #include "ui/aura/window.h"
 #include "ui/aura/window_delegate.h"
 #include "ui/compositor/animation_throughput_reporter.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/display.h"
 #include "ui/display/display_observer.h"
 #include "ui/display/screen.h"
diff --git a/ash/wm/desks/desk.cc b/ash/wm/desks/desk.cc
index 89e54be..8def6cb 100644
--- a/ash/wm/desks/desk.cc
+++ b/ash/wm/desks/desk.cc
@@ -32,6 +32,7 @@
 #include "chromeos/ui/base/window_properties.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window_tracker.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/screen.h"
 #include "ui/wm/core/window_util.h"
 
diff --git a/ash/wm/desks/desk_drag_proxy.cc b/ash/wm/desks/desk_drag_proxy.cc
index 3cbd4d7..3fb6652fc 100644
--- a/ash/wm/desks/desk_drag_proxy.cc
+++ b/ash/wm/desks/desk_drag_proxy.cc
@@ -9,6 +9,7 @@
 #include "ash/wm/desks/desk_preview_view.h"
 #include "ash/wm/desks/desks_bar_view.h"
 #include "ui/base/dragdrop/mojom/drag_drop_types.mojom-shared.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/screen.h"
 #include "ui/events/event_observer.h"
diff --git a/ash/wm/desks/desk_mini_view.cc b/ash/wm/desks/desk_mini_view.cc
index 7db7da8..416c49f 100644
--- a/ash/wm/desks/desk_mini_view.cc
+++ b/ash/wm/desks/desk_mini_view.cc
@@ -22,6 +22,7 @@
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/aura/window.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/views/widget/widget.h"
 #include "ui/wm/core/coordinate_conversion.h"
diff --git a/ash/wm/desks/desk_preview_view.h b/ash/wm/desks/desk_preview_view.h
index 444bbf6..127dae11 100644
--- a/ash/wm/desks/desk_preview_view.h
+++ b/ash/wm/desks/desk_preview_view.h
@@ -10,6 +10,7 @@
 #include "ash/ash_export.h"
 #include "base/macros.h"
 #include "ui/aura/window_occlusion_tracker.h"
+#include "ui/compositor/layer.h"
 #include "ui/views/controls/button/button.h"
 
 namespace ui {
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc
index f3660602..41d5195d 100644
--- a/ash/wm/desks/desks_unittests.cc
+++ b/ash/wm/desks/desks_unittests.cc
@@ -78,6 +78,7 @@
 #include "ui/base/ime/chromeos/fake_ime_keyboard.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/chromeos/events/event_rewriter_chromeos.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/compositor_extra/shadow.h"
 #include "ui/display/display.h"
diff --git a/ash/wm/desks/desks_util.cc b/ash/wm/desks/desks_util.cc
index d7c341f..a6c4600 100644
--- a/ash/wm/desks/desks_util.cc
+++ b/ash/wm/desks/desks_util.cc
@@ -16,6 +16,7 @@
 #include "ash/wm/overview/overview_session.h"
 #include "ash/wm/window_util.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 
 namespace ash {
 
diff --git a/ash/wm/desks/expanded_state_new_desk_button.cc b/ash/wm/desks/expanded_state_new_desk_button.cc
index 7f53f73..9236a04 100644
--- a/ash/wm/desks/expanded_state_new_desk_button.cc
+++ b/ash/wm/desks/expanded_state_new_desk_button.cc
@@ -15,6 +15,7 @@
 #include "ash/wm/overview/overview_controller.h"
 #include "ash/wm/overview/overview_session.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/controls/label.h"
 
diff --git a/ash/wm/desks/scroll_arrow_button.cc b/ash/wm/desks/scroll_arrow_button.cc
index d501714..9e144571 100644
--- a/ash/wm/desks/scroll_arrow_button.cc
+++ b/ash/wm/desks/scroll_arrow_button.cc
@@ -9,6 +9,7 @@
 #include "ash/wm/desks/desk_mini_view.h"
 #include "ash/wm/desks/desk_preview_view.h"
 #include "ash/wm/desks/desks_bar_view.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/widget/widget.h"
diff --git a/ash/wm/desks/zero_state_button.cc b/ash/wm/desks/zero_state_button.cc
index 2faa93a..b992171d 100644
--- a/ash/wm/desks/zero_state_button.cc
+++ b/ash/wm/desks/zero_state_button.cc
@@ -14,6 +14,7 @@
 #include "ash/wm/desks/desks_controller.h"
 #include "ash/wm/wm_highlight_item_border.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/font_list.h"
 #include "ui/gfx/text_constants.h"
diff --git a/ash/wm/drag_window_resizer.cc b/ash/wm/drag_window_resizer.cc
index 99e6572..b71865a3 100644
--- a/ash/wm/drag_window_resizer.cc
+++ b/ash/wm/drag_window_resizer.cc
@@ -20,6 +20,7 @@
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/base/hit_test.h"
 #include "ui/base/ui_base_types.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/geometry/point_conversions.h"
 #include "ui/wm/core/coordinate_conversion.h"
diff --git a/ash/wm/drag_window_resizer_unittest.cc b/ash/wm/drag_window_resizer_unittest.cc
index 5d7d6ff..21aa2d808 100644
--- a/ash/wm/drag_window_resizer_unittest.cc
+++ b/ash/wm/drag_window_resizer_unittest.cc
@@ -25,6 +25,7 @@
 #include "ui/aura/window.h"
 #include "ui/base/hit_test.h"
 #include "ui/base/ui_base_types.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_delegate.h"
 #include "ui/compositor/layer_tree_owner.h"
 #include "ui/compositor_extra/shadow.h"
diff --git a/ash/wm/full_restore/full_restore_controller.cc b/ash/wm/full_restore/full_restore_controller.cc
index faedf0c..1e704b4 100644
--- a/ash/wm/full_restore/full_restore_controller.cc
+++ b/ash/wm/full_restore/full_restore_controller.cc
@@ -183,7 +183,6 @@
       // in normal or maximized state.
       // TODO(crbug.com/1164472): Investigate splitview for ARC apps, which
       // are not managed by TabletModeWindowManager.
-      LOG(ERROR) << static_cast<int>(state_type.value());
       if (Shell::Get()->tablet_mode_controller()->InTabletMode())
         Shell::Get()->tablet_mode_controller()->AddWindow(window);
 
@@ -305,7 +304,14 @@
   window_info.current_bounds = window_state->HasRestoreBounds()
                                    ? window_state->GetRestoreBoundsInScreen()
                                    : window->GetBoundsInScreen();
-  window_info.window_state_type = window_state->GetStateType();
+  // Full restore does not support restoring fullscreen windows. If a window is
+  // fullscreen save the pre-fullscreen window state instead.
+  window_info.window_state_type =
+      window_state->IsInImmersiveFullscreen()
+          ? chromeos::ToWindowStateType(
+                window->GetProperty(aura::client::kPreFullscreenShowStateKey))
+          : window_state->GetStateType();
+
   window_info.display_id =
       display::Screen::GetScreen()->GetDisplayNearestWindow(window).id();
   full_restore::SaveWindowInfo(window_info);
diff --git a/ash/wm/gestures/back_gesture/back_gesture_affordance.cc b/ash/wm/gestures/back_gesture/back_gesture_affordance.cc
index 71886cd..35be666 100644
--- a/ash/wm/gestures/back_gesture/back_gesture_affordance.cc
+++ b/ash/wm/gestures/back_gesture/back_gesture_affordance.cc
@@ -16,6 +16,7 @@
 #include "base/i18n/rtl.h"
 #include "components/vector_icons/vector_icons.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/paint_recorder.h"
 #include "ui/display/screen.h"
 #include "ui/events/event.h"
diff --git a/ash/wm/gestures/back_gesture/back_gesture_contextual_nudge.cc b/ash/wm/gestures/back_gesture/back_gesture_contextual_nudge.cc
index d2e3609b..74968014 100644
--- a/ash/wm/gestures/back_gesture/back_gesture_contextual_nudge.cc
+++ b/ash/wm/gestures/back_gesture/back_gesture_contextual_nudge.cc
@@ -16,6 +16,7 @@
 #include "base/i18n/rtl.h"
 #include "base/timer/timer.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/canvas.h"
diff --git a/ash/wm/lock_window_state.cc b/ash/wm/lock_window_state.cc
index bfd169a4..b69fead 100644
--- a/ash/wm/lock_window_state.cc
+++ b/ash/wm/lock_window_state.cc
@@ -19,6 +19,7 @@
 #include "ash/wm/wm_event.h"
 #include "ash/wm/work_area_insets.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/wm/core/coordinate_conversion.h"
 
diff --git a/ash/wm/overview/cleanup_animation_observer_unittest.cc b/ash/wm/overview/cleanup_animation_observer_unittest.cc
index 9d78c40e4..f15df47 100644
--- a/ash/wm/overview/cleanup_animation_observer_unittest.cc
+++ b/ash/wm/overview/cleanup_animation_observer_unittest.cc
@@ -11,6 +11,7 @@
 #include "ash/wm/overview/overview_delegate.h"
 #include "base/containers/unique_ptr_adapters.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
diff --git a/ash/wm/overview/delayed_animation_observer_impl_unittest.cc b/ash/wm/overview/delayed_animation_observer_impl_unittest.cc
index 757e1893..fce7cd2 100644
--- a/ash/wm/overview/delayed_animation_observer_impl_unittest.cc
+++ b/ash/wm/overview/delayed_animation_observer_impl_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/containers/unique_ptr_adapters.h"
 #include "base/test/task_environment.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/transform.h"
 
diff --git a/ash/wm/overview/overview_controller_unittest.cc b/ash/wm/overview/overview_controller_unittest.cc
index e3b2b32c..979d970 100644
--- a/ash/wm/overview/overview_controller_unittest.cc
+++ b/ash/wm/overview/overview_controller_unittest.cc
@@ -35,6 +35,7 @@
 #include "base/run_loop.h"
 #include "ui/aura/client/window_types.h"
 #include "ui/base/hit_test.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/events/test/event_generator.h"
 
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc
index 44afb27..9a4d3bc 100644
--- a/ash/wm/overview/overview_grid.cc
+++ b/ash/wm/overview/overview_grid.cc
@@ -59,6 +59,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/throughput_tracker.h"
 #include "ui/gfx/geometry/vector2d_f.h"
diff --git a/ash/wm/overview/overview_grid_event_handler.cc b/ash/wm/overview/overview_grid_event_handler.cc
index f973094..43ee8b8 100644
--- a/ash/wm/overview/overview_grid_event_handler.cc
+++ b/ash/wm/overview/overview_grid_event_handler.cc
@@ -15,6 +15,7 @@
 #include "ash/wm/overview/overview_utils.h"
 #include "ash/wm/splitview/split_view_controller.h"
 #include "ui/compositor/compositor.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/screen.h"
 #include "ui/events/event.h"
 #include "ui/events/gestures/fling_curve.h"
diff --git a/ash/wm/overview/overview_item.cc b/ash/wm/overview/overview_item.cc
index 2a54848..34fdffa 100644
--- a/ash/wm/overview/overview_item.cc
+++ b/ash/wm/overview/overview_item.cc
@@ -47,6 +47,7 @@
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/layer_animation_sequence.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc
index 9c5666d..ee5d18d 100644
--- a/ash/wm/overview/overview_session_unittest.cc
+++ b/ash/wm/overview/overview_session_unittest.cc
@@ -80,6 +80,7 @@
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/hit_test.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_sequence.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/compositor/test/draw_waiter_for_test.h"
diff --git a/ash/wm/overview/overview_utils.cc b/ash/wm/overview/overview_utils.cc
index c63e26c..b4923ef8 100644
--- a/ash/wm/overview/overview_utils.cc
+++ b/ash/wm/overview/overview_utils.cc
@@ -32,6 +32,7 @@
 #include "base/no_destructor.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/scoped_canvas.h"
 #include "ui/gfx/transform_util.h"
diff --git a/ash/wm/overview/overview_window_drag_controller.cc b/ash/wm/overview/overview_window_drag_controller.cc
index 21d58232..3c3d8bb 100644
--- a/ash/wm/overview/overview_window_drag_controller.cc
+++ b/ash/wm/overview/overview_window_drag_controller.cc
@@ -34,6 +34,7 @@
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/display.h"
 #include "ui/wm/core/coordinate_conversion.h"
 
diff --git a/ash/wm/overview/scoped_overview_transform_window_unittest.cc b/ash/wm/overview/scoped_overview_transform_window_unittest.cc
index 4edeeb1..1ea9c104 100644
--- a/ash/wm/overview/scoped_overview_transform_window_unittest.cc
+++ b/ash/wm/overview/scoped_overview_transform_window_unittest.cc
@@ -11,6 +11,7 @@
 #include "ash/wm/window_state.h"
 #include "base/numerics/safe_conversions.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/display.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/screen.h"
diff --git a/ash/wm/pip/pip_unittest.cc b/ash/wm/pip/pip_unittest.cc
index 781c274..b9997e8f 100644
--- a/ash/wm/pip/pip_unittest.cc
+++ b/ash/wm/pip/pip_unittest.cc
@@ -23,6 +23,7 @@
 #include "ash/wm/wm_event.h"
 #include "base/command_line.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_delegate.h"
diff --git a/ash/wm/pip/pip_window_resizer.cc b/ash/wm/pip/pip_window_resizer.cc
index 41c8bd280..84558996 100644
--- a/ash/wm/pip/pip_window_resizer.cc
+++ b/ash/wm/pip/pip_window_resizer.cc
@@ -15,6 +15,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/screen.h"
 #include "ui/views/widget/widget.h"
diff --git a/ash/wm/pip/pip_window_resizer_unittest.cc b/ash/wm/pip/pip_window_resizer_unittest.cc
index aaf81d0..3614880 100644
--- a/ash/wm/pip/pip_window_resizer_unittest.cc
+++ b/ash/wm/pip/pip_window_resizer_unittest.cc
@@ -26,6 +26,7 @@
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
 #include "ui/base/hit_test.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/scoped_display_for_new_windows.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/views/widget/widget.h"
diff --git a/ash/wm/resize_shadow_and_cursor_unittest.cc b/ash/wm/resize_shadow_and_cursor_unittest.cc
index e1a40f52..5610491f 100644
--- a/ash/wm/resize_shadow_and_cursor_unittest.cc
+++ b/ash/wm/resize_shadow_and_cursor_unittest.cc
@@ -16,6 +16,7 @@
 #include "ui/base/cursor/cursor.h"
 #include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
 #include "ui/base/hit_test.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_delegate.h"
diff --git a/ash/wm/screen_pinning_controller.cc b/ash/wm/screen_pinning_controller.cc
index 4f93726..1494719 100644
--- a/ash/wm/screen_pinning_controller.cc
+++ b/ash/wm/screen_pinning_controller.cc
@@ -19,6 +19,7 @@
 #include "base/logging.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/wm/core/window_util.h"
 
 namespace ash {
diff --git a/ash/wm/splitview/split_view_divider_handler_view.cc b/ash/wm/splitview/split_view_divider_handler_view.cc
index 15f1e72f..31afce76 100644
--- a/ash/wm/splitview/split_view_divider_handler_view.cc
+++ b/ash/wm/splitview/split_view_divider_handler_view.cc
@@ -10,6 +10,7 @@
 #include "ash/wm/splitview/split_view_constants.h"
 #include "ash/wm/splitview/split_view_utils.h"
 #include "base/timer/timer.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/animation/animation_delegate.h"
 #include "ui/gfx/animation/slide_animation.h"
 #include "ui/views/background.h"
diff --git a/ash/wm/splitview/split_view_drag_indicators.cc b/ash/wm/splitview/split_view_drag_indicators.cc
index 7655c7e..d675e932 100644
--- a/ash/wm/splitview/split_view_drag_indicators.cc
+++ b/ash/wm/splitview/split_view_drag_indicators.cc
@@ -26,6 +26,7 @@
 #include "ui/aura/window.h"
 #include "ui/aura/window_observer.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/display_observer.h"
 #include "ui/views/background.h"
diff --git a/ash/wm/splitview/split_view_highlight_view.cc b/ash/wm/splitview/split_view_highlight_view.cc
index 7ea19e23..8133836c 100644
--- a/ash/wm/splitview/split_view_highlight_view.cc
+++ b/ash/wm/splitview/split_view_highlight_view.cc
@@ -9,6 +9,7 @@
 #include "ash/style/default_color_constants.h"
 #include "ash/style/default_colors.h"
 #include "ash/wm/splitview/split_view_controller.h"
+#include "ui/compositor/layer.h"
 #include "ui/views/view.h"
 #include "ui/views/view_observer.h"
 
diff --git a/ash/wm/tablet_mode/tablet_mode_browser_window_drag_delegate.cc b/ash/wm/tablet_mode/tablet_mode_browser_window_drag_delegate.cc
index 95c97fbd..2d016b9 100644
--- a/ash/wm/tablet_mode/tablet_mode_browser_window_drag_delegate.cc
+++ b/ash/wm/tablet_mode/tablet_mode_browser_window_drag_delegate.cc
@@ -14,6 +14,7 @@
 #include "ash/wm/window_util.h"
 #include "chromeos/ui/base/window_properties.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_observer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/screen.h"
diff --git a/ash/wm/tablet_mode/tablet_mode_controller.cc b/ash/wm/tablet_mode/tablet_mode_controller.cc
index 484714ba..081bdce8 100644
--- a/ash/wm/tablet_mode/tablet_mode_controller.cc
+++ b/ash/wm/tablet_mode/tablet_mode_controller.cc
@@ -43,6 +43,7 @@
 #include "ui/aura/window_observer.h"
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_sequence.h"
 #include "ui/display/display.h"
 #include "ui/display/manager/display_manager.h"
diff --git a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc
index c4b1117..a95e5c2 100644
--- a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc
+++ b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc
@@ -49,6 +49,7 @@
 #include "ui/aura/test/test_window_delegate.h"
 #include "ui/base/hit_test.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/compositor/test/test_utils.h"
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager.cc b/ash/wm/tablet_mode/tablet_mode_window_manager.cc
index 314a4cdd..7264f3f 100644
--- a/ash/wm/tablet_mode/tablet_mode_window_manager.cc
+++ b/ash/wm/tablet_mode/tablet_mode_window_manager.cc
@@ -36,6 +36,7 @@
 #include "base/containers/contains.h"
 #include "chromeos/ui/base/window_properties.h"
 #include "ui/aura/client/aura_constants.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_element.h"
 #include "ui/display/screen.h"
 
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
index 2a6fd55..a43d2d8 100644
--- a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
+++ b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
@@ -49,6 +49,7 @@
 #include "ui/aura/test/test_windows.h"
 #include "ui/aura/window.h"
 #include "ui/base/hit_test.h"
+#include "ui/compositor/layer.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/views/widget/widget.h"
 #include "ui/wm/core/ime_util_chromeos.h"
diff --git a/ash/wm/video_detector.cc b/ash/wm/video_detector.cc
index 57ff4f6d..5654082 100644
--- a/ash/wm/video_detector.cc
+++ b/ash/wm/video_detector.cc
@@ -12,6 +12,7 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "ui/aura/env.h"
 #include "ui/aura/window_event_dispatcher.h"
+#include "ui/compositor/compositor.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/wm/core/window_util.h"
 
diff --git a/ash/wm/window_cycle/window_cycle_list.cc b/ash/wm/window_cycle/window_cycle_list.cc
index 40d0c74..18794100 100644
--- a/ash/wm/window_cycle/window_cycle_list.cc
+++ b/ash/wm/window_cycle/window_cycle_list.cc
@@ -36,6 +36,7 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/animation_throughput_reporter.h"
 #include "ui/compositor/compositor_animation_observer.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_sequence.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/display.h"
diff --git a/ash/wm/window_cycle/window_cycle_tab_slider.cc b/ash/wm/window_cycle/window_cycle_tab_slider.cc
index 8c7ff52..70e68f6 100644
--- a/ash/wm/window_cycle/window_cycle_tab_slider.cc
+++ b/ash/wm/window_cycle/window_cycle_tab_slider.cc
@@ -14,6 +14,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "components/prefs/pref_service.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/geometry/rect.h"
diff --git a/ash/wm/window_mini_view.cc b/ash/wm/window_mini_view.cc
index 605d3e3..8240c884 100644
--- a/ash/wm/window_mini_view.cc
+++ b/ash/wm/window_mini_view.cc
@@ -15,6 +15,7 @@
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/image/image_skia_operations.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/controls/label.h"
diff --git a/ash/wm/window_mirror_view_unittest.cc b/ash/wm/window_mirror_view_unittest.cc
index 6c920e7..5865c52 100644
--- a/ash/wm/window_mirror_view_unittest.cc
+++ b/ash/wm/window_mirror_view_unittest.cc
@@ -7,6 +7,7 @@
 #include "ash/test/ash_test_base.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window_occlusion_tracker.h"
+#include "ui/compositor/layer.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/transform.h"
 #include "ui/views/widget/widget.h"
diff --git a/ash/wm/window_resizer.cc b/ash/wm/window_resizer.cc
index 87f812a..cc93fde 100644
--- a/ash/wm/window_resizer.cc
+++ b/ash/wm/window_resizer.cc
@@ -19,6 +19,7 @@
 #include "ui/base/hit_test.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/compositor/compositor.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/geometry/rect.h"
diff --git a/ash/wm/window_state.cc b/ash/wm/window_state.cc
index e2ed238..96b2d5b 100644
--- a/ash/wm/window_state.cc
+++ b/ash/wm/window_state.cc
@@ -38,6 +38,7 @@
 #include "ui/aura/layout_manager.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_delegate.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_tree_owner.h"
 #include "ui/compositor/paint_recorder.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
diff --git a/ash/wm/window_state_unittest.cc b/ash/wm/window_state_unittest.cc
index 83a3dd2..82b26bc 100644
--- a/ash/wm/window_state_unittest.cc
+++ b/ash/wm/window_state_unittest.cc
@@ -20,6 +20,7 @@
 #include "ui/aura/test/test_window_delegate.h"
 #include "ui/aura/window.h"
 #include "ui/base/hit_test.h"
+#include "ui/compositor/layer.h"
 #include "ui/display/screen.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/views/widget/widget.h"
diff --git a/ash/wm/window_util.cc b/ash/wm/window_util.cc
index 604a37f..6695a42 100644
--- a/ash/wm/window_util.cc
+++ b/ash/wm/window_util.cc
@@ -37,6 +37,7 @@
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_targeter.h"
 #include "ui/base/hit_test.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_tree_owner.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
diff --git a/ash/wm/workspace/workspace_layout_manager_unittest.cc b/ash/wm/workspace/workspace_layout_manager_unittest.cc
index a4c5918..6653e07 100644
--- a/ash/wm/workspace/workspace_layout_manager_unittest.cc
+++ b/ash/wm/workspace/workspace_layout_manager_unittest.cc
@@ -61,6 +61,7 @@
 #include "ui/aura/window_targeter.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/base/ui_base_types.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/layer_type.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/display/display.h"
diff --git a/ash/wm/workspace/workspace_window_resizer_unittest.cc b/ash/wm/workspace/workspace_window_resizer_unittest.cc
index a88bc75a..4df9fe36 100644
--- a/ash/wm/workspace/workspace_window_resizer_unittest.cc
+++ b/ash/wm/workspace/workspace_window_resizer_unittest.cc
@@ -25,6 +25,7 @@
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/base/hit_test.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/test/test_utils.h"
 #include "ui/display/display_layout.h"
 #include "ui/display/manager/display_manager.h"
diff --git a/ash/wm/workspace_controller_unittest.cc b/ash/wm/workspace_controller_unittest.cc
index 4de056a..fadaf7a 100644
--- a/ash/wm/workspace_controller_unittest.cc
+++ b/ash/wm/workspace_controller_unittest.cc
@@ -26,6 +26,7 @@
 #include "ui/aura/test/test_windows.h"
 #include "ui/aura/window.h"
 #include "ui/base/hit_test.h"
+#include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/display/screen.h"
 #include "ui/events/event_utils.h"
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 97916ab..5849d4ce 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -3849,7 +3849,6 @@
       "android/java/src/org/chromium/base/PowerMonitor.java",
       "android/java/src/org/chromium/base/Promise.java",
       "android/java/src/org/chromium/base/RadioUtils.java",
-      "android/java/src/org/chromium/base/SecureRandomInitializer.java",
       "android/java/src/org/chromium/base/StreamUtil.java",
       "android/java/src/org/chromium/base/StrictModeContext.java",
       "android/java/src/org/chromium/base/SysUtils.java",
diff --git a/base/android/java/src/org/chromium/base/SecureRandomInitializer.java b/base/android/java/src/org/chromium/base/SecureRandomInitializer.java
deleted file mode 100644
index bfd7b49..0000000
--- a/base/android/java/src/org/chromium/base/SecureRandomInitializer.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base;
-
-import android.annotation.SuppressLint;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.security.SecureRandom;
-
-/**
- * This class contains code to initialize a SecureRandom generator securely on Android platforms
- * <= 4.3. See
- * {@link http://android-developers.blogspot.com/2013/08/some-securerandom-thoughts.html}.
- */
-// TODO(crbug.com/635567): Fix this properly.
-@SuppressLint("SecureRandom")
-public class SecureRandomInitializer {
-    private static final int NUM_RANDOM_BYTES = 16;
-
-    /**
-     * Safely initializes the random number generator, by seeding it with data from /dev/urandom.
-     */
-    public static void initialize(SecureRandom generator) throws IOException {
-        try (FileInputStream fis = new FileInputStream("/dev/urandom")) {
-            byte[] seedBytes = new byte[NUM_RANDOM_BYTES];
-            if (fis.read(seedBytes) != seedBytes.length) {
-                throw new IOException("Failed to get enough random data.");
-            }
-            generator.setSeed(seedBytes);
-        }
-    }
-}
diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
index 96de64c29..45ce573 100644
--- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
+++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java
@@ -814,19 +814,7 @@
             throw new ProcessInitException(LoaderErrors.FAILED_TO_REGISTER_JNI);
         }
 
-        // Check that the version of the library we have loaded matches the version we expect
-        if (!NativeLibraries.sVersionNumber.equals(LibraryLoaderJni.get().getVersionNumber())) {
-            Log.e(TAG,
-                    "Expected native library version number \"%s\", "
-                            + "actual native library version number \"%s\"",
-                    NativeLibraries.sVersionNumber, LibraryLoaderJni.get().getVersionNumber());
-            throw new ProcessInitException(LoaderErrors.NATIVE_LIBRARY_WRONG_VERSION);
-        } else {
-            // Log the version anyway as this is often helpful, but word it differently so it's
-            // clear that it isn't an error.
-            Log.i(TAG, "Loaded native library version number \"%s\"",
-                    NativeLibraries.sVersionNumber);
-        }
+        Log.i(TAG, "Successfully loaded native library");
         UmaRecorderHolder.onLibraryLoaded();
 
         // From now on, keep tracing in sync with native.
@@ -915,9 +903,5 @@
 
         // Records the number of milliseconds it took to load the libraries in the renderer.
         void recordRendererLibraryLoadTime(long libraryLoadTime);
-
-        // Get the version of the native library. This is needed so that we can check we
-        // have the right version before initializing the (rest of the) JNI.
-        String getVersionNumber();
     }
 }
diff --git a/base/android/library_loader/library_loader_hooks.cc b/base/android/library_loader/library_loader_hooks.cc
index b9c139a..12ca3f7 100644
--- a/base/android/library_loader/library_loader_hooks.cc
+++ b/base/android/library_loader/library_loader_hooks.cc
@@ -131,10 +131,6 @@
   g_library_version_number = strdup(version_number);
 }
 
-ScopedJavaLocalRef<jstring> JNI_LibraryLoader_GetVersionNumber(JNIEnv* env) {
-  return ConvertUTF8ToJavaString(env, g_library_version_number);
-}
-
 void InitAtExitManager() {
   g_at_exit_manager = new base::AtExitManager();
 }
diff --git a/base/android/library_loader/library_loader_hooks.h b/base/android/library_loader/library_loader_hooks.h
index c697421..5cc5af9 100644
--- a/base/android/library_loader/library_loader_hooks.h
+++ b/base/android/library_loader/library_loader_hooks.h
@@ -77,12 +77,6 @@
 
 BASE_EXPORT void SetLibraryLoadedHook(LibraryLoadedHook* func);
 
-// Pass the version name to the loader. This used to check that the library
-// version matches the version expected by Java before completing JNI
-// registration.
-// Note: argument must remain valid at least until library loading is complete.
-BASE_EXPORT void SetVersionNumber(const char* version_number);
-
 // Call on exit to delete the AtExitManager which OnLibraryLoadedOnUIThread
 // created.
 BASE_EXPORT void LibraryLoaderExitHook();
diff --git a/base/message_loop/message_pump_kqueue.cc b/base/message_loop/message_pump_kqueue.cc
index 9f5582b1..a4e92956 100644
--- a/base/message_loop/message_pump_kqueue.cc
+++ b/base/message_loop/message_pump_kqueue.cc
@@ -379,11 +379,14 @@
     events_.resize(event_count_);
   }
 
-  bool poll = next_work_info == nullptr;
-  int flags = poll ? KEVENT_FLAG_IMMEDIATE : 0;
-  if (!poll && scheduled_wakeup_time_ != next_work_info->delayed_run_time) {
-    UpdateWakeupTimer(next_work_info->delayed_run_time);
+  bool immediate = next_work_info == nullptr;
+  int flags = immediate ? KEVENT_FLAG_IMMEDIATE : 0;
+
+  if (!immediate) {
+    if (scheduled_wakeup_time_ != next_work_info->delayed_run_time)
+      UpdateWakeupTimer(next_work_info->delayed_run_time);
     DCHECK_EQ(scheduled_wakeup_time_, next_work_info->delayed_run_time);
+    delegate->BeforeWait();
   }
 
   int rv = HANDLE_EINTR(kevent64(kqueue_.get(), nullptr, 0, events_.data(),
diff --git a/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc b/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
index d56f96da2..d3de5e2 100644
--- a/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
+++ b/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
@@ -58,6 +58,13 @@
   // will do all the clean-up.
   // ScopedSetSequenceLocalStorageMapForCurrentThread destructor will
   // de-register the current thread as a sequence.
+
+#if defined(OS_WIN)
+  if (main_thread_only().in_high_res_mode) {
+    main_thread_only().in_high_res_mode = false;
+    Time::ActivateHighResolutionTimer(false);
+  }
+#endif
 }
 
 // static
diff --git a/base/test/run_all_unittests.cc b/base/test/run_all_unittests.cc
index 0ad84ed5..07befc7d 100644
--- a/base/test/run_all_unittests.cc
+++ b/base/test/run_all_unittests.cc
@@ -5,10 +5,37 @@
 #include "base/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
+#include "base/time/time.h"
 #include "build/build_config.h"
 
+#if defined(OS_WIN)
+class TimerCheck : public testing::EmptyTestEventListener {
+ public:
+  void OnTestEnd(const testing::TestInfo& test_info) override {
+    EXPECT_FALSE(base::Time::IsHighResolutionTimerInUse());
+  }
+};
+#endif
+
+class BaseUnittestSuite : public base::TestSuite {
+ public:
+  BaseUnittestSuite(int argc, char** argv) : base::TestSuite(argc, argv) {}
+
+ protected:
+  void Initialize() override {
+    base::TestSuite::Initialize();
+
+#if defined(OS_WIN)
+    // Add TestEventListeners to enforce certain properties across tests.
+    testing::TestEventListeners& listeners =
+        testing::UnitTest::GetInstance()->listeners();
+    listeners.Append(new TimerCheck);
+#endif
+  }
+};
+
 int main(int argc, char** argv) {
-  base::TestSuite test_suite(argc, argv);
+  BaseUnittestSuite test_suite(argc, argv);
   return base::LaunchUnitTests(
       argc, argv,
       base::BindOnce(&base::TestSuite::Run, base::Unretained(&test_suite)));
diff --git a/base/threading/platform_thread_posix.cc b/base/threading/platform_thread_posix.cc
index f7a2957..699ee8f 100644
--- a/base/threading/platform_thread_posix.cc
+++ b/base/threading/platform_thread_posix.cc
@@ -16,8 +16,6 @@
 #include <memory>
 
 #include "base/allocator/buildflags.h"
-#include "base/allocator/partition_allocator/starscan/pcscan.h"
-#include "base/allocator/partition_allocator/starscan/stack/stack.h"
 #include "base/debug/activity_tracker.h"
 #include "base/lazy_instance.h"
 #include "base/logging.h"
@@ -41,6 +39,11 @@
 #include <sys/resource.h>
 #endif
 
+#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
+#include "base/allocator/partition_allocator/starscan/pcscan.h"
+#include "base/allocator/partition_allocator/starscan/stack/stack.h"
+#endif
+
 namespace base {
 
 void InitThreading();
diff --git a/base/threading/platform_thread_win.cc b/base/threading/platform_thread_win.cc
index 0a87864..7a73defa4 100644
--- a/base/threading/platform_thread_win.cc
+++ b/base/threading/platform_thread_win.cc
@@ -7,8 +7,6 @@
 #include <stddef.h>
 
 #include "base/allocator/buildflags.h"
-#include "base/allocator/partition_allocator/starscan/pcscan.h"
-#include "base/allocator/partition_allocator/starscan/stack/stack.h"
 #include "base/debug/activity_tracker.h"
 #include "base/debug/alias.h"
 #include "base/debug/crash_logging.h"
@@ -29,6 +27,11 @@
 
 #include <windows.h>
 
+#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
+#include "base/allocator/partition_allocator/starscan/pcscan.h"
+#include "base/allocator/partition_allocator/starscan/stack/stack.h"
+#endif
+
 namespace base {
 
 namespace {
diff --git a/base/threading/thread_restrictions.h b/base/threading/thread_restrictions.h
index 71b0673a..8fcc0c8 100644
--- a/base/threading/thread_restrictions.h
+++ b/base/threading/thread_restrictions.h
@@ -116,6 +116,7 @@
 }
 namespace ash {
 class MojoUtils;
+class BrowserDataMigrator;
 }
 namespace audio {
 class OutputDevice;
@@ -399,6 +400,7 @@
   friend class StackSamplingProfiler;
   friend class android_webview::ScopedAllowInitGLBindings;
   friend class ash::MojoUtils;  // http://crbug.com/1055467
+  friend class ash::BrowserDataMigrator;
   friend class blink::DiskDataAllocator;
   friend class content::BrowserProcessSubThread;
   friend class content::NetworkServiceInstancePrivate;
diff --git a/build/android/PRESUBMIT.py b/build/android/PRESUBMIT.py
index 70e048b7..2cf0602c 100644
--- a/build/android/PRESUBMIT.py
+++ b/build/android/PRESUBMIT.py
@@ -105,7 +105,8 @@
               J('pylib', 'utils', 'test_filter_test.py'),
               J('.', 'convert_dex_profile_tests.py'),
           ],
-          env=pylib_test_env))
+          env=pylib_test_env,
+          run_on_python2=False))
 
   return input_api.RunTests(tests)
 
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py
index 822427e..8a668e7 100755
--- a/build/android/gyp/compile_resources.py
+++ b/build/android/gyp/compile_resources.py
@@ -1,5 +1,5 @@
-#!/usr/bin/env python
-# encoding: utf-8
+#!/usr/bin/env python3
+#
 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
@@ -317,7 +317,7 @@
     * Modern ISO 639-1 codes will be renamed to their obsolete variant
       for Indonesian, Hebrew and Yiddish (e.g. 'values-in/ -> values-id/).
 
-    * Norwegian macrolanguage strings will be renamed to Bokmål (main
+    * Norwegian macrolanguage strings will be renamed to Bokmal (main
       Norway language). See http://crbug.com/920960. In practice this
       means that 'values-no/ -> values-nb/' unless 'values-nb/' already
       exists.
diff --git a/build/android/gyp/compile_resources.pydeps b/build/android/gyp/compile_resources.pydeps
index 9824256..174b5269 100644
--- a/build/android/gyp/compile_resources.pydeps
+++ b/build/android/gyp/compile_resources.pydeps
@@ -2,6 +2,8 @@
 #   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/compile_resources.pydeps build/android/gyp/compile_resources.py
 ../../../third_party/jinja2/__init__.py
 ../../../third_party/jinja2/_compat.py
+../../../third_party/jinja2/asyncfilters.py
+../../../third_party/jinja2/asyncsupport.py
 ../../../third_party/jinja2/bccache.py
 ../../../third_party/jinja2/compiler.py
 ../../../third_party/jinja2/defaults.py
diff --git a/build/android/gyp/create_app_bundle.py b/build/android/gyp/create_app_bundle.py
index afb5672..0b44c16 100755
--- a/build/android/gyp/create_app_bundle.py
+++ b/build/android/gyp/create_app_bundle.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 #
 # Copyright 2018 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
@@ -7,12 +7,10 @@
 """Create an Android application bundle from one or more bundle modules."""
 
 import argparse
-import itertools
 import json
 import os
 import shutil
 import sys
-import tempfile
 import zipfile
 
 sys.path.append(
@@ -376,7 +374,7 @@
       if not os.path.exists(module_pathmap_path):
         continue
       module_pathmap = _LoadPathmap(module_pathmap_path)
-      for short_path, long_path in module_pathmap.iteritems():
+      for short_path, long_path in module_pathmap.items():
         rebased_long_path = '{}/{}'.format(module_name, long_path)
         rebased_short_path = '{}/{}'.format(module_name, short_path)
         line = '{} -> {}\n'.format(rebased_long_path, rebased_short_path)
diff --git a/build/android/gyp/create_app_bundle.pydeps b/build/android/gyp/create_app_bundle.pydeps
index 1155e44..cbb471a 100644
--- a/build/android/gyp/create_app_bundle.pydeps
+++ b/build/android/gyp/create_app_bundle.pydeps
@@ -14,6 +14,8 @@
 ../../../third_party/catapult/devil/devil/utils/cmd_helper.py
 ../../../third_party/jinja2/__init__.py
 ../../../third_party/jinja2/_compat.py
+../../../third_party/jinja2/asyncfilters.py
+../../../third_party/jinja2/asyncsupport.py
 ../../../third_party/jinja2/bccache.py
 ../../../third_party/jinja2/compiler.py
 ../../../third_party/jinja2/defaults.py
diff --git a/build/android/gyp/extract_unwind_tables_tests.py b/build/android/gyp/extract_unwind_tables_tests.py
index 7f9d0de7..59436ff 100755
--- a/build/android/gyp/extract_unwind_tables_tests.py
+++ b/build/android/gyp/extract_unwind_tables_tests.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # Copyright 2018 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
@@ -63,7 +63,8 @@
 STACK CFI INIT 3b93214 fffff .cfa: sp 0 + .ra: lr
 STACK CFI 3b93218 .cfa: r7 16 + .ra: .cfa -4 + ^
 """.splitlines()
-      extract_unwind_tables._ParseCfiData(test_data_lines, output_file.name)
+      extract_unwind_tables._ParseCfiData(
+          [l.encode('utf8') for l in test_data_lines], output_file.name)
 
       expected_cfi_data = {
         0xe1a1e4 : [0x2, 0x11, 0x4, 0x50],
@@ -109,8 +110,8 @@
 
         func_start = index + 1
         func_end = func_start + unw_data[index] * 2
-        self.assertEquals(
-            len(expected_cfi_data[func_addr]), func_end - func_start)
+        self.assertEqual(len(expected_cfi_data[func_addr]),
+                         func_end - func_start)
         func_cfi = unw_data[func_start : func_end]
         self.assertEqual(expected_cfi_data[func_addr], func_cfi)
 
diff --git a/build/android/gyp/util/diff_utils.py b/build/android/gyp/util/diff_utils.py
old mode 100755
new mode 100644
index a109100..530a688
--- a/build/android/gyp/util/diff_utils.py
+++ b/build/android/gyp/util/diff_utils.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-#
 # Copyright 2019 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
@@ -119,8 +117,11 @@
 
     sys.stderr.write(fail_msg)
 
+  if fail_msg and options.fail_on_expectations:
+    # Don't write failure file when failing on expectations or else the target
+    # will not be re-run on subsequent ninja invocations.
+    sys.exit(1)
+
   if options.failure_file:
     with open(options.failure_file, 'w') as f:
       f.write(fail_msg)
-  if fail_msg and options.fail_on_expectations:
-    sys.exit(1)
diff --git a/build/android/gyp/util/manifest_utils.py b/build/android/gyp/util/manifest_utils.py
index 1a354b9a..a517708b 100644
--- a/build/android/gyp/util/manifest_utils.py
+++ b/build/android/gyp/util/manifest_utils.py
@@ -8,6 +8,7 @@
 import os
 import re
 import shlex
+import sys
 import xml.dom.minidom as minidom
 
 from util import build_utils
@@ -123,7 +124,12 @@
 
 
 def _SortAndStripElementTree(root):
-  def sort_key(node):
+  # Sort alphabetically with two exceptions:
+  # 1) Put <application> node last (since it's giant).
+  # 2) Put android:name before other attributes.
+  def element_sort_key(node):
+    if node.tag == 'application':
+      return 'z'
     ret = ElementTree.tostring(node)
     # ElementTree.tostring inserts namespace attributes for any that are needed
     # for the node or any of its descendants. Remove them so as to prevent a
@@ -131,30 +137,24 @@
     # order.
     return re.sub(r' xmlns:.*?".*?"', '', ret.decode('utf8'))
 
+  name_attr = '{%s}name' % ANDROID_NAMESPACE
+
+  def attribute_sort_key(tup):
+    return ('', '') if tup[0] == name_attr else tup
+
   def helper(node):
     for child in node:
       if child.text and child.text.isspace():
         child.text = None
       helper(child)
-    node[:] = sorted(node, key=sort_key)
 
-  def rename_attrs(node, from_name, to_name):
-    value = node.attrib.get(from_name)
-    if value is not None:
-      node.attrib[to_name] = value
-      del node.attrib[from_name]
-    for child in node:
-      rename_attrs(child, from_name, to_name)
+    # Sort attributes (requires Python 3.8+).
+    node.attrib = dict(sorted(node.attrib.items(), key=attribute_sort_key))
 
-  # Sort alphabetically with two exceptions:
-  # 1) Put <application> node last (since it's giant).
-  # 2) Pretend android:name appears before other attributes.
-  app_node = root.find('application')
-  app_node.tag = 'zz'
-  rename_attrs(root, '{%s}name' % ANDROID_NAMESPACE, '__name__')
+    # Sort nodes
+    node[:] = sorted(node, key=element_sort_key)
+
   helper(root)
-  rename_attrs(root, '__name__', '{%s}name' % ANDROID_NAMESPACE)
-  app_node.tag = 'application'
 
 
 def _SplitElement(line):
@@ -269,7 +269,7 @@
     # Trichrome's static library version number is updated daily. To avoid
     # frequent manifest check failures, we remove the exact version number
     # during normalization.
-    for node in app_node.getchildren():
+    for node in app_node:
       if (node.tag in ['uses-static-library', 'static-library']
           and '{%s}version' % ANDROID_NAMESPACE in node.keys()
           and '{%s}name' % ANDROID_NAMESPACE in node.keys()):
@@ -281,14 +281,14 @@
     for key in node.keys():
       node.set(key, node.get(key).replace(package, '$PACKAGE'))
 
-    for child in node.getchildren():
+    for child in node:
       blur_package_name(child)
 
   # We only blur the package names of non-root nodes because they generate a lot
   # of diffs when doing manifest checks for upstream targets. We still want to
   # have 1 piece of package name not blurred just in case the package name is
   # mistakenly changed.
-  for child in root.getchildren():
+  for child in root:
     blur_package_name(child)
 
   _SortAndStripElementTree(root)
diff --git a/build/android/gyp/util/manifest_utils_test.py b/build/android/gyp/util/manifest_utils_test.py
index 3423e5b..52bf458 100755
--- a/build/android/gyp/util/manifest_utils_test.py
+++ b/build/android/gyp/util/manifest_utils_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env vpython
+#!/usr/bin/env python3
 # Copyright 2020 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
@@ -49,18 +49,18 @@
 _TEST_MANIFEST_NORMALIZED = """\
 <?xml version="1.0" ?>
 <manifest
-    package="test.pkg"
-    tools:ignore="MissingVersion"
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
+    xmlns:tools="http://schemas.android.com/tools"
+    package="test.pkg"
+    tools:ignore="MissingVersion">
   <uses-feature android:name="android.hardware.vr.headtracking" \
 android:required="false" android:version="1"/>
   <uses-sdk android:minSdkVersion="24" android:targetSdkVersion="30"/>
   <application android:name="testname">
     <activity  # DIFF-ANCHOR: {activity_diff_anchor}
+        android:name="to be hashed"
         {extra_activity_attr}android:icon="@drawable/ic_devices_48dp"
         android:label="label with spaces"
-        android:name="to be hashed"
         android:theme="@style/Theme.Chromium.Activity.TranslucentNoAnimations">
       <intent-filter>  # DIFF-ANCHOR: {intent_filter_diff_anchor}
         {extra_intent_filter_elem}\
@@ -69,11 +69,11 @@
         <data android:mimeType="text/plain"/>
       </intent-filter>  # DIFF-ANCHOR: {intent_filter_diff_anchor}
     </activity>  # DIFF-ANCHOR: {activity_diff_anchor}
-    <receiver  # DIFF-ANCHOR: 355000d2
-        android:exported="false"
+    <receiver  # DIFF-ANCHOR: ddab3320
         android:name=\
-"org.chromium.chrome.browser.announcement.AnnouncementNotificationManager$Rcvr">
-    </receiver>  # DIFF-ANCHOR: 355000d2
+"org.chromium.chrome.browser.announcement.AnnouncementNotificationManager$Rcvr"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: ddab3320
   </application>
 </manifest>
 """
diff --git a/build/android/gyp/util/resource_utils.py b/build/android/gyp/util/resource_utils.py
index d801532..263b7c2 100644
--- a/build/android/gyp/util/resource_utils.py
+++ b/build/android/gyp/util/resource_utils.py
@@ -1035,7 +1035,7 @@
     for name, utf8_text in sorted(names_to_utf8_text.items()):
       result += '<string name="%s">"%s"</string>\n' % (name, utf8_text)
   result += '</resources>\n'
-  return result
+  return result.encode('utf8')
 
 
 def FilterAndroidResourceStringsXml(xml_file_path, string_predicate):
@@ -1055,7 +1055,7 @@
   strings_map, namespaces = ParseAndroidResourceStringsFromXml(xml_data)
 
   string_deletion = False
-  for name in strings_map.keys():
+  for name in list(strings_map.keys()):
     if not string_predicate(name):
       del strings_map[name]
       string_deletion = True
diff --git a/build/android/gyp/util/resource_utils_test.py b/build/android/gyp/util/resource_utils_test.py
index 42a8356..62d5b43 100755
--- a/build/android/gyp/util/resource_utils_test.py
+++ b/build/android/gyp/util/resource_utils_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env vpython
+#!/usr/bin/env python3
 # coding: utf-8
 # Copyright 2018 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
@@ -171,7 +171,7 @@
         'yi': 'ji'
     }
     for chromium_locale, android_locale in \
-        _TEST_CHROMIUM_TO_ANDROID_LOCALE_MAP.iteritems():
+        _TEST_CHROMIUM_TO_ANDROID_LOCALE_MAP.items():
       result = resource_utils.ToAndroidLocaleName(chromium_locale)
       self.assertEqual(result, android_locale)
 
@@ -209,7 +209,7 @@
         'no': 'nb',  # http://crbug.com/920960
     }
     for android_locale, chromium_locale in \
-        _TEST_ANDROID_TO_CHROMIUM_LOCALE_MAP.iteritems():
+        _TEST_ANDROID_TO_CHROMIUM_LOCALE_MAP.items():
       result = resource_utils.ToChromiumLocaleName(android_locale)
       self.assertEqual(result, chromium_locale)
 
@@ -240,18 +240,18 @@
   def test_GenerateAndroidResourceStringsXml(self):
     # Fist, an empty strings map, with no namespaces
     result = resource_utils.GenerateAndroidResourceStringsXml({})
-    self.assertEqual(result, _TEST_XML_OUTPUT_EMPTY)
+    self.assertEqual(result.decode('utf8'), _TEST_XML_OUTPUT_EMPTY)
 
     result = resource_utils.GenerateAndroidResourceStringsXml(
         _TEST_RESOURCES_MAP_1, _TEST_NAMESPACES_1)
-    self.assertEqual(result, _TEST_XML_INPUT_1)
+    self.assertEqual(result.decode('utf8'), _TEST_XML_INPUT_1)
 
   @staticmethod
   def _CreateTestResourceFile(output_dir, locale, string_map, namespaces):
     values_dir = os.path.join(output_dir, 'values-' + locale)
     build_utils.MakeDirectory(values_dir)
     file_path = os.path.join(values_dir, 'strings.xml')
-    with open(file_path, 'w') as f:
+    with open(file_path, 'wb') as f:
       file_data = resource_utils.GenerateAndroidResourceStringsXml(
           string_map, namespaces)
       f.write(file_data)
diff --git a/build/android/gyp/write_native_libraries_java.py b/build/android/gyp/write_native_libraries_java.py
index a0d9906..58754d4 100755
--- a/build/android/gyp/write_native_libraries_java.py
+++ b/build/android/gyp/write_native_libraries_java.py
@@ -11,10 +11,36 @@
 import sys
 import zipfile
 
-from native_libraries_template import NATIVE_LIBRARIES_TEMPLATE
 from util import build_utils
 
 
+_NATIVE_LIBRARIES_TEMPLATE = """\
+// This file is autogenerated by
+//     build/android/gyp/write_native_libraries_java.py
+// Please do not change its content.
+
+package org.chromium.build;
+
+public class NativeLibraries {{
+    public static final int CPU_FAMILY_UNKNOWN = 0;
+    public static final int CPU_FAMILY_ARM = 1;
+    public static final int CPU_FAMILY_MIPS = 2;
+    public static final int CPU_FAMILY_X86 = 3;
+
+    // Set to true to enable the use of the Chromium Linker.
+    public static {MAYBE_FINAL}boolean sUseLinker{USE_LINKER};
+    public static {MAYBE_FINAL}boolean sUseLibraryInZipFile{USE_LIBRARY_IN_ZIP_FILE};
+    public static {MAYBE_FINAL}boolean sUseModernLinker{USE_MODERN_LINKER};
+
+    // This is the list of native libraries to be loaded (in the correct order)
+    // by LibraryLoader.java.
+    public static {MAYBE_FINAL}String[] LIBRARIES = {{{LIBRARIES}}};
+
+    public static {MAYBE_FINAL}int sCpuFamily = {CPU_FAMILY};
+}}
+"""
+
+
 def _FormatLibraryName(library_name):
   filename = os.path.split(library_name)[1]
   assert filename.startswith('lib')
@@ -41,10 +67,6 @@
   parser.add_argument(
       '--native-libraries-list', help='File with list of native libraries.')
   parser.add_argument(
-      '--version-number',
-      default='""',
-      help='Expected version of main library.')
-  parser.add_argument(
       '--cpu-family',
       choices={
           'CPU_FAMILY_ARM', 'CPU_FAMILY_X86', 'CPU_FAMILY_MIPS',
@@ -88,7 +110,6 @@
       'USE_LIBRARY_IN_ZIP_FILE': bool_str(options.load_library_from_apk),
       'USE_MODERN_LINKER': bool_str(options.use_modern_linker),
       'LIBRARIES': ','.join(native_libraries_list),
-      'VERSION_NUMBER': options.version_number,
       'CPU_FAMILY': options.cpu_family,
   }
   with build_utils.AtomicOutput(options.output) as f:
@@ -96,7 +117,7 @@
       build_utils.AddToZipHermetic(
           zip_file=srcjar_file,
           zip_path='org/chromium/build/NativeLibraries.java',
-          data=NATIVE_LIBRARIES_TEMPLATE.format(**format_dict))
+          data=_NATIVE_LIBRARIES_TEMPLATE.format(**format_dict))
 
   if options.depfile:
     assert options.native_libraries_list
diff --git a/build/android/gyp/write_native_libraries_java.pydeps b/build/android/gyp/write_native_libraries_java.pydeps
index 47074859..f5176ef78 100644
--- a/build/android/gyp/write_native_libraries_java.pydeps
+++ b/build/android/gyp/write_native_libraries_java.pydeps
@@ -1,7 +1,6 @@
 # Generated by running:
 #   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/write_native_libraries_java.pydeps build/android/gyp/write_native_libraries_java.py
 ../../gn_helpers.py
-native_libraries_template.py
 util/__init__.py
 util/build_utils.py
 write_native_libraries_java.py
diff --git a/build/android/pylib/utils/dexdump.py b/build/android/pylib/utils/dexdump.py
index d0dfee4..f81ac60 100644
--- a/build/android/pylib/utils/dexdump.py
+++ b/build/android/pylib/utils/dexdump.py
@@ -50,8 +50,12 @@
       BAD_XML_CHARS = re.compile(
           u'[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f-\x84\x86-\x9f' +
           u'\ud800-\udfff\ufdd0-\ufddf\ufffe-\uffff]')
-      decoded_xml = output_xml.decode('utf-8', 'replace')
-      clean_xml = BAD_XML_CHARS.sub(u'\ufffd', decoded_xml)
+      if sys.version_info[0] < 3:
+        decoded_xml = output_xml.decode('utf-8', 'replace')
+        clean_xml = BAD_XML_CHARS.sub(u'\ufffd', decoded_xml)
+      else:
+        # Line duplicated to avoid pylint redefined-variable-type error.
+        clean_xml = BAD_XML_CHARS.sub(u'\ufffd', output_xml)
       parsed_dex_files.append(
           _ParseRootNode(ElementTree.fromstring(clean_xml.encode('utf-8'))))
     return parsed_dex_files
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 3328363..06c0702f 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -2590,8 +2590,6 @@
       _expectations_target =
           "${invoker.top_target_name}_validate_android_manifest"
       action_with_pydeps(_expectations_target) {
-        # TODO(crbug.com/1187279): Get this to work under Python3.
-        run_under_python2 = true
         _actual_file = "${invoker.android_manifest}.normalized"
         _failure_file =
             "$expectations_failure_dir/" +
@@ -2644,8 +2642,6 @@
     }
 
     action_with_pydeps(target_name) {
-      # TODO(crbug.com/1187279): Get this to work under Python3.
-      run_under_python2 = true
       script = _script
       depfile = "$target_gen_dir/${target_name}.d"
       inputs = _inputs
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 1f75603f..e52396bf 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -724,12 +724,6 @@
           "--native-libraries-list",
           rebase_path(invoker.native_libraries_list_file, root_build_dir),
         ]
-        if (defined(invoker.version_number)) {
-          args += [
-            "--version-number",
-            invoker.version_number,
-          ]
-        }
         if (defined(invoker.main_component_library)) {
           args += [
             "--main-component-library",
@@ -2643,13 +2637,6 @@
     if (_generate_native_libraries_java) {
       write_native_libraries_java("${_template_name}__native_libraries") {
         forward_variables_from(invoker, [ "main_component_library" ])
-        deps = []
-        if (defined(invoker.native_lib_version_rule)) {
-          deps += [ invoker.native_lib_version_rule ]
-        }
-        if (defined(invoker.native_lib_version_arg)) {
-          version_number = invoker.native_lib_version_arg
-        }
 
         # Do not add a dep on the generated_file target in order to avoid having
         # to build the native libraries before this target. The dependency is
@@ -2665,13 +2652,6 @@
         use_final_fields = true
       }
       _srcjar_deps += [ ":${_template_name}__native_libraries" ]
-    } else {
-      if (defined(invoker.native_lib_version_arg)) {
-        not_needed(invoker, [ "native_lib_version_arg" ])
-      }
-      if (defined(invoker.native_lib_version_rule)) {
-        not_needed(invoker, [ "native_lib_version_rule" ])
-      }
     }
 
     _loadable_modules = []
@@ -3490,8 +3470,6 @@
                                "main_component_library",
                                "min_sdk_version",
                                "native_lib_placeholders",
-                               "native_lib_version_arg",
-                               "native_lib_version_rule",
                                "never_incremental",
                                "no_xml_namespaces",
                                "png_to_webp",
@@ -3623,8 +3601,6 @@
                                "max_sdk_version",
                                "min_sdk_version",
                                "native_lib_placeholders",
-                               "native_lib_version_arg",
-                               "native_lib_version_rule",
                                "no_xml_namespaces",
                                "package_id",
                                "package_name",
@@ -4841,8 +4817,6 @@
 
     _bundle_target_name = "${_target_name}__bundle"
     action_with_pydeps(_bundle_target_name) {
-      # TODO(crbug.com/1187279): Get this to work under Python3.
-      run_under_python2 = true
       script = "//build/android/gyp/create_app_bundle.py"
       inputs = _all_module_zip_paths + _all_module_build_configs
       outputs = [ _bundle_path ]
diff --git a/build/config/fuchsia/generate_runner_scripts.gni b/build/config/fuchsia/generate_runner_scripts.gni
index 0f6cd35..7fac16f 100644
--- a/build/config/fuchsia/generate_runner_scripts.gni
+++ b/build/config/fuchsia/generate_runner_scripts.gni
@@ -142,7 +142,12 @@
       "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/fvm",
       "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/merkleroot",
       "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/pm",
+
+      # TODO(crbug.com/1162314) Remove "symbolize" when transition to
+      # "symbolizer" is complete.
       "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/symbolize",
+
+      "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/symbolizer",
       "//third_party/fuchsia-sdk/sdk/tools/${test_host_cpu}/zbi",
     ]
 
diff --git a/build/fuchsia/symbolizer.py b/build/fuchsia/symbolizer.py
index 7db9fc9f..c2d34de 100644
--- a/build/fuchsia/symbolizer.py
+++ b/build/fuchsia/symbolizer.py
@@ -4,44 +4,12 @@
 
 import logging
 import os
-import re
 import subprocess
 
 from common import SDK_ROOT
 from common import GetHostArchFromPlatform
 from common import GetHostToolPathFromPlatform
 
-# Paths to the llvm-symbolizer executable in different test hosts.
-X64_LLVM_SYMBOLIZER_PATH = os.path.join(SDK_ROOT, os.pardir, os.pardir,
-                                        'llvm-build', 'Release+Asserts', 'bin',
-                                        'llvm-symbolizer')
-ARM64_XENIAL_LLVM_SYMBOLIZER_PATH = os.path.join('/', 'usr', 'lib', 'llvm-3.8',
-                                                 'bin', 'llvm-symbolizer')
-ARM64_BIONIC_LLVM_SYMBOLIZER_PATH = os.path.join('/', 'usr', 'lib', 'llvm-6.0',
-                                                 'bin', 'llvm-symbolizer')
-
-
-def _GetLLVMSymbolizerPath():
-  """Determines the path to the LLVM symbolizer executable based on test host
-  architecture and Ubuntu distro."""
-
-  if GetHostArchFromPlatform() == 'x64':
-    return X64_LLVM_SYMBOLIZER_PATH
-
-  # Get distro codename from /etc/os-release.
-  with open(os.path.join('/', 'etc', 'os-release')) as os_release_file:
-    os_release_text = os_release_file.read()
-  version_codename_re = r'^VERSION_CODENAME=(?P<codename>[\w.-]+)$'
-  match = re.search(version_codename_re, os_release_text, re.MULTILINE)
-  codename = match.group('codename') if match else None
-
-  if codename == 'xenial':
-    return ARM64_XENIAL_LLVM_SYMBOLIZER_PATH
-  elif codename == 'bionic':
-    return ARM64_BIONIC_LLVM_SYMBOLIZER_PATH
-  else:
-    raise Exception('Unknown Ubuntu release "%s"' % codename)
-
 
 def BuildIdsPaths(package_paths):
   """Generates build ids paths for symbolizer processes."""
@@ -62,13 +30,13 @@
                   unstripped binaries on the filesystem.
   Returns a Popen object for the started process."""
 
-  symbolizer = GetHostToolPathFromPlatform('symbolize')
-  llvm_symbolizer_path = _GetLLVMSymbolizerPath()
-  symbolizer_cmd = [symbolizer,
-                    '-ids-rel', '-llvm-symbolizer', llvm_symbolizer_path,
-                    '-build-id-dir', os.path.join(SDK_ROOT, '.build-id')]
+  symbolizer = GetHostToolPathFromPlatform('symbolizer')
+  symbolizer_cmd = [
+      symbolizer, '--build-id-dir',
+      os.path.join(SDK_ROOT, '.build-id')
+  ]
   for build_ids_file in build_ids_files:
-    symbolizer_cmd.extend(['-ids', build_ids_file])
+    symbolizer_cmd.extend(['--ids-txt', build_ids_file])
 
   logging.info('Running "%s".' % ' '.join(symbolizer_cmd))
   return subprocess.Popen(symbolizer_cmd, stdin=input_file, stdout=output_file,
diff --git a/build/print_python_deps.py b/build/print_python_deps.py
index d8fd731b..e567834 100755
--- a/build/print_python_deps.py
+++ b/build/print_python_deps.py
@@ -182,6 +182,12 @@
     vpython_to_use = {2: 'vpython', 3: 'vpython3'}[target_version]
     os.execvp(vpython_to_use, [vpython_to_use] + sys.argv + ['--did-relaunch'])
 
+  if current_version == 3:
+    # Work-around for protobuf library not being loadable via importlib
+    # This is needed due to compile_resources.py.
+    import importlib._bootstrap_external
+    importlib._bootstrap_external._NamespacePath.sort = lambda self, **_: 0
+
   paths_set = set()
   try:
     for module in modules:
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni
index 9153f5f..f1cb16b 100644
--- a/chrome/android/chrome_public_apk_tmpl.gni
+++ b/chrome/android/chrome_public_apk_tmpl.gni
@@ -189,14 +189,6 @@
 
     short_resource_paths = true
 
-    if ((defined(shared_libraries) && shared_libraries != []) ||
-        (defined(secondary_abi_shared_libraries) &&
-         secondary_abi_shared_libraries != [])) {
-      _native_lib_file =
-          rebase_path("$root_gen_dir/CHROME_VERSION.json", root_out_dir)
-      native_lib_version_arg = "@FileArg($_native_lib_file:full-quoted)"
-      native_lib_version_rule = "//build/util:chrome_version_json"
-    }
     if (!defined(aapt_locale_allowlist)) {
       if (target_type == "android_apk") {
         # For APKs, do not include the resource strings files from our
diff --git a/chrome/android/expectations/lint-suppressions.xml b/chrome/android/expectations/lint-suppressions.xml
index b884b29..c6c4410 100644
--- a/chrome/android/expectations/lint-suppressions.xml
+++ b/chrome/android/expectations/lint-suppressions.xml
@@ -266,16 +266,12 @@
     <ignore regexp="The resource `R.string.price_drop_alerts_card_get_notified` appears to be unused"/>
     <ignore regexp="The resource `R.string.price_drop_alerts_card_go_to_settings_content` appears to be unused"/>
     <ignore regexp="The resource `R.string.price_drop_alerts_card_go_to_settings` appears to be unused"/>
-    <!-- 9: Temporarily suppressed until impelmentation is ready, see https://crbug.com/1195477 -->
-    <ignore regexp="The resource `R.string.merchant_viewer_message_title` appears to be unused"/>
-    <ignore regexp="The resource `R.string.merchant_viewer_message_action` appears to be unused"/>
+    <!-- 5: Temporarily suppressed until impelmentation is ready, see https://crbug.com/1195477 -->
     <ignore regexp="The resource `R.string.merchant_viewer_message_description_rating` appears to be unused"/>
-    <ignore regexp="The resource `R.plurals.merchant_viewer_message_description_reviews` appears to be unused"/>
-    <ignore regexp="The resource `R.string.merchant_viewer_message_rating_numerical` appears to be unused"/>
     <ignore regexp="The resource `R.string.merchant_viewer_message_rating_word` appears to be unused"/>
     <ignore regexp="The resource `R.plurals.accessibility_merchant_viewer_message_description` appears to be unused"/>
     <ignore regexp="The resource `R.string.accessibility_merchant_viewer_message_announcement` appears to be unused"/>
-    <ignore regexp="The resource `R.string.merchant_viewer_preview_sheet_title` appears to be unused"/>
+    <ignore regexp="The resource `R.string.merchant_viewer_message_rating_numerical` appears to be unused"/>
 
     <!--TODO(crbug.com/1198233): Remove this suppression when download later V2 is fully implemented.-->
     <ignore regexp="The resource `R.string.download_later_slow_network_subtitle` appears to be unused"/>
diff --git a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
index c01d991..8eb698b 100644
--- a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
+++ b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
@@ -1,16 +1,16 @@
 <?xml version="1.0" ?>
 <manifest
-    android:isolatedSplits="true"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="org.chromium.chrome.stable"
     platformBuildVersionCode="30"
     platformBuildVersionName="11"
-    tools:ignore="MissingVersion"
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
+    android:isolatedSplits="true"
+    tools:ignore="MissingVersion">
   <permission android:name="$PACKAGE.TOS_ACKED" android:protectionLevel="signatureOrSystem"/>
   <permission android:name="$PACKAGE.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
   <permission android:name="$PACKAGE.permission.CHILD_SERVICE" android:protectionLevel="signature"/>
-  <permission android:label="Debug web pages" android:name="$PACKAGE.permission.DEBUG" android:protectionLevel="signature"/>
+  <permission android:name="$PACKAGE.permission.DEBUG" android:label="Debug web pages" android:protectionLevel="signature"/>
   <permission android:name="$PACKAGE.permission.READ_WRITE_BOOKMARK_FOLDERS" android:protectionLevel="signatureOrSystem"/>
   <permission android:name="$PACKAGE.permission.TRANSLATE" android:protectionLevel="signature"/>
   <queries>  # DIFF-ANCHOR: 5a71ec1f
@@ -19,6 +19,7 @@
     </intent>  # DIFF-ANCHOR: 28c960ba
     <package android:name="com.google.ar.core"/>
   </queries>  # DIFF-ANCHOR: 5a71ec1f
+  <uses-feature android:glEsVersion="0x00020000"/>
   <uses-feature android:name="android.hardware.camera" android:required="false"/>
   <uses-feature android:name="android.hardware.location.gps" android:required="false"/>
   <uses-feature android:name="android.hardware.microphone" android:required="false"/>
@@ -29,7 +30,6 @@
   <uses-feature android:name="android.hardware.vr.headtracking" android:required="false" android:version="1"/>
   <uses-feature android:name="android.hardware.vr.high_performance" android:required="false"/>
   <uses-feature android:name="android.software.vr.mode" android:required="false"/>
-  <uses-feature android:glEsVersion="0x00020000"/>
   <uses-permission android:name="$PACKAGE.TOS_ACKED"/>
   <uses-permission android:name="$PACKAGE.permission.C2D_MESSAGE"/>
   <uses-permission android:name="$PACKAGE.permission.READ_WRITE_BOOKMARK_FOLDERS"/>
@@ -70,6 +70,7 @@
   <uses-permission-sdk-23 android:name="android.permission.USE_FINGERPRINT"/>
   <uses-sdk android:minSdkVersion="24" android:targetSdkVersion="30"/>
   <application
+      android:name="org.chromium.chrome.browser.base.SplitMonochromeApplication"
       android:allowAudioPlaybackCapture="false"
       android:allowBackup="false"
       android:appComponentFactory="org.chromium.chrome.browser.base.SplitCompatAppComponentFactory"
@@ -79,47 +80,46 @@
       android:largeHeap="false"
       android:manageSpaceActivity="@string/manage_space_activity"
       android:multiArch="true"
-      android:name="org.chromium.chrome.browser.base.SplitMonochromeApplication"
       android:networkSecurityConfig="@xml/network_security_config"
       android:roundIcon="@drawable/ic_launcher_round"
       android:supportsRtl="true"
       android:use32bitAbi="true"
       android:zygotePreloadName="org.chromium.content.app.ZygotePreload">
     <activity  # DIFF-ANCHOR: ea1a94af
-        android:exported="false"
         android:name="com.google.android.gms.common.api.GoogleApiActivity"
+        android:exported="false"
         android:theme="@android:style/Theme.Translucent.NoTitleBar">
     </activity>  # DIFF-ANCHOR: ea1a94af
     <activity  # DIFF-ANCHOR: a2bae37c
+        android:name="com.google.android.play.core.common.PlayCoreDialogWrapperActivity"
         android:enabled="false"
         android:exported="false"
-        android:name="com.google.android.play.core.common.PlayCoreDialogWrapperActivity"
         android:process=":playcore_dialog_wrapper_activity"
         android:stateNotNeeded="true"
         android:theme="@style/Theme.PlayCore.Transparent">
     </activity>  # DIFF-ANCHOR: a2bae37c
     <activity  # DIFF-ANCHOR: 53a4871f
+        android:name="com.google.android.play.core.missingsplits.PlayCoreMissingSplitsActivity"
         android:enabled="false"
         android:exported="false"
         android:launchMode="singleInstance"
-        android:name="com.google.android.play.core.missingsplits.PlayCoreMissingSplitsActivity"
         android:process=":playcore_missing_splits_activity"
         android:stateNotNeeded="true">
     </activity>  # DIFF-ANCHOR: 53a4871f
     <activity  # DIFF-ANCHOR: 28dc9019
+        android:name="com.google.ar.core.InstallActivity"
         android:configChanges="keyboardHidden|orientation|screenSize"
         android:excludeFromRecents="true"
         android:exported="false"
         android:launchMode="singleTop"
-        android:name="com.google.ar.core.InstallActivity"
         android:theme="@android:style/Theme.Material.Light.Dialog.Alert">
     </activity>  # DIFF-ANCHOR: 28dc9019
     <activity  # DIFF-ANCHOR: a4438884
+        android:name="org.chromium.android_webview.devui.MainActivity"
         android:exported="true"
         android:icon="@drawable/icon_webview"
         android:label="WebView DevTools"
         android:launchMode="singleTask"
-        android:name="org.chromium.android_webview.devui.MainActivity"
         android:process=":webview_apk"
         android:taskAffinity="$PACKAGE.org.chromium.android_webview.devui"
         android:theme="@style/Theme.DevUi.DayNight"
@@ -131,9 +131,9 @@
       </intent-filter>  # DIFF-ANCHOR: a167e73d
     </activity>  # DIFF-ANCHOR: a4438884
     <activity  # DIFF-ANCHOR: aeabab17
+        android:name="org.chromium.android_webview.nonembedded.LicenseActivity"
         android:exported="true"
         android:label="@string/license_activity_title"
-        android:name="org.chromium.android_webview.nonembedded.LicenseActivity"
         android:process=":webview_apk">
       <intent-filter>  # DIFF-ANCHOR: 23298d3b
         <action android:name="android.settings.WEBVIEW_LICENSE"/>
@@ -142,19 +142,19 @@
       <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED" android:value="true"/>
     </activity>  # DIFF-ANCHOR: aeabab17
     <activity  # DIFF-ANCHOR: 93d41352
+        android:name="org.chromium.chrome.browser.BrowserRestartActivity"
         android:excludeFromRecents="true"
         android:exported="false"
         android:launchMode="singleInstance"
-        android:name="org.chromium.chrome.browser.BrowserRestartActivity"
         android:process=":browser_restart_process"
         android:theme="@android:style/Theme.Translucent.NoTitleBar">
     </activity>  # DIFF-ANCHOR: 93d41352
     <activity  # DIFF-ANCHOR: 61b2c776
+        android:name="org.chromium.chrome.browser.ChromeTabbedActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:exported="true"
         android:hardwareAccelerated="false"
         android:launchMode="singleTask"
-        android:name="org.chromium.chrome.browser.ChromeTabbedActivity"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
         android:theme="@style/Theme.Chromium.TabbedMode"
@@ -166,11 +166,11 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: 61b2c776
     <activity  # DIFF-ANCHOR: 610e8ccf
+        android:name="org.chromium.chrome.browser.ChromeTabbedActivity2"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:exported="false"
         android:hardwareAccelerated="false"
         android:launchMode="singleTask"
-        android:name="org.chromium.chrome.browser.ChromeTabbedActivity2"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
         android:taskAffinity="$PACKAGE.ChromeTabbedActivity2"
@@ -183,23 +183,23 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: 610e8ccf
     <activity  # DIFF-ANCHOR: 76686af9
+        android:name="org.chromium.chrome.browser.LauncherShortcutActivity"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.LauncherShortcutActivity"
         android:taskAffinity=""
         android:theme="@android:style/Theme.NoDisplay">
     </activity>  # DIFF-ANCHOR: 76686af9
     <activity  # DIFF-ANCHOR: 9af505d2
+        android:name="org.chromium.chrome.browser.app.feedmanagement.FeedManagementActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.app.feedmanagement.FeedManagementActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
     </activity>  # DIFF-ANCHOR: 9af505d2
     <activity  # DIFF-ANCHOR: 78326aaf
+        android:name="org.chromium.chrome.browser.app.followmanagement.FollowManagementActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.app.followmanagement.FollowManagementActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
       <intent-filter>  # DIFF-ANCHOR: 0afe8981
@@ -208,38 +208,38 @@
       </intent-filter>  # DIFF-ANCHOR: 0afe8981
     </activity>  # DIFF-ANCHOR: 78326aaf
     <activity  # DIFF-ANCHOR: 50c7105b
+        android:name="org.chromium.chrome.browser.app.reengagement.ReengagementActivity"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.app.reengagement.ReengagementActivity"
         android:taskAffinity=""
         android:theme="@android:style/Theme.Translucent">
     </activity>  # DIFF-ANCHOR: 50c7105b
     <activity  # DIFF-ANCHOR: aeab60ac
+        android:name="org.chromium.chrome.browser.app.video_tutorials.VideoPlayerActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.app.video_tutorials.VideoPlayerActivity"
         android:screenOrientation="portrait"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         tools:ignore="LockedOrientationActivity">
     </activity>  # DIFF-ANCHOR: aeab60ac
     <activity  # DIFF-ANCHOR: 170e9f21
+        android:name="org.chromium.chrome.browser.app.video_tutorials.VideoTutorialListActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.app.video_tutorials.VideoTutorialListActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen">
     </activity>  # DIFF-ANCHOR: 170e9f21
     <activity  # DIFF-ANCHOR: da2eedc8
+        android:name="org.chromium.chrome.browser.bookmarks.BookmarkActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.bookmarks.BookmarkActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
     </activity>  # DIFF-ANCHOR: da2eedc8
     <activity  # DIFF-ANCHOR: a208e726
+        android:name="org.chromium.chrome.browser.bookmarks.BookmarkAddActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
         android:exported="true"
-        android:name="org.chromium.chrome.browser.bookmarks.BookmarkAddActivity"
         android:theme="@android:style/Theme.NoDisplay"
         android:windowSoftInputMode="stateHidden">
       <intent-filter>  # DIFF-ANCHOR: 47a8059b
@@ -248,35 +248,35 @@
       </intent-filter>  # DIFF-ANCHOR: 47a8059b
     </activity>  # DIFF-ANCHOR: a208e726
     <activity  # DIFF-ANCHOR: e0427380
+        android:name="org.chromium.chrome.browser.bookmarks.BookmarkAddEditFolderActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.bookmarks.BookmarkAddEditFolderActivity"
         android:theme="@style/Theme.Chromium.DialogWhenLarge">
     </activity>  # DIFF-ANCHOR: e0427380
     <activity  # DIFF-ANCHOR: b66ce3f2
+        android:name="org.chromium.chrome.browser.bookmarks.BookmarkEditActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
         android:label="@string/edit_bookmark"
-        android:name="org.chromium.chrome.browser.bookmarks.BookmarkEditActivity"
         android:theme="@style/Theme.Chromium.DialogWhenLarge"
         android:windowSoftInputMode="stateHidden">
     </activity>  # DIFF-ANCHOR: b66ce3f2
     <activity  # DIFF-ANCHOR: 0a21ad35
+        android:name="org.chromium.chrome.browser.bookmarks.BookmarkFolderSelectActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
         android:label="@string/bookmark_choose_folder"
-        android:name="org.chromium.chrome.browser.bookmarks.BookmarkFolderSelectActivity"
         android:theme="@style/Theme.Chromium.DialogWhenLarge"
         android:windowSoftInputMode="stateAlwaysHidden">
     </activity>  # DIFF-ANCHOR: 0a21ad35
     <activity  # DIFF-ANCHOR: 209b5ded
-        android:exported="false"
         android:name="org.chromium.chrome.browser.browserservices.ClearDataDialogActivity"
+        android:exported="false"
         android:theme="@style/Theme.Chromium.ClearDataDialogActivity">
     </activity>  # DIFF-ANCHOR: 209b5ded
     <activity  # DIFF-ANCHOR: 2b0ee4cd
-        android:exported="true"
         android:name="org.chromium.chrome.browser.browserservices.ManageTrustedWebActivityDataActivity"
+        android:exported="true"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen.Transparent">
       <intent-filter>  # DIFF-ANCHOR: 38d9d906
         <action android:name="android.support.customtabs.action.ACTION_MANAGE_TRUSTED_WEB_ACTIVITY_DATA"/>
@@ -289,10 +289,10 @@
       </intent-filter>  # DIFF-ANCHOR: 38d9d906
     </activity>  # DIFF-ANCHOR: 2b0ee4cd
     <activity  # DIFF-ANCHOR: 44266a6a
+        android:name="org.chromium.chrome.browser.customtabs.CustomTabActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:exported="false"
         android:hardwareAccelerated="false"
-        android:name="org.chromium.chrome.browser.customtabs.CustomTabActivity"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
         android:theme="@style/Theme.Chromium.Activity"
@@ -304,10 +304,10 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: 44266a6a
     <activity  # DIFF-ANCHOR: 4d923622
+        android:name="org.chromium.chrome.browser.customtabs.TranslucentCustomTabActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:exported="false"
         android:hardwareAccelerated="false"
-        android:name="org.chromium.chrome.browser.customtabs.TranslucentCustomTabActivity"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
         android:theme="@style/Theme.Chromium.Activity.FakeTranslucent"
@@ -319,62 +319,62 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: 4d923622
     <activity  # DIFF-ANCHOR: 1acdfd19
+        android:name="org.chromium.chrome.browser.document.ChromeLauncherActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:excludeFromRecents="true"
-        android:name="org.chromium.chrome.browser.document.ChromeLauncherActivity"
         android:relinquishTaskIdentity="true"
         android:taskAffinity=""
         android:theme="@style/LauncherTheme">
     </activity>  # DIFF-ANCHOR: 1acdfd19
     <activity  # DIFF-ANCHOR: 5c83a464
+        android:name="org.chromium.chrome.browser.download.DownloadActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.download.DownloadActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
     </activity>  # DIFF-ANCHOR: 5c83a464
     <activity  # DIFF-ANCHOR: 2121eb0d
+        android:name="org.chromium.chrome.browser.firstrun.FirstRunActivity"
         android:autoRemoveFromRecents="true"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
         android:label="@string/fre_activity_label"
         android:launchMode="singleTop"
-        android:name="org.chromium.chrome.browser.firstrun.FirstRunActivity"
         android:theme="@style/Theme.Chromium.DialogWhenLarge"
         android:windowSoftInputMode="stateHidden|adjustPan">
     </activity>  # DIFF-ANCHOR: 2121eb0d
     <activity  # DIFF-ANCHOR: 67932092
+        android:name="org.chromium.chrome.browser.firstrun.LightweightFirstRunActivity"
         android:autoRemoveFromRecents="true"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
         android:label="@string/fre_activity_label"
         android:launchMode="singleInstance"
-        android:name="org.chromium.chrome.browser.firstrun.LightweightFirstRunActivity"
         android:theme="@style/Theme.Chromium.AlertDialog.NoActionBar"
         android:windowSoftInputMode="stateHidden|adjustPan">
     </activity>  # DIFF-ANCHOR: 67932092
     <activity  # DIFF-ANCHOR: bb612a34
+        android:name="org.chromium.chrome.browser.firstrun.TabbedModeFirstRunActivity"
         android:autoRemoveFromRecents="true"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
         android:label="@string/fre_activity_label"
         android:launchMode="singleTop"
-        android:name="org.chromium.chrome.browser.firstrun.TabbedModeFirstRunActivity"
         android:theme="@style/Theme.Chromium.TabbedMode"
         android:windowSoftInputMode="stateHidden|adjustPan">
     </activity>  # DIFF-ANCHOR: bb612a34
     <activity  # DIFF-ANCHOR: 05911131
+        android:name="org.chromium.chrome.browser.history.HistoryActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.history.HistoryActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
     </activity>  # DIFF-ANCHOR: 05911131
     <activity  # DIFF-ANCHOR: b98302dc
+        android:name="org.chromium.chrome.browser.incognito.IncognitoTabLauncher"
         android:enabled="false"
         android:excludeFromRecents="true"
         android:exported="true"
-        android:name="org.chromium.chrome.browser.incognito.IncognitoTabLauncher"
         android:taskAffinity=""
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter>  # DIFF-ANCHOR: 8f811d02
@@ -383,17 +383,17 @@
       </intent-filter>  # DIFF-ANCHOR: 8f811d02
     </activity>  # DIFF-ANCHOR: b98302dc
     <activity  # DIFF-ANCHOR: 349d8ca5
+        android:name="org.chromium.chrome.browser.instantapps.AuthenticatedProxyActivity"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.instantapps.AuthenticatedProxyActivity"
         android:noHistory="true"
         android:theme="@android:style/Theme.NoDisplay">
     </activity>  # DIFF-ANCHOR: 349d8ca5
     <activity  # DIFF-ANCHOR: ecd48344
+        android:name="org.chromium.chrome.browser.media.MediaLauncherActivity"
         android:enabled="false"
         android:excludeFromRecents="true"
         android:exported="true"
-        android:name="org.chromium.chrome.browser.media.MediaLauncherActivity"
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter tools:ignore="AppLinkUrlError">  # DIFF-ANCHOR: 13c9b0a8
         <action android:name="android.intent.action.VIEW"/>
@@ -405,40 +405,40 @@
       </intent-filter>  # DIFF-ANCHOR: 13c9b0a8
     </activity>  # DIFF-ANCHOR: ecd48344
     <activity  # DIFF-ANCHOR: d706d96e
+        android:name="org.chromium.chrome.browser.media.PictureInPictureActivity"
         android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.media.PictureInPictureActivity"
         android:noHistory="true"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
         android:theme="@style/Theme.Chromium.Activity">
     </activity>  # DIFF-ANCHOR: d706d96e
     <activity  # DIFF-ANCHOR: 9023f153
+        android:name="org.chromium.chrome.browser.multiwindow.MultiInstanceChromeTabbedActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:exported="false"
         android:hardwareAccelerated="false"
-        android:name="org.chromium.chrome.browser.multiwindow.MultiInstanceChromeTabbedActivity"
         android:theme="@style/Theme.Chromium.TabbedMode"
         android:windowSoftInputMode="adjustResize">
     </activity>  # DIFF-ANCHOR: 9023f153
     <activity  # DIFF-ANCHOR: e86e2b49
+        android:name="org.chromium.chrome.browser.notifications.NotificationIntentInterceptor$TrampolineActivity"
         android:autoRemoveFromRecents="true"
         android:documentLaunchMode="always"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.notifications.NotificationIntentInterceptor$TrampolineActivity"
         android:noHistory="true"
         android:theme="@android:style/Theme.NoDisplay">
     </activity>  # DIFF-ANCHOR: e86e2b49
     <activity  # DIFF-ANCHOR: bec48e1f
+        android:name="org.chromium.chrome.browser.printing.PrintShareActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:enabled="false"
         android:excludeFromRecents="true"
         android:exported="true"
         android:icon="@drawable/sharing_print"
         android:label="@string/print_share_activity_title"
-        android:name="org.chromium.chrome.browser.printing.PrintShareActivity"
         android:noHistory="true"
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter>  # DIFF-ANCHOR: 4ee601b7
@@ -450,6 +450,7 @@
       </intent-filter>  # DIFF-ANCHOR: 4ee601b7
     </activity>  # DIFF-ANCHOR: bec48e1f
     <activity  # DIFF-ANCHOR: 7468a722
+        android:name="org.chromium.chrome.browser.searchwidget.SearchActivity"
         android:clearTaskOnLaunch="true"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
@@ -457,19 +458,18 @@
         android:hardwareAccelerated="false"
         android:label="Search"
         android:launchMode="singleTask"
-        android:name="org.chromium.chrome.browser.searchwidget.SearchActivity"
         android:taskAffinity=""
         android:theme="@style/Theme.Chromium.SearchActivity"
         android:windowSoftInputMode="adjustResize">
     </activity>  # DIFF-ANCHOR: 7468a722
     <activity  # DIFF-ANCHOR: f1aedff1
+        android:name="org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfShareActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:enabled="false"
         android:excludeFromRecents="true"
         android:exported="true"
         android:icon="@drawable/ic_launcher"
         android:label="@string/send_tab_to_self_share_activity_title"
-        android:name="org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfShareActivity"
         android:noHistory="true"
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter>  # DIFF-ANCHOR: 4ee601b7
@@ -479,20 +479,20 @@
       </intent-filter>  # DIFF-ANCHOR: 4ee601b7
     </activity>  # DIFF-ANCHOR: f1aedff1
     <activity  # DIFF-ANCHOR: d32b85df
+        android:name="org.chromium.chrome.browser.settings.SettingsActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
         android:label="@string/settings"
-        android:name="org.chromium.chrome.browser.settings.SettingsActivity"
         android:theme="@style/Theme.Chromium.Settings">
     </activity>  # DIFF-ANCHOR: d32b85df
     <activity  # DIFF-ANCHOR: 44158f9b
+        android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardShareActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:enabled="false"
         android:excludeFromRecents="true"
         android:exported="true"
         android:icon="@drawable/ic_devices_48dp"
         android:label="@string/shared_clipboard_share_activity_title"
-        android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardShareActivity"
         android:noHistory="true"
         android:theme="@style/Theme.Chromium.Activity.TranslucentNoAnimations">
       <intent-filter>  # DIFF-ANCHOR: 4ee601b7
@@ -502,42 +502,42 @@
       </intent-filter>  # DIFF-ANCHOR: 4ee601b7
     </activity>  # DIFF-ANCHOR: 44158f9b
     <activity  # DIFF-ANCHOR: fbf1ba15
+        android:name="org.chromium.chrome.browser.signin.SyncConsentActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.signin.SyncConsentActivity"
         android:theme="@style/Theme.Chromium.DialogWhenLarge">
     </activity>  # DIFF-ANCHOR: fbf1ba15
     <activity  # DIFF-ANCHOR: d2967c86
+        android:name="org.chromium.chrome.browser.site_settings.ManageSpaceActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
         android:label="@string/storage_management_activity_label"
-        android:name="org.chromium.chrome.browser.site_settings.ManageSpaceActivity"
         android:theme="@style/Theme.Chromium.Settings.ManageSpace">
     </activity>  # DIFF-ANCHOR: d2967c86
     <activity  # DIFF-ANCHOR: 8492e3fd
-        android:autoRemoveFromRecents="true"
         android:name="org.chromium.chrome.browser.sync.ui.PassphraseActivity"
+        android:autoRemoveFromRecents="true"
         android:theme="@style/Theme.Chromium.Activity">
     </activity>  # DIFF-ANCHOR: 8492e3fd
     <activity  # DIFF-ANCHOR: 76b60c10
+        android:name="org.chromium.chrome.browser.sync.ui.TrustedVaultKeyRetrievalProxyActivity"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.sync.ui.TrustedVaultKeyRetrievalProxyActivity"
         android:theme="@style/Theme.AppCompat">
     </activity>  # DIFF-ANCHOR: 76b60c10
     <activity  # DIFF-ANCHOR: 43bfa5de
+        android:name="org.chromium.chrome.browser.test_dummy.TestDummyActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
         android:exported="true"
-        android:name="org.chromium.chrome.browser.test_dummy.TestDummyActivity"
         android:noHistory="true"
         android:theme="@style/Theme.AppCompat">
     </activity>  # DIFF-ANCHOR: 43bfa5de
     <activity  # DIFF-ANCHOR: b007dcaa
+        android:name="org.chromium.chrome.browser.vr.VrCancelAnimationActivity"
         android:enableVrMode="@string/gvr_vr_mode_component"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.vr.VrCancelAnimationActivity"
         android:noHistory="true"
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter>  # DIFF-ANCHOR: dea53031
@@ -547,12 +547,12 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: b007dcaa
     <activity  # DIFF-ANCHOR: 5e628a6c
+        android:name="org.chromium.chrome.browser.vr.VrFirstRunActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode"
         android:enableVrMode="@string/gvr_vr_mode_component"
         android:excludeFromRecents="true"
         android:exported="false"
         android:launchMode="singleInstance"
-        android:name="org.chromium.chrome.browser.vr.VrFirstRunActivity"
         android:theme="@style/VrActivityTheme">
       <intent-filter>  # DIFF-ANCHOR: dea53031
         <action android:name="org.chromium.chrome.browser.dummy.action"/>
@@ -561,8 +561,8 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: 5e628a6c
     <activity  # DIFF-ANCHOR: 9bb1f409
-        android:exported="true"
         android:name="org.chromium.chrome.browser.webapps.ActivateWebApkActivity"
+        android:exported="true"
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter>  # DIFF-ANCHOR: 0d72b7f0
         <action android:name="org.chromium.chrome.browser.webapps.ActivateWebApkActivity.ACTIVATE"/>
@@ -570,11 +570,11 @@
       </intent-filter>  # DIFF-ANCHOR: 0d72b7f0
     </activity>  # DIFF-ANCHOR: 9bb1f409
     <activity  # DIFF-ANCHOR: f1dc024a
+        android:name="org.chromium.chrome.browser.webapps.SameTaskWebApkActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:exported="false"
         android:hardwareAccelerated="false"
         android:label="@string/webapp_activity_title"
-        android:name="org.chromium.chrome.browser.webapps.SameTaskWebApkActivity"
         android:persistableMode="persistNever"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
@@ -587,13 +587,13 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: f1dc024a
     <activity  # DIFF-ANCHOR: 5e467d8a
+        android:name="org.chromium.chrome.browser.webapps.WebappActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:documentLaunchMode="intoExisting"
         android:exported="false"
         android:hardwareAccelerated="false"
         android:label="@string/webapp_activity_title"
         android:launchMode="singleTop"
-        android:name="org.chromium.chrome.browser.webapps.WebappActivity"
         android:persistableMode="persistNever"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
@@ -606,9 +606,9 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: 5e467d8a
     <activity  # DIFF-ANCHOR: aea75380
+        android:name="org.chromium.chrome.browser.webapps.WebappLauncherActivity"
         android:excludeFromRecents="true"
         android:exported="true"
-        android:name="org.chromium.chrome.browser.webapps.WebappLauncherActivity"
         android:taskAffinity=""
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter>  # DIFF-ANCHOR: faf519ad
@@ -621,18 +621,18 @@
       </intent-filter>  # DIFF-ANCHOR: 9c5197e9
     </activity>  # DIFF-ANCHOR: aea75380
     <activity  # DIFF-ANCHOR: 66a0be05
+        android:name="org.chromium.chrome.browser.webapps.launchpad.LaunchpadActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.webapps.launchpad.LaunchpadActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
     </activity>  # DIFF-ANCHOR: 66a0be05
     <activity  # DIFF-ANCHOR: a1fac31f
+        android:name="org.chromium.chrome.browser.webauth.authenticator.CableAuthenticatorActivity"
         android:excludeFromRecents="true"
         android:exported="true"
         android:label="@string/cablev2_activity_title"
         android:launchMode="singleTop"
-        android:name="org.chromium.chrome.browser.webauth.authenticator.CableAuthenticatorActivity"
         android:permission="com.google.android.gms.auth.cryptauth.permission.CABLEV2_SERVER_LINK"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen">
       <intent-filter>  # DIFF-ANCHOR: 5873407a
@@ -641,18 +641,18 @@
       <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" android:resource="@xml/phone_as_a_security_key_accessory_filter"/>
     </activity>  # DIFF-ANCHOR: a1fac31f
     <activity  # DIFF-ANCHOR: 1d9b4077
+        android:name="org.chromium.components.media_router.caf.remoting.CafExpandedControllerActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
         android:hardwareAccelerated="true"
         android:label="Chrome.CafExpandedControllerActivity"
         android:launchMode="singleTask"
-        android:name="org.chromium.components.media_router.caf.remoting.CafExpandedControllerActivity"
         android:noHistory="true"
         android:theme="@style/Theme.Chromium.Activity">
     </activity>  # DIFF-ANCHOR: 1d9b4077
     <activity-alias  # DIFF-ANCHOR: 9da0e5b6
-        android:exported="true"
         android:name="com.google.android.apps.chrome.IntentDispatcher"
+        android:exported="true"
         android:targetActivity="org.chromium.chrome.browser.document.ChromeLauncherActivity">
       <intent-filter>  # DIFF-ANCHOR: a5330430
         <action android:name="android.intent.action.MAIN"/>
@@ -785,8 +785,8 @@
       <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>
     </activity-alias>  # DIFF-ANCHOR: 9da0e5b6
     <activity-alias  # DIFF-ANCHOR: 5042984f
-        android:exported="true"
         android:name="com.google.android.apps.chrome.Main"
+        android:exported="true"
         android:targetActivity="org.chromium.chrome.browser.ChromeTabbedActivity">
       <intent-filter>  # DIFF-ANCHOR: a5330430
         <action android:name="android.intent.action.MAIN"/>
@@ -803,8 +803,8 @@
       <meta-data android:name="android.app.shortcuts" android:resource="@xml/launchershortcuts"/>
     </activity-alias>  # DIFF-ANCHOR: 5042984f
     <activity-alias  # DIFF-ANCHOR: 03398466
-        android:exported="true"
         android:name="com.google.android.apps.chrome.TranslateDispatcher"
+        android:exported="true"
         android:permission="$PACKAGE.permission.TRANSLATE"
         android:targetActivity="org.chromium.chrome.browser.document.ChromeLauncherActivity">
       <intent-filter>  # DIFF-ANCHOR: 75e5f897
@@ -813,8 +813,8 @@
       </intent-filter>  # DIFF-ANCHOR: 75e5f897
     </activity-alias>  # DIFF-ANCHOR: 03398466
     <activity-alias  # DIFF-ANCHOR: dcfe2999
-        android:label="@string/webapp_activity_title"
         android:name="com.google.android.apps.chrome.webapps.WebappActivity"
+        android:label="@string/webapp_activity_title"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
         android:targetActivity="org.chromium.chrome.browser.webapps.WebappActivity">
@@ -824,17 +824,17 @@
         android:targetActivity="org.chromium.chrome.browser.webapps.WebappLauncherActivity">
     </activity-alias>  # DIFF-ANCHOR: 8e23336d
     <activity-alias  # DIFF-ANCHOR: b7cc06e9
-        android:enabled="false"
         android:name="org.chromium.android_webview.devui.DeveloperModeState"
+        android:enabled="false"
         android:process=":webview_apk"
         android:targetActivity="org.chromium.android_webview.devui.MainActivity"
         android:visibleToInstantApps="true">
     </activity-alias>  # DIFF-ANCHOR: b7cc06e9
     <activity-alias  # DIFF-ANCHOR: 32e34aba
+        android:name="org.chromium.android_webview.devui.MonochromeLauncherActivity"
         android:enabled="false"
         android:exported="true"
         android:label="WebView DevTools"
-        android:name="org.chromium.android_webview.devui.MonochromeLauncherActivity"
         android:targetActivity="org.chromium.android_webview.devui.MainActivity">
       <intent-filter>  # DIFF-ANCHOR: a5330430
         <action android:name="android.intent.action.MAIN"/>
@@ -842,10 +842,10 @@
       </intent-filter>  # DIFF-ANCHOR: a5330430
     </activity-alias>  # DIFF-ANCHOR: 32e34aba
     <activity-alias  # DIFF-ANCHOR: b4a6221b
+        android:name="org.chromium.chrome.browser.media.AudioLauncherActivity"
         android:enabled="false"
         android:excludeFromRecents="true"
         android:exported="true"
-        android:name="org.chromium.chrome.browser.media.AudioLauncherActivity"
         android:targetActivity="org.chromium.chrome.browser.media.MediaLauncherActivity"
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter tools:ignore="AppLinkUrlError">  # DIFF-ANCHOR: 13c9b0a8
@@ -857,8 +857,8 @@
       </intent-filter>  # DIFF-ANCHOR: 13c9b0a8
     </activity-alias>  # DIFF-ANCHOR: b4a6221b
     <activity-alias  # DIFF-ANCHOR: 7c349c4f
-        android:exported="false"
         android:name="org.chromium.chrome.browser.webapps.SecureWebAppLauncher"
+        android:exported="false"
         android:targetActivity="org.chromium.chrome.browser.webapps.WebappLauncherActivity">
       <intent-filter>  # DIFF-ANCHOR: 9fe4b527
         <action android:name="org.chromium.chrome.browser.webapps.WebappManager.ACTION_START_SECURE_WEBAPP"/>
@@ -877,151 +877,151 @@
     <meta-data android:name="org.chromium.content.browser.NUM_PRIVILEGED_SERVICES" android:value="5"/>
     <meta-data android:name="org.chromium.content.browser.NUM_SANDBOXED_SERVICES" android:value="40"/>
     <meta-data android:name="org.chromium.content.browser.SMART_CLIP_PROVIDER" android:value="org.chromium.content_public.browser.SmartClipProvider"/>
-    <provider  # DIFF-ANCHOR: 31002ffd
+    <provider  # DIFF-ANCHOR: bc0a9a7a
+        android:name="com.google.firebase.provider.FirebaseInitProvider"
         android:authorities="$PACKAGE.firebaseinitprovider"
         android:directBootAware="true"
         android:exported="false"
-        android:initOrder="100"
-        android:name="com.google.firebase.provider.FirebaseInitProvider">
-    </provider>  # DIFF-ANCHOR: 31002ffd
+        android:initOrder="100">
+    </provider>  # DIFF-ANCHOR: bc0a9a7a
     <provider  # DIFF-ANCHOR: a5e78e63
+        android:name="org.chromium.android_webview.nonembedded.LicenseContentProvider"
         android:authorities="$PACKAGE.LicenseContentProvider"
         android:exported="true"
         android:grantUriPermissions="true"
-        android:name="org.chromium.android_webview.nonembedded.LicenseContentProvider"
         android:process=":webview_apk"
         tools:ignore="ExportedContentProvider">
     </provider>  # DIFF-ANCHOR: a5e78e63
     <provider  # DIFF-ANCHOR: bfe37944
+        android:name="org.chromium.android_webview.services.DeveloperModeContentProvider"
         android:authorities="$PACKAGE.DeveloperModeContentProvider"
         android:exported="true"
-        android:name="org.chromium.android_webview.services.DeveloperModeContentProvider"
         android:process=":webview_service"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedContentProvider">
     </provider>  # DIFF-ANCHOR: bfe37944
-    <provider  # DIFF-ANCHOR: 97e158a1
+    <provider  # DIFF-ANCHOR: b73a881a
+        android:name="org.chromium.chrome.browser.download.DownloadFileProvider"
         android:authorities="$PACKAGE.DownloadFileProvider"
         android:exported="false"
-        android:grantUriPermissions="true"
-        android:name="org.chromium.chrome.browser.download.DownloadFileProvider">
+        android:grantUriPermissions="true">
       <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/>
-    </provider>  # DIFF-ANCHOR: 97e158a1
-    <provider  # DIFF-ANCHOR: 2215b9cd
+    </provider>  # DIFF-ANCHOR: b73a881a
+    <provider  # DIFF-ANCHOR: f1c2d7e1
+        android:name="org.chromium.chrome.browser.provider.ChromeBrowserProvider"
         android:authorities="$PACKAGE.ChromeBrowserProvider;$PACKAGE.browser;$PACKAGE"
-        android:exported="true"
-        android:name="org.chromium.chrome.browser.provider.ChromeBrowserProvider">
+        android:exported="true">
       <path-permission android:path="/bookmarks/search_suggest_query" android:readPermission="android.permission.GLOBAL_SEARCH"/>
-    </provider>  # DIFF-ANCHOR: 2215b9cd
-    <provider  # DIFF-ANCHOR: 6e306896
+    </provider>  # DIFF-ANCHOR: f1c2d7e1
+    <provider  # DIFF-ANCHOR: 67014fab
+        android:name="org.chromium.chrome.browser.util.ChromeFileProvider"
         android:authorities="$PACKAGE.FileProvider"
         android:exported="false"
-        android:grantUriPermissions="true"
-        android:name="org.chromium.chrome.browser.util.ChromeFileProvider">
+        android:grantUriPermissions="true">
       <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/>
-    </provider>  # DIFF-ANCHOR: 6e306896
-    <receiver  # DIFF-ANCHOR: 7d221226
+    </provider>  # DIFF-ANCHOR: 67014fab
+    <receiver  # DIFF-ANCHOR: 58d39a0f
+        android:name="com.google.android.apps.chrome.appwidget.bookmarks.BookmarkThumbnailWidgetProvider"
         android:exported="true"
-        android:label="@string/bookmark_widget_title"
-        android:name="com.google.android.apps.chrome.appwidget.bookmarks.BookmarkThumbnailWidgetProvider">
+        android:label="@string/bookmark_widget_title">
       <intent-filter>  # DIFF-ANCHOR: 1ebe78e9
         <action android:name=".BOOKMARK_APPWIDGET_UPDATE"/>
         <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
       </intent-filter>  # DIFF-ANCHOR: 1ebe78e9
       <meta-data android:name="android.appwidget.provider" android:resource="@xml/bookmark_widget_info"/>
-    </receiver>  # DIFF-ANCHOR: 7d221226
-    <receiver  # DIFF-ANCHOR: 1091f66b
-        android:exported="false"
-        android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver">
-    </receiver>  # DIFF-ANCHOR: 1091f66b
+    </receiver>  # DIFF-ANCHOR: 58d39a0f
+    <receiver  # DIFF-ANCHOR: 0a6f8fa5
+        android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 0a6f8fa5
     <receiver  # DIFF-ANCHOR: f1c9c29d
-        android:exported="true"
         android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
+        android:exported="true"
         android:permission="com.google.android.c2dm.permission.SEND">
       <intent-filter>  # DIFF-ANCHOR: aae22013
         <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
       </intent-filter>  # DIFF-ANCHOR: aae22013
     </receiver>  # DIFF-ANCHOR: f1c9c29d
-    <receiver  # DIFF-ANCHOR: 9ef4cd0a
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.announcement.AnnouncementNotificationManager$Receiver">
-    </receiver>  # DIFF-ANCHOR: 9ef4cd0a
-    <receiver  # DIFF-ANCHOR: 9a0a00e8
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.app.send_tab_to_self.SendTabToSelfNotificationReceiver">
-    </receiver>  # DIFF-ANCHOR: 9a0a00e8
-    <receiver  # DIFF-ANCHOR: b93ab7db
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetProxy">
-    </receiver>  # DIFF-ANCHOR: b93ab7db
-    <receiver  # DIFF-ANCHOR: 3e596004
-        android:exported="true"
-        android:name="org.chromium.chrome.browser.browserservices.ClientAppBroadcastReceiver">
+    <receiver  # DIFF-ANCHOR: 68e22783
+        android:name="org.chromium.chrome.browser.announcement.AnnouncementNotificationManager$Receiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 68e22783
+    <receiver  # DIFF-ANCHOR: f6d77f5a
+        android:name="org.chromium.chrome.browser.app.send_tab_to_self.SendTabToSelfNotificationReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: f6d77f5a
+    <receiver  # DIFF-ANCHOR: be2dce69
+        android:name="org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetProxy"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: be2dce69
+    <receiver  # DIFF-ANCHOR: 31a8399a
+        android:name="org.chromium.chrome.browser.browserservices.ClientAppBroadcastReceiver"
+        android:exported="true">
       <intent-filter>  # DIFF-ANCHOR: e5bb6a36
         <action android:name="android.intent.action.PACKAGE_DATA_CLEARED"/>
         <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED"/>
         <data android:scheme="package"/>
       </intent-filter>  # DIFF-ANCHOR: e5bb6a36
-    </receiver>  # DIFF-ANCHOR: 3e596004
-    <receiver  # DIFF-ANCHOR: a31e6ce5
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.browserservices.ui.trustedwebactivity.DisclosureAcceptanceBroadcastReceiver">
-    </receiver>  # DIFF-ANCHOR: a31e6ce5
-    <receiver  # DIFF-ANCHOR: 779ee86b
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.customtabs.CustomTabsShareBroadcastReceiver">
-    </receiver>  # DIFF-ANCHOR: 779ee86b
-    <receiver  # DIFF-ANCHOR: bccc7d87
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.locale.LocaleChangedBroadcastReceiver">
+    </receiver>  # DIFF-ANCHOR: 31a8399a
+    <receiver  # DIFF-ANCHOR: 2f4b69ac
+        android:name="org.chromium.chrome.browser.browserservices.ui.trustedwebactivity.DisclosureAcceptanceBroadcastReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 2f4b69ac
+    <receiver  # DIFF-ANCHOR: fd245bee
+        android:name="org.chromium.chrome.browser.customtabs.CustomTabsShareBroadcastReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: fd245bee
+    <receiver  # DIFF-ANCHOR: de591772
+        android:name="org.chromium.chrome.browser.locale.LocaleChangedBroadcastReceiver"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: 5458f2a2
         <action android:name="android.intent.action.LOCALE_CHANGED"/>
       </intent-filter>  # DIFF-ANCHOR: 5458f2a2
-    </receiver>  # DIFF-ANCHOR: bccc7d87
-    <receiver  # DIFF-ANCHOR: 17866e9d
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.notifications.NotificationIntentInterceptor$Receiver">
-    </receiver>  # DIFF-ANCHOR: 17866e9d
-    <receiver  # DIFF-ANCHOR: de24469c
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.notifications.NotificationService$Receiver">
-    </receiver>  # DIFF-ANCHOR: de24469c
-    <receiver  # DIFF-ANCHOR: 2934478c
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.notifications.NotificationServiceImpl$Receiver">
+    </receiver>  # DIFF-ANCHOR: de591772
+    <receiver  # DIFF-ANCHOR: 2b9c19aa
+        android:name="org.chromium.chrome.browser.notifications.NotificationIntentInterceptor$Receiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 2b9c19aa
+    <receiver  # DIFF-ANCHOR: d8a2af42
+        android:name="org.chromium.chrome.browser.notifications.NotificationService$Receiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: d8a2af42
+    <receiver  # DIFF-ANCHOR: df76237f
+        android:name="org.chromium.chrome.browser.notifications.NotificationServiceImpl$Receiver"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: 1c1c5ed8
         <action android:name="org.chromium.chrome.browser.notifications.CLICK_NOTIFICATION"/>
         <action android:name="org.chromium.chrome.browser.notifications.CLOSE_NOTIFICATION"/>
       </intent-filter>  # DIFF-ANCHOR: 1c1c5ed8
-    </receiver>  # DIFF-ANCHOR: 2934478c
-    <receiver  # DIFF-ANCHOR: e1c4d394
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.notifications.scheduler.DisplayAgent$Receiver">
-    </receiver>  # DIFF-ANCHOR: e1c4d394
-    <receiver  # DIFF-ANCHOR: de47f306
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.offlinepages.AutoFetchNotifier$CompleteNotificationReceiver">
-    </receiver>  # DIFF-ANCHOR: de47f306
-    <receiver  # DIFF-ANCHOR: 98349cb3
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.offlinepages.AutoFetchNotifier$InProgressCancelReceiver">
-    </receiver>  # DIFF-ANCHOR: 98349cb3
-    <receiver  # DIFF-ANCHOR: cfa3bb7f
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.offlinepages.prefetch.PrefetchedPagesNotifier$ClickReceiver">
-    </receiver>  # DIFF-ANCHOR: cfa3bb7f
-    <receiver  # DIFF-ANCHOR: 1f02dc2f
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.offlinepages.prefetch.PrefetchedPagesNotifier$SettingsReceiver">
-    </receiver>  # DIFF-ANCHOR: 1f02dc2f
-    <receiver  # DIFF-ANCHOR: 40a69297
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.omaha.UpdateNotificationController$UpdateNotificationReceiver">
-    </receiver>  # DIFF-ANCHOR: 40a69297
-    <receiver  # DIFF-ANCHOR: 3664f7eb
+    </receiver>  # DIFF-ANCHOR: df76237f
+    <receiver  # DIFF-ANCHOR: 0cefd906
+        android:name="org.chromium.chrome.browser.notifications.scheduler.DisplayAgent$Receiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 0cefd906
+    <receiver  # DIFF-ANCHOR: 7d28c8e4
+        android:name="org.chromium.chrome.browser.offlinepages.AutoFetchNotifier$CompleteNotificationReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 7d28c8e4
+    <receiver  # DIFF-ANCHOR: 05f19ac3
+        android:name="org.chromium.chrome.browser.offlinepages.AutoFetchNotifier$InProgressCancelReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 05f19ac3
+    <receiver  # DIFF-ANCHOR: f2ef5c19
+        android:name="org.chromium.chrome.browser.offlinepages.prefetch.PrefetchedPagesNotifier$ClickReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: f2ef5c19
+    <receiver  # DIFF-ANCHOR: 0267e562
+        android:name="org.chromium.chrome.browser.offlinepages.prefetch.PrefetchedPagesNotifier$SettingsReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 0267e562
+    <receiver  # DIFF-ANCHOR: a3a6e991
+        android:name="org.chromium.chrome.browser.omaha.UpdateNotificationController$UpdateNotificationReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: a3a6e991
+    <receiver  # DIFF-ANCHOR: a0d83ae5
+        android:name="org.chromium.chrome.browser.searchwidget.SearchWidgetProvider"
         android:exported="true"
-        android:label="@string/search_widget_title"
-        android:name="org.chromium.chrome.browser.searchwidget.SearchWidgetProvider">
+        android:label="@string/search_widget_title">
       <intent-filter>  # DIFF-ANCHOR: 4ed161a4
         <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
       </intent-filter>  # DIFF-ANCHOR: 4ed161a4
@@ -1035,151 +1035,151 @@
         <action android:name="org.chromium.chrome.browser.searchwidget.UPDATE_ALL_WIDGETS"/>
       </intent-filter>  # DIFF-ANCHOR: fc048873
       <meta-data android:name="android.appwidget.provider" android:resource="@xml/search_widget_info"/>
-    </receiver>  # DIFF-ANCHOR: 3664f7eb
-    <receiver  # DIFF-ANCHOR: 93e73992
-        android:exported="true"
-        android:name="org.chromium.chrome.browser.sharing.click_to_call.ClickToCallMessageHandler$PhoneUnlockedReceiver">
+    </receiver>  # DIFF-ANCHOR: a0d83ae5
+    <receiver  # DIFF-ANCHOR: 2f1fe689
+        android:name="org.chromium.chrome.browser.sharing.click_to_call.ClickToCallMessageHandler$PhoneUnlockedReceiver"
+        android:exported="true">
       <intent-filter>  # DIFF-ANCHOR: 4b5ec7a9
         <action android:name="android.intent.action.USER_PRESENT"/>
       </intent-filter>  # DIFF-ANCHOR: 4b5ec7a9
-    </receiver>  # DIFF-ANCHOR: 93e73992
-    <receiver  # DIFF-ANCHOR: 956432e8
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.sharing.click_to_call.ClickToCallMessageHandler$TapReceiver">
-    </receiver>  # DIFF-ANCHOR: 956432e8
-    <receiver  # DIFF-ANCHOR: cbb425dc
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardMessageHandler$TapReceiver">
-    </receiver>  # DIFF-ANCHOR: cbb425dc
-    <receiver  # DIFF-ANCHOR: 729144c9
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardMessageHandler$TryAgainReceiver">
-    </receiver>  # DIFF-ANCHOR: 729144c9
-    <receiver  # DIFF-ANCHOR: e61d98d4
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.sharing.sms_fetcher.SmsFetcherMessageHandler$NotificationReceiver">
-    </receiver>  # DIFF-ANCHOR: e61d98d4
-    <receiver  # DIFF-ANCHOR: aa6748fc
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.upgrade.PackageReplacedBroadcastReceiver">
+    </receiver>  # DIFF-ANCHOR: 2f1fe689
+    <receiver  # DIFF-ANCHOR: 124ac9a1
+        android:name="org.chromium.chrome.browser.sharing.click_to_call.ClickToCallMessageHandler$TapReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 124ac9a1
+    <receiver  # DIFF-ANCHOR: 84094425
+        android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardMessageHandler$TapReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 84094425
+    <receiver  # DIFF-ANCHOR: 352611a4
+        android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardMessageHandler$TryAgainReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 352611a4
+    <receiver  # DIFF-ANCHOR: 420d0678
+        android:name="org.chromium.chrome.browser.sharing.sms_fetcher.SmsFetcherMessageHandler$NotificationReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 420d0678
+    <receiver  # DIFF-ANCHOR: 9015e3cf
+        android:name="org.chromium.chrome.browser.upgrade.PackageReplacedBroadcastReceiver"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: e8cce90c
         <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
       </intent-filter>  # DIFF-ANCHOR: e8cce90c
-    </receiver>  # DIFF-ANCHOR: aa6748fc
-    <receiver  # DIFF-ANCHOR: 3e5f56cb
-        android:exported="false"
-        android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskBroadcastReceiver">
-    </receiver>  # DIFF-ANCHOR: 3e5f56cb
+    </receiver>  # DIFF-ANCHOR: 9015e3cf
+    <receiver  # DIFF-ANCHOR: c787586e
+        android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskBroadcastReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: c787586e
     <service android:name="androidx.browser.customtabs.PostMessageService"/>
-    <service  # DIFF-ANCHOR: 41539e3c
-        android:exported="false"
-        android:name="com.google.android.gms.cast.framework.ReconnectionService">
-    </service>  # DIFF-ANCHOR: 41539e3c
-    <service  # DIFF-ANCHOR: 7dad1ec5
-        android:exported="false"
-        android:name="com.google.android.gms.cast.framework.media.MediaNotificationService">
-    </service>  # DIFF-ANCHOR: 7dad1ec5
+    <service  # DIFF-ANCHOR: 749391ed
+        android:name="com.google.android.gms.cast.framework.ReconnectionService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 749391ed
+    <service  # DIFF-ANCHOR: 48ce9d28
+        android:name="com.google.android.gms.cast.framework.media.MediaNotificationService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 48ce9d28
     <service  # DIFF-ANCHOR: 7e26656b
+        android:name="com.google.firebase.components.ComponentDiscoveryService"
         android:directBootAware="true"
         android:exported="false"
-        android:name="com.google.firebase.components.ComponentDiscoveryService"
         tools:targetApi="n">
       <meta-data android:name="com.google.firebase.components:com.google.firebase.dynamicloading.DynamicLoadingRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/>
       <meta-data android:name="com.google.firebase.components:com.google.firebase.iid.Registrar" android:value="com.google.firebase.components.ComponentRegistrar"/>
       <meta-data android:name="com.google.firebase.components:com.google.firebase.installations.FirebaseInstallationsRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/>
       <meta-data android:name="com.google.firebase.components:com.google.firebase.messaging.FirebaseMessagingRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/>
     </service>  # DIFF-ANCHOR: 7e26656b
-    <service  # DIFF-ANCHOR: 137c712b
+    <service  # DIFF-ANCHOR: 2295960c
+        android:name="com.google.firebase.messaging.FirebaseMessagingService"
         android:directBootAware="true"
-        android:exported="false"
-        android:name="com.google.firebase.messaging.FirebaseMessagingService">
+        android:exported="false">
       <intent-filter android:priority="-500">  # DIFF-ANCHOR: 69e70070
         <action android:name="com.google.firebase.MESSAGING_EVENT"/>
       </intent-filter>  # DIFF-ANCHOR: 69e70070
-    </service>  # DIFF-ANCHOR: 137c712b
+    </service>  # DIFF-ANCHOR: 2295960c
     <service  # DIFF-ANCHOR: 4c2196d9
-        android:exported="true"
         android:name="com.google.ipc.invalidation.ticl.android2.channel.GcmRegistrationTaskService"
+        android:exported="true"
         android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
       <intent-filter>  # DIFF-ANCHOR: 99686c45
         <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/>
       </intent-filter>  # DIFF-ANCHOR: 99686c45
     </service>  # DIFF-ANCHOR: 4c2196d9
     <service  # DIFF-ANCHOR: b9ec52c4
-        android:exported="false"
         android:name="org.chromium.android_webview.nonembedded.AwComponentUpdateService"
+        android:exported="false"
         android:permission="android.permission.BIND_JOB_SERVICE"
         android:process=":webview_apk">
     </service>  # DIFF-ANCHOR: b9ec52c4
     <service  # DIFF-ANCHOR: 3cd6d713
-        android:exported="true"
         android:name="org.chromium.android_webview.services.AwMinidumpUploadJobService"
+        android:exported="true"
         android:permission="android.permission.BIND_JOB_SERVICE"
         android:process=":webview_service">
     </service>  # DIFF-ANCHOR: 3cd6d713
     <service  # DIFF-ANCHOR: 65cddb26
-        android:exported="false"
         android:name="org.chromium.android_webview.services.AwVariationsSeedFetcher"
+        android:exported="false"
         android:permission="android.permission.BIND_JOB_SERVICE"
         android:process=":webview_service">
     </service>  # DIFF-ANCHOR: 65cddb26
     <service  # DIFF-ANCHOR: c756cf8d
-        android:exported="true"
         android:name="org.chromium.android_webview.services.ComponentsProviderService"
+        android:exported="true"
         android:process=":webview_service"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: c756cf8d
     <service  # DIFF-ANCHOR: 5cda9608
-        android:exported="true"
         android:name="org.chromium.android_webview.services.CrashReceiverService"
+        android:exported="true"
         android:process=":webview_service"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 5cda9608
     <service  # DIFF-ANCHOR: adce9ea1
-        android:exported="true"
         android:name="org.chromium.android_webview.services.DeveloperUiService"
+        android:exported="true"
         android:process=":webview_service"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: adce9ea1
     <service  # DIFF-ANCHOR: eecf2fee
-        android:exported="true"
         android:name="org.chromium.android_webview.services.MetricsBridgeService"
+        android:exported="true"
         android:process=":webview_service"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: eecf2fee
     <service  # DIFF-ANCHOR: dc926e35
-        android:exported="true"
         android:name="org.chromium.android_webview.services.VariationsSeedServer"
+        android:exported="true"
         android:process=":webview_service"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: dc926e35
     <service  # DIFF-ANCHOR: c34d99ad
-        android:exported="true"
         android:name="org.chromium.chrome.browser.ChromeBackgroundService"
+        android:exported="true"
         android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
       <intent-filter>  # DIFF-ANCHOR: 99686c45
         <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/>
       </intent-filter>  # DIFF-ANCHOR: 99686c45
     </service>  # DIFF-ANCHOR: c34d99ad
     <service  # DIFF-ANCHOR: ac44dbad
-        android:exported="false"
         android:name="org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetService"
+        android:exported="false"
         android:permission="android.permission.BIND_REMOTEVIEWS">
     </service>  # DIFF-ANCHOR: ac44dbad
     <service  # DIFF-ANCHOR: 90d2ec9b
-        android:exported="false"
         android:name="org.chromium.chrome.browser.crash.ChromeMinidumpUploadJobService"
+        android:exported="false"
         android:permission="android.permission.BIND_JOB_SERVICE">
     </service>  # DIFF-ANCHOR: 90d2ec9b
-    <service  # DIFF-ANCHOR: 2ce0b6a4
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.crash.MinidumpUploadService">
-    </service>  # DIFF-ANCHOR: 2ce0b6a4
+    <service  # DIFF-ANCHOR: f72bb7bc
+        android:name="org.chromium.chrome.browser.crash.MinidumpUploadService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: f72bb7bc
     <service  # DIFF-ANCHOR: ee1c39a8
-        android:exported="true"
         android:name="org.chromium.chrome.browser.customtabs.CustomTabsConnectionService"
+        android:exported="true"
         tools:ignore="ExportedService">
       <intent-filter>  # DIFF-ANCHOR: d46bf795
         <action android:name="android.support.customtabs.action.CustomTabsService"/>
@@ -1193,142 +1193,142 @@
         <category android:name="androidx.browser.trusted.category.WebShareTargetV2"/>
       </intent-filter>  # DIFF-ANCHOR: d46bf795
     </service>  # DIFF-ANCHOR: ee1c39a8
-    <service  # DIFF-ANCHOR: 555432db
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.download.DownloadBroadcastManager">
-    </service>  # DIFF-ANCHOR: 555432db
-    <service  # DIFF-ANCHOR: 4cf14268
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.download.DownloadForegroundService">
-    </service>  # DIFF-ANCHOR: 4cf14268
-    <service  # DIFF-ANCHOR: a651602a
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.incognito.IncognitoNotificationService">
-    </service>  # DIFF-ANCHOR: a651602a
-    <service  # DIFF-ANCHOR: 4f8e62ea
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.media.MediaCaptureNotificationService">
-    </service>  # DIFF-ANCHOR: 4f8e62ea
-    <service  # DIFF-ANCHOR: 4129c705
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$CastListenerService">
+    <service  # DIFF-ANCHOR: 4b22c3f5
+        android:name="org.chromium.chrome.browser.download.DownloadBroadcastManager"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 4b22c3f5
+    <service  # DIFF-ANCHOR: 413310e5
+        android:name="org.chromium.chrome.browser.download.DownloadForegroundService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 413310e5
+    <service  # DIFF-ANCHOR: 7e3ff13a
+        android:name="org.chromium.chrome.browser.incognito.IncognitoNotificationService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 7e3ff13a
+    <service  # DIFF-ANCHOR: ac8469ff
+        android:name="org.chromium.chrome.browser.media.MediaCaptureNotificationService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: ac8469ff
+    <service  # DIFF-ANCHOR: 7ef9e4e5
+        android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$CastListenerService"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: f401157d
         <action android:name="android.intent.action.MEDIA_BUTTON"/>
       </intent-filter>  # DIFF-ANCHOR: f401157d
-    </service>  # DIFF-ANCHOR: 4129c705
-    <service  # DIFF-ANCHOR: c6abf186
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$PlaybackListenerService">
+    </service>  # DIFF-ANCHOR: 7ef9e4e5
+    <service  # DIFF-ANCHOR: 41fa6492
+        android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$PlaybackListenerService"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: f401157d
         <action android:name="android.intent.action.MEDIA_BUTTON"/>
       </intent-filter>  # DIFF-ANCHOR: f401157d
-    </service>  # DIFF-ANCHOR: c6abf186
-    <service  # DIFF-ANCHOR: 4d0d10fe
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$PresentationListenerService">
+    </service>  # DIFF-ANCHOR: 41fa6492
+    <service  # DIFF-ANCHOR: 1260bca4
+        android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$PresentationListenerService"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: f401157d
         <action android:name="android.intent.action.MEDIA_BUTTON"/>
       </intent-filter>  # DIFF-ANCHOR: f401157d
-    </service>  # DIFF-ANCHOR: 4d0d10fe
+    </service>  # DIFF-ANCHOR: 1260bca4
     <service  # DIFF-ANCHOR: 4b2220c4
-        android:exported="false"
         android:name="org.chromium.chrome.browser.notifications.NotificationJobService"
+        android:exported="false"
         android:permission="android.permission.BIND_JOB_SERVICE">
     </service>  # DIFF-ANCHOR: 4b2220c4
-    <service  # DIFF-ANCHOR: 3224d309
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.notifications.NotificationService">
-    </service>  # DIFF-ANCHOR: 3224d309
-    <service android:exported="false" android:name="org.chromium.chrome.browser.omaha.OmahaClient"/>
+    <service  # DIFF-ANCHOR: 7fb8c03f
+        android:name="org.chromium.chrome.browser.notifications.NotificationService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 7fb8c03f
+    <service android:name="org.chromium.chrome.browser.omaha.OmahaClient" android:exported="false"/>
     <service  # DIFF-ANCHOR: 53256720
+        android:name="org.chromium.chrome.browser.photo_picker.DecoderService"
         android:description="@string/decoder_description"
         android:exported="false"
         android:isolatedProcess="true"
-        android:name="org.chromium.chrome.browser.photo_picker.DecoderService"
         android:process=":decoder_service">
     </service>  # DIFF-ANCHOR: 53256720
     <service  # DIFF-ANCHOR: 064aae37
-        android:exported="true"
         android:name="org.chromium.chrome.browser.prerender.ChromePrerenderService"
+        android:exported="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 064aae37
-    <service  # DIFF-ANCHOR: d930289b
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.services.gcm.ChromeGcmListenerService">
+    <service  # DIFF-ANCHOR: 6d9cb216
+        android:name="org.chromium.chrome.browser.services.gcm.ChromeGcmListenerService"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: 69e70070
         <action android:name="com.google.firebase.MESSAGING_EVENT"/>
       </intent-filter>  # DIFF-ANCHOR: 69e70070
-    </service>  # DIFF-ANCHOR: d930289b
-    <service  # DIFF-ANCHOR: 682abdc1
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.services.gcm.GCMBackgroundService">
-    </service>  # DIFF-ANCHOR: 682abdc1
-    <service  # DIFF-ANCHOR: dfb5da84
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.services.gcm.InvalidationGcmUpstreamSender">
-    </service>  # DIFF-ANCHOR: dfb5da84
-    <service  # DIFF-ANCHOR: 80f6a8e5
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.tracing.TracingNotificationService">
-    </service>  # DIFF-ANCHOR: 80f6a8e5
+    </service>  # DIFF-ANCHOR: 6d9cb216
+    <service  # DIFF-ANCHOR: 7b05db30
+        android:name="org.chromium.chrome.browser.services.gcm.GCMBackgroundService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 7b05db30
+    <service  # DIFF-ANCHOR: dcd6fa39
+        android:name="org.chromium.chrome.browser.services.gcm.InvalidationGcmUpstreamSender"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: dcd6fa39
+    <service  # DIFF-ANCHOR: c26364a8
+        android:name="org.chromium.chrome.browser.tracing.TracingNotificationService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: c26364a8
     <service  # DIFF-ANCHOR: 8fc286d0
-        android:exported="true"
         android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskGcmTaskService"
+        android:exported="true"
         android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
       <intent-filter>  # DIFF-ANCHOR: 99686c45
         <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/>
       </intent-filter>  # DIFF-ANCHOR: 99686c45
     </service>  # DIFF-ANCHOR: 8fc286d0
     <service  # DIFF-ANCHOR: a550decc
-        android:exported="false"
         android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskJobService"
+        android:exported="false"
         android:permission="android.permission.BIND_JOB_SERVICE">
     </service>  # DIFF-ANCHOR: a550decc
     <service  # DIFF-ANCHOR: 2a1cd701
-        android:exported="true"
         android:name="org.chromium.components.payments.PaymentDetailsUpdateService"
+        android:exported="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 2a1cd701
     <service  # DIFF-ANCHOR: 0c6c4fd9
+        android:name="org.chromium.content.app.PrivilegedProcessService0"
         android:exported="false"
         android:isolatedProcess="false"
-        android:name="org.chromium.content.app.PrivilegedProcessService0"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":privileged_process0">
     </service>  # DIFF-ANCHOR: 0c6c4fd9
     <service  # DIFF-ANCHOR: 6f89af32
+        android:name="org.chromium.content.app.PrivilegedProcessService1"
         android:exported="false"
         android:isolatedProcess="false"
-        android:name="org.chromium.content.app.PrivilegedProcessService1"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":privileged_process1">
     </service>  # DIFF-ANCHOR: 6f89af32
     <service  # DIFF-ANCHOR: 40e0d738
+        android:name="org.chromium.content.app.PrivilegedProcessService2"
         android:exported="false"
         android:isolatedProcess="false"
-        android:name="org.chromium.content.app.PrivilegedProcessService2"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":privileged_process2">
     </service>  # DIFF-ANCHOR: 40e0d738
     <service  # DIFF-ANCHOR: b197517d
+        android:name="org.chromium.content.app.PrivilegedProcessService3"
         android:exported="false"
         android:isolatedProcess="false"
-        android:name="org.chromium.content.app.PrivilegedProcessService3"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":privileged_process3">
     </service>  # DIFF-ANCHOR: b197517d
     <service  # DIFF-ANCHOR: 52303702
+        android:name="org.chromium.content.app.PrivilegedProcessService4"
         android:exported="false"
         android:isolatedProcess="false"
-        android:name="org.chromium.content.app.PrivilegedProcessService4"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":privileged_process4">
     </service>  # DIFF-ANCHOR: 52303702
     <service  # DIFF-ANCHOR: b1e3e8bd
+        android:name="org.chromium.content.app.SandboxedProcessService0"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService0"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process0"
         android:useAppZygote="true"
@@ -1336,390 +1336,390 @@
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: b1e3e8bd
     <service  # DIFF-ANCHOR: 76d1ccf8
+        android:name="org.chromium.content.app.SandboxedProcessService1"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService1"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process1"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 76d1ccf8
     <service  # DIFF-ANCHOR: 38b95266
+        android:name="org.chromium.content.app.SandboxedProcessService10"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService10"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process10"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 38b95266
     <service  # DIFF-ANCHOR: e4a2e4a2
+        android:name="org.chromium.content.app.SandboxedProcessService11"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService11"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process11"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: e4a2e4a2
     <service  # DIFF-ANCHOR: d9b2ffba
+        android:name="org.chromium.content.app.SandboxedProcessService12"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService12"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process12"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: d9b2ffba
     <service  # DIFF-ANCHOR: b41bb17d
+        android:name="org.chromium.content.app.SandboxedProcessService13"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService13"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process13"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: b41bb17d
     <service  # DIFF-ANCHOR: aec0ea21
+        android:name="org.chromium.content.app.SandboxedProcessService14"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService14"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process14"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: aec0ea21
     <service  # DIFF-ANCHOR: cf88a5e5
+        android:name="org.chromium.content.app.SandboxedProcessService15"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService15"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process15"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: cf88a5e5
     <service  # DIFF-ANCHOR: 7d85889d
+        android:name="org.chromium.content.app.SandboxedProcessService16"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService16"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process16"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 7d85889d
     <service  # DIFF-ANCHOR: dae26ed4
+        android:name="org.chromium.content.app.SandboxedProcessService17"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService17"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process17"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: dae26ed4
     <service  # DIFF-ANCHOR: 2c6cf029
+        android:name="org.chromium.content.app.SandboxedProcessService18"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService18"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process18"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 2c6cf029
     <service  # DIFF-ANCHOR: 1d2f0988
+        android:name="org.chromium.content.app.SandboxedProcessService19"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService19"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process19"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 1d2f0988
     <service  # DIFF-ANCHOR: 4a39041b
+        android:name="org.chromium.content.app.SandboxedProcessService2"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService2"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process2"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 4a39041b
     <service  # DIFF-ANCHOR: 073533bf
+        android:name="org.chromium.content.app.SandboxedProcessService20"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService20"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process20"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 073533bf
     <service  # DIFF-ANCHOR: d24da41d
+        android:name="org.chromium.content.app.SandboxedProcessService21"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService21"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process21"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: d24da41d
     <service  # DIFF-ANCHOR: 594d8b32
+        android:name="org.chromium.content.app.SandboxedProcessService22"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService22"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process22"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 594d8b32
     <service  # DIFF-ANCHOR: 5528c0c3
+        android:name="org.chromium.content.app.SandboxedProcessService23"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService23"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process23"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 5528c0c3
     <service  # DIFF-ANCHOR: b7ab2ba3
+        android:name="org.chromium.content.app.SandboxedProcessService24"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService24"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process24"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: b7ab2ba3
     <service  # DIFF-ANCHOR: cec6cb64
+        android:name="org.chromium.content.app.SandboxedProcessService25"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService25"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process25"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: cec6cb64
     <service  # DIFF-ANCHOR: 5b4a00fe
+        android:name="org.chromium.content.app.SandboxedProcessService26"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService26"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process26"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 5b4a00fe
     <service  # DIFF-ANCHOR: ad49d203
+        android:name="org.chromium.content.app.SandboxedProcessService27"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService27"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process27"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: ad49d203
     <service  # DIFF-ANCHOR: 573298e9
+        android:name="org.chromium.content.app.SandboxedProcessService28"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService28"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process28"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 573298e9
     <service  # DIFF-ANCHOR: 79897b32
+        android:name="org.chromium.content.app.SandboxedProcessService29"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService29"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process29"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 79897b32
     <service  # DIFF-ANCHOR: 84335864
+        android:name="org.chromium.content.app.SandboxedProcessService3"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService3"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process3"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 84335864
     <service  # DIFF-ANCHOR: c4bd371e
+        android:name="org.chromium.content.app.SandboxedProcessService30"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService30"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process30"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: c4bd371e
     <service  # DIFF-ANCHOR: 394a9fd0
+        android:name="org.chromium.content.app.SandboxedProcessService31"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService31"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process31"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 394a9fd0
     <service  # DIFF-ANCHOR: b811afb8
+        android:name="org.chromium.content.app.SandboxedProcessService32"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService32"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process32"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: b811afb8
     <service  # DIFF-ANCHOR: 2811ddd3
+        android:name="org.chromium.content.app.SandboxedProcessService33"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService33"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process33"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 2811ddd3
     <service  # DIFF-ANCHOR: 73ae1688
+        android:name="org.chromium.content.app.SandboxedProcessService34"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService34"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process34"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 73ae1688
     <service  # DIFF-ANCHOR: c476f324
+        android:name="org.chromium.content.app.SandboxedProcessService35"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService35"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process35"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: c476f324
     <service  # DIFF-ANCHOR: 75d5304b
+        android:name="org.chromium.content.app.SandboxedProcessService36"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService36"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process36"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 75d5304b
     <service  # DIFF-ANCHOR: dc6d0617
+        android:name="org.chromium.content.app.SandboxedProcessService37"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService37"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process37"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: dc6d0617
     <service  # DIFF-ANCHOR: e31efe49
+        android:name="org.chromium.content.app.SandboxedProcessService38"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService38"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process38"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: e31efe49
     <service  # DIFF-ANCHOR: 5736507e
+        android:name="org.chromium.content.app.SandboxedProcessService39"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService39"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process39"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 5736507e
     <service  # DIFF-ANCHOR: a161be24
+        android:name="org.chromium.content.app.SandboxedProcessService4"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService4"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process4"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: a161be24
     <service  # DIFF-ANCHOR: 8e591688
+        android:name="org.chromium.content.app.SandboxedProcessService5"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService5"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process5"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 8e591688
     <service  # DIFF-ANCHOR: 705141d0
+        android:name="org.chromium.content.app.SandboxedProcessService6"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService6"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process6"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 705141d0
     <service  # DIFF-ANCHOR: 38ed2189
+        android:name="org.chromium.content.app.SandboxedProcessService7"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService7"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process7"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 38ed2189
     <service  # DIFF-ANCHOR: aa417956
+        android:name="org.chromium.content.app.SandboxedProcessService8"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService8"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process8"
         android:visibleToInstantApps="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: aa417956
     <service  # DIFF-ANCHOR: e2f3bbbd
+        android:name="org.chromium.content.app.SandboxedProcessService9"
         android:exported="true"
         android:externalService="true"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService9"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process9"
         android:visibleToInstantApps="true"
diff --git a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected b/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected
index 9637cc07..dcb6341 100644
--- a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected
+++ b/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected
@@ -1,16 +1,16 @@
 <?xml version="1.0" ?>
 <manifest
-    android:isolatedSplits="true"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="org.chromium.chrome.stable"
     platformBuildVersionCode="30"
     platformBuildVersionName="11"
-    tools:ignore="MissingVersion"
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
+    android:isolatedSplits="true"
+    tools:ignore="MissingVersion">
   <permission android:name="$PACKAGE.TOS_ACKED" android:protectionLevel="signatureOrSystem"/>
   <permission android:name="$PACKAGE.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
   <permission android:name="$PACKAGE.permission.CHILD_SERVICE" android:protectionLevel="signature"/>
-  <permission android:label="Debug web pages" android:name="$PACKAGE.permission.DEBUG" android:protectionLevel="signature"/>
+  <permission android:name="$PACKAGE.permission.DEBUG" android:label="Debug web pages" android:protectionLevel="signature"/>
   <permission android:name="$PACKAGE.permission.READ_WRITE_BOOKMARK_FOLDERS" android:protectionLevel="signatureOrSystem"/>
   <permission android:name="$PACKAGE.permission.TRANSLATE" android:protectionLevel="signature"/>
   <queries>  # DIFF-ANCHOR: 5a71ec1f
@@ -19,6 +19,7 @@
     </intent>  # DIFF-ANCHOR: 28c960ba
     <package android:name="com.google.ar.core"/>
   </queries>  # DIFF-ANCHOR: 5a71ec1f
+  <uses-feature android:glEsVersion="0x00020000"/>
   <uses-feature android:name="android.hardware.camera" android:required="false"/>
   <uses-feature android:name="android.hardware.location.gps" android:required="false"/>
   <uses-feature android:name="android.hardware.microphone" android:required="false"/>
@@ -29,7 +30,6 @@
   <uses-feature android:name="android.hardware.vr.headtracking" android:required="false" android:version="1"/>
   <uses-feature android:name="android.hardware.vr.high_performance" android:required="false"/>
   <uses-feature android:name="android.software.vr.mode" android:required="false"/>
-  <uses-feature android:glEsVersion="0x00020000"/>
   <uses-permission android:name="$PACKAGE.TOS_ACKED"/>
   <uses-permission android:name="$PACKAGE.permission.C2D_MESSAGE"/>
   <uses-permission android:name="$PACKAGE.permission.READ_WRITE_BOOKMARK_FOLDERS"/>
@@ -70,6 +70,7 @@
   <uses-permission-sdk-23 android:name="android.permission.USE_FINGERPRINT"/>
   <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="30"/>
   <application
+      android:name="org.chromium.chrome.browser.base.SplitChromeApplication"
       android:allowAudioPlaybackCapture="false"
       android:allowBackup="false"
       android:appComponentFactory="org.chromium.chrome.browser.base.SplitCompatAppComponentFactory"
@@ -79,55 +80,54 @@
       android:largeHeap="false"
       android:manageSpaceActivity="@string/manage_space_activity"
       android:multiArch="true"
-      android:name="org.chromium.chrome.browser.base.SplitChromeApplication"
       android:networkSecurityConfig="@xml/network_security_config"
       android:roundIcon="@drawable/ic_launcher_round"
       android:supportsRtl="true"
       android:use32bitAbi="true"
       android:zygotePreloadName="org.chromium.content.app.ZygotePreload">
     <activity  # DIFF-ANCHOR: ea1a94af
-        android:exported="false"
         android:name="com.google.android.gms.common.api.GoogleApiActivity"
+        android:exported="false"
         android:theme="@android:style/Theme.Translucent.NoTitleBar">
     </activity>  # DIFF-ANCHOR: ea1a94af
     <activity  # DIFF-ANCHOR: a2bae37c
+        android:name="com.google.android.play.core.common.PlayCoreDialogWrapperActivity"
         android:enabled="false"
         android:exported="false"
-        android:name="com.google.android.play.core.common.PlayCoreDialogWrapperActivity"
         android:process=":playcore_dialog_wrapper_activity"
         android:stateNotNeeded="true"
         android:theme="@style/Theme.PlayCore.Transparent">
     </activity>  # DIFF-ANCHOR: a2bae37c
     <activity  # DIFF-ANCHOR: 53a4871f
+        android:name="com.google.android.play.core.missingsplits.PlayCoreMissingSplitsActivity"
         android:enabled="false"
         android:exported="false"
         android:launchMode="singleInstance"
-        android:name="com.google.android.play.core.missingsplits.PlayCoreMissingSplitsActivity"
         android:process=":playcore_missing_splits_activity"
         android:stateNotNeeded="true">
     </activity>  # DIFF-ANCHOR: 53a4871f
     <activity  # DIFF-ANCHOR: 28dc9019
+        android:name="com.google.ar.core.InstallActivity"
         android:configChanges="keyboardHidden|orientation|screenSize"
         android:excludeFromRecents="true"
         android:exported="false"
         android:launchMode="singleTop"
-        android:name="com.google.ar.core.InstallActivity"
         android:theme="@android:style/Theme.Material.Light.Dialog.Alert">
     </activity>  # DIFF-ANCHOR: 28dc9019
     <activity  # DIFF-ANCHOR: 93d41352
+        android:name="org.chromium.chrome.browser.BrowserRestartActivity"
         android:excludeFromRecents="true"
         android:exported="false"
         android:launchMode="singleInstance"
-        android:name="org.chromium.chrome.browser.BrowserRestartActivity"
         android:process=":browser_restart_process"
         android:theme="@android:style/Theme.Translucent.NoTitleBar">
     </activity>  # DIFF-ANCHOR: 93d41352
     <activity  # DIFF-ANCHOR: 61b2c776
+        android:name="org.chromium.chrome.browser.ChromeTabbedActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:exported="true"
         android:hardwareAccelerated="false"
         android:launchMode="singleTask"
-        android:name="org.chromium.chrome.browser.ChromeTabbedActivity"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
         android:theme="@style/Theme.Chromium.TabbedMode"
@@ -139,11 +139,11 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: 61b2c776
     <activity  # DIFF-ANCHOR: 610e8ccf
+        android:name="org.chromium.chrome.browser.ChromeTabbedActivity2"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:exported="false"
         android:hardwareAccelerated="false"
         android:launchMode="singleTask"
-        android:name="org.chromium.chrome.browser.ChromeTabbedActivity2"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
         android:taskAffinity="$PACKAGE.ChromeTabbedActivity2"
@@ -156,23 +156,23 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: 610e8ccf
     <activity  # DIFF-ANCHOR: 76686af9
+        android:name="org.chromium.chrome.browser.LauncherShortcutActivity"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.LauncherShortcutActivity"
         android:taskAffinity=""
         android:theme="@android:style/Theme.NoDisplay">
     </activity>  # DIFF-ANCHOR: 76686af9
     <activity  # DIFF-ANCHOR: 9af505d2
+        android:name="org.chromium.chrome.browser.app.feedmanagement.FeedManagementActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.app.feedmanagement.FeedManagementActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
     </activity>  # DIFF-ANCHOR: 9af505d2
     <activity  # DIFF-ANCHOR: 78326aaf
+        android:name="org.chromium.chrome.browser.app.followmanagement.FollowManagementActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.app.followmanagement.FollowManagementActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
       <intent-filter>  # DIFF-ANCHOR: 0afe8981
@@ -181,38 +181,38 @@
       </intent-filter>  # DIFF-ANCHOR: 0afe8981
     </activity>  # DIFF-ANCHOR: 78326aaf
     <activity  # DIFF-ANCHOR: 50c7105b
+        android:name="org.chromium.chrome.browser.app.reengagement.ReengagementActivity"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.app.reengagement.ReengagementActivity"
         android:taskAffinity=""
         android:theme="@android:style/Theme.Translucent">
     </activity>  # DIFF-ANCHOR: 50c7105b
     <activity  # DIFF-ANCHOR: aeab60ac
+        android:name="org.chromium.chrome.browser.app.video_tutorials.VideoPlayerActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.app.video_tutorials.VideoPlayerActivity"
         android:screenOrientation="portrait"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         tools:ignore="LockedOrientationActivity">
     </activity>  # DIFF-ANCHOR: aeab60ac
     <activity  # DIFF-ANCHOR: 170e9f21
+        android:name="org.chromium.chrome.browser.app.video_tutorials.VideoTutorialListActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.app.video_tutorials.VideoTutorialListActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen">
     </activity>  # DIFF-ANCHOR: 170e9f21
     <activity  # DIFF-ANCHOR: da2eedc8
+        android:name="org.chromium.chrome.browser.bookmarks.BookmarkActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.bookmarks.BookmarkActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
     </activity>  # DIFF-ANCHOR: da2eedc8
     <activity  # DIFF-ANCHOR: a208e726
+        android:name="org.chromium.chrome.browser.bookmarks.BookmarkAddActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
         android:exported="true"
-        android:name="org.chromium.chrome.browser.bookmarks.BookmarkAddActivity"
         android:theme="@android:style/Theme.NoDisplay"
         android:windowSoftInputMode="stateHidden">
       <intent-filter>  # DIFF-ANCHOR: 47a8059b
@@ -221,35 +221,35 @@
       </intent-filter>  # DIFF-ANCHOR: 47a8059b
     </activity>  # DIFF-ANCHOR: a208e726
     <activity  # DIFF-ANCHOR: e0427380
+        android:name="org.chromium.chrome.browser.bookmarks.BookmarkAddEditFolderActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.bookmarks.BookmarkAddEditFolderActivity"
         android:theme="@style/Theme.Chromium.DialogWhenLarge">
     </activity>  # DIFF-ANCHOR: e0427380
     <activity  # DIFF-ANCHOR: b66ce3f2
+        android:name="org.chromium.chrome.browser.bookmarks.BookmarkEditActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
         android:label="@string/edit_bookmark"
-        android:name="org.chromium.chrome.browser.bookmarks.BookmarkEditActivity"
         android:theme="@style/Theme.Chromium.DialogWhenLarge"
         android:windowSoftInputMode="stateHidden">
     </activity>  # DIFF-ANCHOR: b66ce3f2
     <activity  # DIFF-ANCHOR: 0a21ad35
+        android:name="org.chromium.chrome.browser.bookmarks.BookmarkFolderSelectActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
         android:label="@string/bookmark_choose_folder"
-        android:name="org.chromium.chrome.browser.bookmarks.BookmarkFolderSelectActivity"
         android:theme="@style/Theme.Chromium.DialogWhenLarge"
         android:windowSoftInputMode="stateAlwaysHidden">
     </activity>  # DIFF-ANCHOR: 0a21ad35
     <activity  # DIFF-ANCHOR: 209b5ded
-        android:exported="false"
         android:name="org.chromium.chrome.browser.browserservices.ClearDataDialogActivity"
+        android:exported="false"
         android:theme="@style/Theme.Chromium.ClearDataDialogActivity">
     </activity>  # DIFF-ANCHOR: 209b5ded
     <activity  # DIFF-ANCHOR: 2b0ee4cd
-        android:exported="true"
         android:name="org.chromium.chrome.browser.browserservices.ManageTrustedWebActivityDataActivity"
+        android:exported="true"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen.Transparent">
       <intent-filter>  # DIFF-ANCHOR: 38d9d906
         <action android:name="android.support.customtabs.action.ACTION_MANAGE_TRUSTED_WEB_ACTIVITY_DATA"/>
@@ -262,10 +262,10 @@
       </intent-filter>  # DIFF-ANCHOR: 38d9d906
     </activity>  # DIFF-ANCHOR: 2b0ee4cd
     <activity  # DIFF-ANCHOR: 44266a6a
+        android:name="org.chromium.chrome.browser.customtabs.CustomTabActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:exported="false"
         android:hardwareAccelerated="false"
-        android:name="org.chromium.chrome.browser.customtabs.CustomTabActivity"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
         android:theme="@style/Theme.Chromium.Activity"
@@ -277,10 +277,10 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: 44266a6a
     <activity  # DIFF-ANCHOR: 4d923622
+        android:name="org.chromium.chrome.browser.customtabs.TranslucentCustomTabActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:exported="false"
         android:hardwareAccelerated="false"
-        android:name="org.chromium.chrome.browser.customtabs.TranslucentCustomTabActivity"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
         android:theme="@style/Theme.Chromium.Activity.FakeTranslucent"
@@ -292,62 +292,62 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: 4d923622
     <activity  # DIFF-ANCHOR: 1acdfd19
+        android:name="org.chromium.chrome.browser.document.ChromeLauncherActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:excludeFromRecents="true"
-        android:name="org.chromium.chrome.browser.document.ChromeLauncherActivity"
         android:relinquishTaskIdentity="true"
         android:taskAffinity=""
         android:theme="@style/LauncherTheme">
     </activity>  # DIFF-ANCHOR: 1acdfd19
     <activity  # DIFF-ANCHOR: 5c83a464
+        android:name="org.chromium.chrome.browser.download.DownloadActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.download.DownloadActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
     </activity>  # DIFF-ANCHOR: 5c83a464
     <activity  # DIFF-ANCHOR: 2121eb0d
+        android:name="org.chromium.chrome.browser.firstrun.FirstRunActivity"
         android:autoRemoveFromRecents="true"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
         android:label="@string/fre_activity_label"
         android:launchMode="singleTop"
-        android:name="org.chromium.chrome.browser.firstrun.FirstRunActivity"
         android:theme="@style/Theme.Chromium.DialogWhenLarge"
         android:windowSoftInputMode="stateHidden|adjustPan">
     </activity>  # DIFF-ANCHOR: 2121eb0d
     <activity  # DIFF-ANCHOR: 67932092
+        android:name="org.chromium.chrome.browser.firstrun.LightweightFirstRunActivity"
         android:autoRemoveFromRecents="true"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
         android:label="@string/fre_activity_label"
         android:launchMode="singleInstance"
-        android:name="org.chromium.chrome.browser.firstrun.LightweightFirstRunActivity"
         android:theme="@style/Theme.Chromium.AlertDialog.NoActionBar"
         android:windowSoftInputMode="stateHidden|adjustPan">
     </activity>  # DIFF-ANCHOR: 67932092
     <activity  # DIFF-ANCHOR: bb612a34
+        android:name="org.chromium.chrome.browser.firstrun.TabbedModeFirstRunActivity"
         android:autoRemoveFromRecents="true"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
         android:label="@string/fre_activity_label"
         android:launchMode="singleTop"
-        android:name="org.chromium.chrome.browser.firstrun.TabbedModeFirstRunActivity"
         android:theme="@style/Theme.Chromium.TabbedMode"
         android:windowSoftInputMode="stateHidden|adjustPan">
     </activity>  # DIFF-ANCHOR: bb612a34
     <activity  # DIFF-ANCHOR: 05911131
+        android:name="org.chromium.chrome.browser.history.HistoryActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.history.HistoryActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
     </activity>  # DIFF-ANCHOR: 05911131
     <activity  # DIFF-ANCHOR: b98302dc
+        android:name="org.chromium.chrome.browser.incognito.IncognitoTabLauncher"
         android:enabled="false"
         android:excludeFromRecents="true"
         android:exported="true"
-        android:name="org.chromium.chrome.browser.incognito.IncognitoTabLauncher"
         android:taskAffinity=""
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter>  # DIFF-ANCHOR: 8f811d02
@@ -356,17 +356,17 @@
       </intent-filter>  # DIFF-ANCHOR: 8f811d02
     </activity>  # DIFF-ANCHOR: b98302dc
     <activity  # DIFF-ANCHOR: 349d8ca5
+        android:name="org.chromium.chrome.browser.instantapps.AuthenticatedProxyActivity"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.instantapps.AuthenticatedProxyActivity"
         android:noHistory="true"
         android:theme="@android:style/Theme.NoDisplay">
     </activity>  # DIFF-ANCHOR: 349d8ca5
     <activity  # DIFF-ANCHOR: ecd48344
+        android:name="org.chromium.chrome.browser.media.MediaLauncherActivity"
         android:enabled="false"
         android:excludeFromRecents="true"
         android:exported="true"
-        android:name="org.chromium.chrome.browser.media.MediaLauncherActivity"
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter tools:ignore="AppLinkUrlError">  # DIFF-ANCHOR: 13c9b0a8
         <action android:name="android.intent.action.VIEW"/>
@@ -378,40 +378,40 @@
       </intent-filter>  # DIFF-ANCHOR: 13c9b0a8
     </activity>  # DIFF-ANCHOR: ecd48344
     <activity  # DIFF-ANCHOR: d706d96e
+        android:name="org.chromium.chrome.browser.media.PictureInPictureActivity"
         android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.media.PictureInPictureActivity"
         android:noHistory="true"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
         android:theme="@style/Theme.Chromium.Activity">
     </activity>  # DIFF-ANCHOR: d706d96e
     <activity  # DIFF-ANCHOR: 9023f153
+        android:name="org.chromium.chrome.browser.multiwindow.MultiInstanceChromeTabbedActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:exported="false"
         android:hardwareAccelerated="false"
-        android:name="org.chromium.chrome.browser.multiwindow.MultiInstanceChromeTabbedActivity"
         android:theme="@style/Theme.Chromium.TabbedMode"
         android:windowSoftInputMode="adjustResize">
     </activity>  # DIFF-ANCHOR: 9023f153
     <activity  # DIFF-ANCHOR: e86e2b49
+        android:name="org.chromium.chrome.browser.notifications.NotificationIntentInterceptor$TrampolineActivity"
         android:autoRemoveFromRecents="true"
         android:documentLaunchMode="always"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.notifications.NotificationIntentInterceptor$TrampolineActivity"
         android:noHistory="true"
         android:theme="@android:style/Theme.NoDisplay">
     </activity>  # DIFF-ANCHOR: e86e2b49
     <activity  # DIFF-ANCHOR: bec48e1f
+        android:name="org.chromium.chrome.browser.printing.PrintShareActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:enabled="false"
         android:excludeFromRecents="true"
         android:exported="true"
         android:icon="@drawable/sharing_print"
         android:label="@string/print_share_activity_title"
-        android:name="org.chromium.chrome.browser.printing.PrintShareActivity"
         android:noHistory="true"
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter>  # DIFF-ANCHOR: 4ee601b7
@@ -423,6 +423,7 @@
       </intent-filter>  # DIFF-ANCHOR: 4ee601b7
     </activity>  # DIFF-ANCHOR: bec48e1f
     <activity  # DIFF-ANCHOR: 7468a722
+        android:name="org.chromium.chrome.browser.searchwidget.SearchActivity"
         android:clearTaskOnLaunch="true"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
@@ -430,19 +431,18 @@
         android:hardwareAccelerated="false"
         android:label="Search"
         android:launchMode="singleTask"
-        android:name="org.chromium.chrome.browser.searchwidget.SearchActivity"
         android:taskAffinity=""
         android:theme="@style/Theme.Chromium.SearchActivity"
         android:windowSoftInputMode="adjustResize">
     </activity>  # DIFF-ANCHOR: 7468a722
     <activity  # DIFF-ANCHOR: f1aedff1
+        android:name="org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfShareActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:enabled="false"
         android:excludeFromRecents="true"
         android:exported="true"
         android:icon="@drawable/ic_launcher"
         android:label="@string/send_tab_to_self_share_activity_title"
-        android:name="org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfShareActivity"
         android:noHistory="true"
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter>  # DIFF-ANCHOR: 4ee601b7
@@ -452,20 +452,20 @@
       </intent-filter>  # DIFF-ANCHOR: 4ee601b7
     </activity>  # DIFF-ANCHOR: f1aedff1
     <activity  # DIFF-ANCHOR: d32b85df
+        android:name="org.chromium.chrome.browser.settings.SettingsActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
         android:label="@string/settings"
-        android:name="org.chromium.chrome.browser.settings.SettingsActivity"
         android:theme="@style/Theme.Chromium.Settings">
     </activity>  # DIFF-ANCHOR: d32b85df
     <activity  # DIFF-ANCHOR: 44158f9b
+        android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardShareActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:enabled="false"
         android:excludeFromRecents="true"
         android:exported="true"
         android:icon="@drawable/ic_devices_48dp"
         android:label="@string/shared_clipboard_share_activity_title"
-        android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardShareActivity"
         android:noHistory="true"
         android:theme="@style/Theme.Chromium.Activity.TranslucentNoAnimations">
       <intent-filter>  # DIFF-ANCHOR: 4ee601b7
@@ -475,42 +475,42 @@
       </intent-filter>  # DIFF-ANCHOR: 4ee601b7
     </activity>  # DIFF-ANCHOR: 44158f9b
     <activity  # DIFF-ANCHOR: fbf1ba15
+        android:name="org.chromium.chrome.browser.signin.SyncConsentActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.signin.SyncConsentActivity"
         android:theme="@style/Theme.Chromium.DialogWhenLarge">
     </activity>  # DIFF-ANCHOR: fbf1ba15
     <activity  # DIFF-ANCHOR: d2967c86
+        android:name="org.chromium.chrome.browser.site_settings.ManageSpaceActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
         android:label="@string/storage_management_activity_label"
-        android:name="org.chromium.chrome.browser.site_settings.ManageSpaceActivity"
         android:theme="@style/Theme.Chromium.Settings.ManageSpace">
     </activity>  # DIFF-ANCHOR: d2967c86
     <activity  # DIFF-ANCHOR: 8492e3fd
-        android:autoRemoveFromRecents="true"
         android:name="org.chromium.chrome.browser.sync.ui.PassphraseActivity"
+        android:autoRemoveFromRecents="true"
         android:theme="@style/Theme.Chromium.Activity">
     </activity>  # DIFF-ANCHOR: 8492e3fd
     <activity  # DIFF-ANCHOR: 76b60c10
+        android:name="org.chromium.chrome.browser.sync.ui.TrustedVaultKeyRetrievalProxyActivity"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.sync.ui.TrustedVaultKeyRetrievalProxyActivity"
         android:theme="@style/Theme.AppCompat">
     </activity>  # DIFF-ANCHOR: 76b60c10
     <activity  # DIFF-ANCHOR: 43bfa5de
+        android:name="org.chromium.chrome.browser.test_dummy.TestDummyActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
         android:exported="true"
-        android:name="org.chromium.chrome.browser.test_dummy.TestDummyActivity"
         android:noHistory="true"
         android:theme="@style/Theme.AppCompat">
     </activity>  # DIFF-ANCHOR: 43bfa5de
     <activity  # DIFF-ANCHOR: b007dcaa
+        android:name="org.chromium.chrome.browser.vr.VrCancelAnimationActivity"
         android:enableVrMode="@string/gvr_vr_mode_component"
         android:excludeFromRecents="true"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.vr.VrCancelAnimationActivity"
         android:noHistory="true"
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter>  # DIFF-ANCHOR: dea53031
@@ -520,12 +520,12 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: b007dcaa
     <activity  # DIFF-ANCHOR: 5e628a6c
+        android:name="org.chromium.chrome.browser.vr.VrFirstRunActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode"
         android:enableVrMode="@string/gvr_vr_mode_component"
         android:excludeFromRecents="true"
         android:exported="false"
         android:launchMode="singleInstance"
-        android:name="org.chromium.chrome.browser.vr.VrFirstRunActivity"
         android:theme="@style/VrActivityTheme">
       <intent-filter>  # DIFF-ANCHOR: dea53031
         <action android:name="org.chromium.chrome.browser.dummy.action"/>
@@ -534,8 +534,8 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: 5e628a6c
     <activity  # DIFF-ANCHOR: 9bb1f409
-        android:exported="true"
         android:name="org.chromium.chrome.browser.webapps.ActivateWebApkActivity"
+        android:exported="true"
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter>  # DIFF-ANCHOR: 0d72b7f0
         <action android:name="org.chromium.chrome.browser.webapps.ActivateWebApkActivity.ACTIVATE"/>
@@ -543,11 +543,11 @@
       </intent-filter>  # DIFF-ANCHOR: 0d72b7f0
     </activity>  # DIFF-ANCHOR: 9bb1f409
     <activity  # DIFF-ANCHOR: f1dc024a
+        android:name="org.chromium.chrome.browser.webapps.SameTaskWebApkActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:exported="false"
         android:hardwareAccelerated="false"
         android:label="@string/webapp_activity_title"
-        android:name="org.chromium.chrome.browser.webapps.SameTaskWebApkActivity"
         android:persistableMode="persistNever"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
@@ -560,13 +560,13 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: f1dc024a
     <activity  # DIFF-ANCHOR: 5e467d8a
+        android:name="org.chromium.chrome.browser.webapps.WebappActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density"
         android:documentLaunchMode="intoExisting"
         android:exported="false"
         android:hardwareAccelerated="false"
         android:label="@string/webapp_activity_title"
         android:launchMode="singleTop"
-        android:name="org.chromium.chrome.browser.webapps.WebappActivity"
         android:persistableMode="persistNever"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
@@ -579,9 +579,9 @@
       </intent-filter>  # DIFF-ANCHOR: dea53031
     </activity>  # DIFF-ANCHOR: 5e467d8a
     <activity  # DIFF-ANCHOR: aea75380
+        android:name="org.chromium.chrome.browser.webapps.WebappLauncherActivity"
         android:excludeFromRecents="true"
         android:exported="true"
-        android:name="org.chromium.chrome.browser.webapps.WebappLauncherActivity"
         android:taskAffinity=""
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter>  # DIFF-ANCHOR: faf519ad
@@ -594,18 +594,18 @@
       </intent-filter>  # DIFF-ANCHOR: 9c5197e9
     </activity>  # DIFF-ANCHOR: aea75380
     <activity  # DIFF-ANCHOR: 66a0be05
+        android:name="org.chromium.chrome.browser.webapps.launchpad.LaunchpadActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
-        android:name="org.chromium.chrome.browser.webapps.launchpad.LaunchpadActivity"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen"
         android:windowSoftInputMode="stateAlwaysHidden|adjustResize">
     </activity>  # DIFF-ANCHOR: 66a0be05
     <activity  # DIFF-ANCHOR: a1fac31f
+        android:name="org.chromium.chrome.browser.webauth.authenticator.CableAuthenticatorActivity"
         android:excludeFromRecents="true"
         android:exported="true"
         android:label="@string/cablev2_activity_title"
         android:launchMode="singleTop"
-        android:name="org.chromium.chrome.browser.webauth.authenticator.CableAuthenticatorActivity"
         android:permission="com.google.android.gms.auth.cryptauth.permission.CABLEV2_SERVER_LINK"
         android:theme="@style/Theme.Chromium.Activity.Fullscreen">
       <intent-filter>  # DIFF-ANCHOR: 5873407a
@@ -614,18 +614,18 @@
       <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" android:resource="@xml/phone_as_a_security_key_accessory_filter"/>
     </activity>  # DIFF-ANCHOR: a1fac31f
     <activity  # DIFF-ANCHOR: 1d9b4077
+        android:name="org.chromium.components.media_router.caf.remoting.CafExpandedControllerActivity"
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:excludeFromRecents="true"
         android:hardwareAccelerated="true"
         android:label="Chrome.CafExpandedControllerActivity"
         android:launchMode="singleTask"
-        android:name="org.chromium.components.media_router.caf.remoting.CafExpandedControllerActivity"
         android:noHistory="true"
         android:theme="@style/Theme.Chromium.Activity">
     </activity>  # DIFF-ANCHOR: 1d9b4077
     <activity-alias  # DIFF-ANCHOR: 9da0e5b6
-        android:exported="true"
         android:name="com.google.android.apps.chrome.IntentDispatcher"
+        android:exported="true"
         android:targetActivity="org.chromium.chrome.browser.document.ChromeLauncherActivity">
       <intent-filter>  # DIFF-ANCHOR: a5330430
         <action android:name="android.intent.action.MAIN"/>
@@ -758,8 +758,8 @@
       <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>
     </activity-alias>  # DIFF-ANCHOR: 9da0e5b6
     <activity-alias  # DIFF-ANCHOR: 5042984f
-        android:exported="true"
         android:name="com.google.android.apps.chrome.Main"
+        android:exported="true"
         android:targetActivity="org.chromium.chrome.browser.ChromeTabbedActivity">
       <intent-filter>  # DIFF-ANCHOR: a5330430
         <action android:name="android.intent.action.MAIN"/>
@@ -776,8 +776,8 @@
       <meta-data android:name="android.app.shortcuts" android:resource="@xml/launchershortcuts"/>
     </activity-alias>  # DIFF-ANCHOR: 5042984f
     <activity-alias  # DIFF-ANCHOR: 03398466
-        android:exported="true"
         android:name="com.google.android.apps.chrome.TranslateDispatcher"
+        android:exported="true"
         android:permission="$PACKAGE.permission.TRANSLATE"
         android:targetActivity="org.chromium.chrome.browser.document.ChromeLauncherActivity">
       <intent-filter>  # DIFF-ANCHOR: 75e5f897
@@ -786,8 +786,8 @@
       </intent-filter>  # DIFF-ANCHOR: 75e5f897
     </activity-alias>  # DIFF-ANCHOR: 03398466
     <activity-alias  # DIFF-ANCHOR: dcfe2999
-        android:label="@string/webapp_activity_title"
         android:name="com.google.android.apps.chrome.webapps.WebappActivity"
+        android:label="@string/webapp_activity_title"
         android:resizeableActivity="true"
         android:supportsPictureInPicture="true"
         android:targetActivity="org.chromium.chrome.browser.webapps.WebappActivity">
@@ -797,10 +797,10 @@
         android:targetActivity="org.chromium.chrome.browser.webapps.WebappLauncherActivity">
     </activity-alias>  # DIFF-ANCHOR: 8e23336d
     <activity-alias  # DIFF-ANCHOR: b4a6221b
+        android:name="org.chromium.chrome.browser.media.AudioLauncherActivity"
         android:enabled="false"
         android:excludeFromRecents="true"
         android:exported="true"
-        android:name="org.chromium.chrome.browser.media.AudioLauncherActivity"
         android:targetActivity="org.chromium.chrome.browser.media.MediaLauncherActivity"
         android:theme="@android:style/Theme.NoDisplay">
       <intent-filter tools:ignore="AppLinkUrlError">  # DIFF-ANCHOR: 13c9b0a8
@@ -812,8 +812,8 @@
       </intent-filter>  # DIFF-ANCHOR: 13c9b0a8
     </activity-alias>  # DIFF-ANCHOR: b4a6221b
     <activity-alias  # DIFF-ANCHOR: 7c349c4f
-        android:exported="false"
         android:name="org.chromium.chrome.browser.webapps.SecureWebAppLauncher"
+        android:exported="false"
         android:targetActivity="org.chromium.chrome.browser.webapps.WebappLauncherActivity">
       <intent-filter>  # DIFF-ANCHOR: 9fe4b527
         <action android:name="org.chromium.chrome.browser.webapps.WebappManager.ACTION_START_SECURE_WEBAPP"/>
@@ -831,135 +831,135 @@
     <meta-data android:name="org.chromium.content.browser.NUM_PRIVILEGED_SERVICES" android:value="5"/>
     <meta-data android:name="org.chromium.content.browser.NUM_SANDBOXED_SERVICES" android:value="40"/>
     <meta-data android:name="org.chromium.content.browser.SMART_CLIP_PROVIDER" android:value="org.chromium.content_public.browser.SmartClipProvider"/>
-    <provider  # DIFF-ANCHOR: 31002ffd
+    <provider  # DIFF-ANCHOR: bc0a9a7a
+        android:name="com.google.firebase.provider.FirebaseInitProvider"
         android:authorities="$PACKAGE.firebaseinitprovider"
         android:directBootAware="true"
         android:exported="false"
-        android:initOrder="100"
-        android:name="com.google.firebase.provider.FirebaseInitProvider">
-    </provider>  # DIFF-ANCHOR: 31002ffd
-    <provider  # DIFF-ANCHOR: 97e158a1
+        android:initOrder="100">
+    </provider>  # DIFF-ANCHOR: bc0a9a7a
+    <provider  # DIFF-ANCHOR: b73a881a
+        android:name="org.chromium.chrome.browser.download.DownloadFileProvider"
         android:authorities="$PACKAGE.DownloadFileProvider"
         android:exported="false"
-        android:grantUriPermissions="true"
-        android:name="org.chromium.chrome.browser.download.DownloadFileProvider">
+        android:grantUriPermissions="true">
       <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/>
-    </provider>  # DIFF-ANCHOR: 97e158a1
-    <provider  # DIFF-ANCHOR: 2215b9cd
+    </provider>  # DIFF-ANCHOR: b73a881a
+    <provider  # DIFF-ANCHOR: f1c2d7e1
+        android:name="org.chromium.chrome.browser.provider.ChromeBrowserProvider"
         android:authorities="$PACKAGE.ChromeBrowserProvider;$PACKAGE.browser;$PACKAGE"
-        android:exported="true"
-        android:name="org.chromium.chrome.browser.provider.ChromeBrowserProvider">
+        android:exported="true">
       <path-permission android:path="/bookmarks/search_suggest_query" android:readPermission="android.permission.GLOBAL_SEARCH"/>
-    </provider>  # DIFF-ANCHOR: 2215b9cd
-    <provider  # DIFF-ANCHOR: 6e306896
+    </provider>  # DIFF-ANCHOR: f1c2d7e1
+    <provider  # DIFF-ANCHOR: 67014fab
+        android:name="org.chromium.chrome.browser.util.ChromeFileProvider"
         android:authorities="$PACKAGE.FileProvider"
         android:exported="false"
-        android:grantUriPermissions="true"
-        android:name="org.chromium.chrome.browser.util.ChromeFileProvider">
+        android:grantUriPermissions="true">
       <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/>
-    </provider>  # DIFF-ANCHOR: 6e306896
-    <receiver  # DIFF-ANCHOR: 7d221226
+    </provider>  # DIFF-ANCHOR: 67014fab
+    <receiver  # DIFF-ANCHOR: 58d39a0f
+        android:name="com.google.android.apps.chrome.appwidget.bookmarks.BookmarkThumbnailWidgetProvider"
         android:exported="true"
-        android:label="@string/bookmark_widget_title"
-        android:name="com.google.android.apps.chrome.appwidget.bookmarks.BookmarkThumbnailWidgetProvider">
+        android:label="@string/bookmark_widget_title">
       <intent-filter>  # DIFF-ANCHOR: 1ebe78e9
         <action android:name=".BOOKMARK_APPWIDGET_UPDATE"/>
         <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
       </intent-filter>  # DIFF-ANCHOR: 1ebe78e9
       <meta-data android:name="android.appwidget.provider" android:resource="@xml/bookmark_widget_info"/>
-    </receiver>  # DIFF-ANCHOR: 7d221226
-    <receiver  # DIFF-ANCHOR: 1091f66b
-        android:exported="false"
-        android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver">
-    </receiver>  # DIFF-ANCHOR: 1091f66b
+    </receiver>  # DIFF-ANCHOR: 58d39a0f
+    <receiver  # DIFF-ANCHOR: 0a6f8fa5
+        android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 0a6f8fa5
     <receiver  # DIFF-ANCHOR: f1c9c29d
-        android:exported="true"
         android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
+        android:exported="true"
         android:permission="com.google.android.c2dm.permission.SEND">
       <intent-filter>  # DIFF-ANCHOR: aae22013
         <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
       </intent-filter>  # DIFF-ANCHOR: aae22013
     </receiver>  # DIFF-ANCHOR: f1c9c29d
-    <receiver  # DIFF-ANCHOR: 9ef4cd0a
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.announcement.AnnouncementNotificationManager$Receiver">
-    </receiver>  # DIFF-ANCHOR: 9ef4cd0a
-    <receiver  # DIFF-ANCHOR: 9a0a00e8
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.app.send_tab_to_self.SendTabToSelfNotificationReceiver">
-    </receiver>  # DIFF-ANCHOR: 9a0a00e8
-    <receiver  # DIFF-ANCHOR: b93ab7db
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetProxy">
-    </receiver>  # DIFF-ANCHOR: b93ab7db
-    <receiver  # DIFF-ANCHOR: 3e596004
-        android:exported="true"
-        android:name="org.chromium.chrome.browser.browserservices.ClientAppBroadcastReceiver">
+    <receiver  # DIFF-ANCHOR: 68e22783
+        android:name="org.chromium.chrome.browser.announcement.AnnouncementNotificationManager$Receiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 68e22783
+    <receiver  # DIFF-ANCHOR: f6d77f5a
+        android:name="org.chromium.chrome.browser.app.send_tab_to_self.SendTabToSelfNotificationReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: f6d77f5a
+    <receiver  # DIFF-ANCHOR: be2dce69
+        android:name="org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetProxy"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: be2dce69
+    <receiver  # DIFF-ANCHOR: 31a8399a
+        android:name="org.chromium.chrome.browser.browserservices.ClientAppBroadcastReceiver"
+        android:exported="true">
       <intent-filter>  # DIFF-ANCHOR: e5bb6a36
         <action android:name="android.intent.action.PACKAGE_DATA_CLEARED"/>
         <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED"/>
         <data android:scheme="package"/>
       </intent-filter>  # DIFF-ANCHOR: e5bb6a36
-    </receiver>  # DIFF-ANCHOR: 3e596004
-    <receiver  # DIFF-ANCHOR: a31e6ce5
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.browserservices.ui.trustedwebactivity.DisclosureAcceptanceBroadcastReceiver">
-    </receiver>  # DIFF-ANCHOR: a31e6ce5
-    <receiver  # DIFF-ANCHOR: 779ee86b
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.customtabs.CustomTabsShareBroadcastReceiver">
-    </receiver>  # DIFF-ANCHOR: 779ee86b
-    <receiver  # DIFF-ANCHOR: bccc7d87
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.locale.LocaleChangedBroadcastReceiver">
+    </receiver>  # DIFF-ANCHOR: 31a8399a
+    <receiver  # DIFF-ANCHOR: 2f4b69ac
+        android:name="org.chromium.chrome.browser.browserservices.ui.trustedwebactivity.DisclosureAcceptanceBroadcastReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 2f4b69ac
+    <receiver  # DIFF-ANCHOR: fd245bee
+        android:name="org.chromium.chrome.browser.customtabs.CustomTabsShareBroadcastReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: fd245bee
+    <receiver  # DIFF-ANCHOR: de591772
+        android:name="org.chromium.chrome.browser.locale.LocaleChangedBroadcastReceiver"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: 5458f2a2
         <action android:name="android.intent.action.LOCALE_CHANGED"/>
       </intent-filter>  # DIFF-ANCHOR: 5458f2a2
-    </receiver>  # DIFF-ANCHOR: bccc7d87
-    <receiver  # DIFF-ANCHOR: 17866e9d
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.notifications.NotificationIntentInterceptor$Receiver">
-    </receiver>  # DIFF-ANCHOR: 17866e9d
-    <receiver  # DIFF-ANCHOR: de24469c
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.notifications.NotificationService$Receiver">
-    </receiver>  # DIFF-ANCHOR: de24469c
-    <receiver  # DIFF-ANCHOR: 2934478c
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.notifications.NotificationServiceImpl$Receiver">
+    </receiver>  # DIFF-ANCHOR: de591772
+    <receiver  # DIFF-ANCHOR: 2b9c19aa
+        android:name="org.chromium.chrome.browser.notifications.NotificationIntentInterceptor$Receiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 2b9c19aa
+    <receiver  # DIFF-ANCHOR: d8a2af42
+        android:name="org.chromium.chrome.browser.notifications.NotificationService$Receiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: d8a2af42
+    <receiver  # DIFF-ANCHOR: df76237f
+        android:name="org.chromium.chrome.browser.notifications.NotificationServiceImpl$Receiver"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: 1c1c5ed8
         <action android:name="org.chromium.chrome.browser.notifications.CLICK_NOTIFICATION"/>
         <action android:name="org.chromium.chrome.browser.notifications.CLOSE_NOTIFICATION"/>
       </intent-filter>  # DIFF-ANCHOR: 1c1c5ed8
-    </receiver>  # DIFF-ANCHOR: 2934478c
-    <receiver  # DIFF-ANCHOR: e1c4d394
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.notifications.scheduler.DisplayAgent$Receiver">
-    </receiver>  # DIFF-ANCHOR: e1c4d394
-    <receiver  # DIFF-ANCHOR: de47f306
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.offlinepages.AutoFetchNotifier$CompleteNotificationReceiver">
-    </receiver>  # DIFF-ANCHOR: de47f306
-    <receiver  # DIFF-ANCHOR: 98349cb3
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.offlinepages.AutoFetchNotifier$InProgressCancelReceiver">
-    </receiver>  # DIFF-ANCHOR: 98349cb3
-    <receiver  # DIFF-ANCHOR: cfa3bb7f
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.offlinepages.prefetch.PrefetchedPagesNotifier$ClickReceiver">
-    </receiver>  # DIFF-ANCHOR: cfa3bb7f
-    <receiver  # DIFF-ANCHOR: 1f02dc2f
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.offlinepages.prefetch.PrefetchedPagesNotifier$SettingsReceiver">
-    </receiver>  # DIFF-ANCHOR: 1f02dc2f
-    <receiver  # DIFF-ANCHOR: 40a69297
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.omaha.UpdateNotificationController$UpdateNotificationReceiver">
-    </receiver>  # DIFF-ANCHOR: 40a69297
-    <receiver  # DIFF-ANCHOR: 3664f7eb
+    </receiver>  # DIFF-ANCHOR: df76237f
+    <receiver  # DIFF-ANCHOR: 0cefd906
+        android:name="org.chromium.chrome.browser.notifications.scheduler.DisplayAgent$Receiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 0cefd906
+    <receiver  # DIFF-ANCHOR: 7d28c8e4
+        android:name="org.chromium.chrome.browser.offlinepages.AutoFetchNotifier$CompleteNotificationReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 7d28c8e4
+    <receiver  # DIFF-ANCHOR: 05f19ac3
+        android:name="org.chromium.chrome.browser.offlinepages.AutoFetchNotifier$InProgressCancelReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 05f19ac3
+    <receiver  # DIFF-ANCHOR: f2ef5c19
+        android:name="org.chromium.chrome.browser.offlinepages.prefetch.PrefetchedPagesNotifier$ClickReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: f2ef5c19
+    <receiver  # DIFF-ANCHOR: 0267e562
+        android:name="org.chromium.chrome.browser.offlinepages.prefetch.PrefetchedPagesNotifier$SettingsReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 0267e562
+    <receiver  # DIFF-ANCHOR: a3a6e991
+        android:name="org.chromium.chrome.browser.omaha.UpdateNotificationController$UpdateNotificationReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: a3a6e991
+    <receiver  # DIFF-ANCHOR: a0d83ae5
+        android:name="org.chromium.chrome.browser.searchwidget.SearchWidgetProvider"
         android:exported="true"
-        android:label="@string/search_widget_title"
-        android:name="org.chromium.chrome.browser.searchwidget.SearchWidgetProvider">
+        android:label="@string/search_widget_title">
       <intent-filter>  # DIFF-ANCHOR: 4ed161a4
         <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
       </intent-filter>  # DIFF-ANCHOR: 4ed161a4
@@ -973,101 +973,101 @@
         <action android:name="org.chromium.chrome.browser.searchwidget.UPDATE_ALL_WIDGETS"/>
       </intent-filter>  # DIFF-ANCHOR: fc048873
       <meta-data android:name="android.appwidget.provider" android:resource="@xml/search_widget_info"/>
-    </receiver>  # DIFF-ANCHOR: 3664f7eb
-    <receiver  # DIFF-ANCHOR: 93e73992
-        android:exported="true"
-        android:name="org.chromium.chrome.browser.sharing.click_to_call.ClickToCallMessageHandler$PhoneUnlockedReceiver">
+    </receiver>  # DIFF-ANCHOR: a0d83ae5
+    <receiver  # DIFF-ANCHOR: 2f1fe689
+        android:name="org.chromium.chrome.browser.sharing.click_to_call.ClickToCallMessageHandler$PhoneUnlockedReceiver"
+        android:exported="true">
       <intent-filter>  # DIFF-ANCHOR: 4b5ec7a9
         <action android:name="android.intent.action.USER_PRESENT"/>
       </intent-filter>  # DIFF-ANCHOR: 4b5ec7a9
-    </receiver>  # DIFF-ANCHOR: 93e73992
-    <receiver  # DIFF-ANCHOR: 956432e8
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.sharing.click_to_call.ClickToCallMessageHandler$TapReceiver">
-    </receiver>  # DIFF-ANCHOR: 956432e8
-    <receiver  # DIFF-ANCHOR: cbb425dc
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardMessageHandler$TapReceiver">
-    </receiver>  # DIFF-ANCHOR: cbb425dc
-    <receiver  # DIFF-ANCHOR: 729144c9
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardMessageHandler$TryAgainReceiver">
-    </receiver>  # DIFF-ANCHOR: 729144c9
-    <receiver  # DIFF-ANCHOR: e61d98d4
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.sharing.sms_fetcher.SmsFetcherMessageHandler$NotificationReceiver">
-    </receiver>  # DIFF-ANCHOR: e61d98d4
-    <receiver  # DIFF-ANCHOR: aa6748fc
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.upgrade.PackageReplacedBroadcastReceiver">
+    </receiver>  # DIFF-ANCHOR: 2f1fe689
+    <receiver  # DIFF-ANCHOR: 124ac9a1
+        android:name="org.chromium.chrome.browser.sharing.click_to_call.ClickToCallMessageHandler$TapReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 124ac9a1
+    <receiver  # DIFF-ANCHOR: 84094425
+        android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardMessageHandler$TapReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 84094425
+    <receiver  # DIFF-ANCHOR: 352611a4
+        android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardMessageHandler$TryAgainReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 352611a4
+    <receiver  # DIFF-ANCHOR: 420d0678
+        android:name="org.chromium.chrome.browser.sharing.sms_fetcher.SmsFetcherMessageHandler$NotificationReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: 420d0678
+    <receiver  # DIFF-ANCHOR: 9015e3cf
+        android:name="org.chromium.chrome.browser.upgrade.PackageReplacedBroadcastReceiver"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: e8cce90c
         <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
       </intent-filter>  # DIFF-ANCHOR: e8cce90c
-    </receiver>  # DIFF-ANCHOR: aa6748fc
-    <receiver  # DIFF-ANCHOR: 3e5f56cb
-        android:exported="false"
-        android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskBroadcastReceiver">
-    </receiver>  # DIFF-ANCHOR: 3e5f56cb
+    </receiver>  # DIFF-ANCHOR: 9015e3cf
+    <receiver  # DIFF-ANCHOR: c787586e
+        android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskBroadcastReceiver"
+        android:exported="false">
+    </receiver>  # DIFF-ANCHOR: c787586e
     <service android:name="androidx.browser.customtabs.PostMessageService"/>
-    <service  # DIFF-ANCHOR: 41539e3c
-        android:exported="false"
-        android:name="com.google.android.gms.cast.framework.ReconnectionService">
-    </service>  # DIFF-ANCHOR: 41539e3c
-    <service  # DIFF-ANCHOR: 7dad1ec5
-        android:exported="false"
-        android:name="com.google.android.gms.cast.framework.media.MediaNotificationService">
-    </service>  # DIFF-ANCHOR: 7dad1ec5
+    <service  # DIFF-ANCHOR: 749391ed
+        android:name="com.google.android.gms.cast.framework.ReconnectionService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 749391ed
+    <service  # DIFF-ANCHOR: 48ce9d28
+        android:name="com.google.android.gms.cast.framework.media.MediaNotificationService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 48ce9d28
     <service  # DIFF-ANCHOR: 7e26656b
+        android:name="com.google.firebase.components.ComponentDiscoveryService"
         android:directBootAware="true"
         android:exported="false"
-        android:name="com.google.firebase.components.ComponentDiscoveryService"
         tools:targetApi="n">
       <meta-data android:name="com.google.firebase.components:com.google.firebase.dynamicloading.DynamicLoadingRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/>
       <meta-data android:name="com.google.firebase.components:com.google.firebase.iid.Registrar" android:value="com.google.firebase.components.ComponentRegistrar"/>
       <meta-data android:name="com.google.firebase.components:com.google.firebase.installations.FirebaseInstallationsRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/>
       <meta-data android:name="com.google.firebase.components:com.google.firebase.messaging.FirebaseMessagingRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/>
     </service>  # DIFF-ANCHOR: 7e26656b
-    <service  # DIFF-ANCHOR: 137c712b
+    <service  # DIFF-ANCHOR: 2295960c
+        android:name="com.google.firebase.messaging.FirebaseMessagingService"
         android:directBootAware="true"
-        android:exported="false"
-        android:name="com.google.firebase.messaging.FirebaseMessagingService">
+        android:exported="false">
       <intent-filter android:priority="-500">  # DIFF-ANCHOR: 69e70070
         <action android:name="com.google.firebase.MESSAGING_EVENT"/>
       </intent-filter>  # DIFF-ANCHOR: 69e70070
-    </service>  # DIFF-ANCHOR: 137c712b
+    </service>  # DIFF-ANCHOR: 2295960c
     <service  # DIFF-ANCHOR: 4c2196d9
-        android:exported="true"
         android:name="com.google.ipc.invalidation.ticl.android2.channel.GcmRegistrationTaskService"
+        android:exported="true"
         android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
       <intent-filter>  # DIFF-ANCHOR: 99686c45
         <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/>
       </intent-filter>  # DIFF-ANCHOR: 99686c45
     </service>  # DIFF-ANCHOR: 4c2196d9
     <service  # DIFF-ANCHOR: c34d99ad
-        android:exported="true"
         android:name="org.chromium.chrome.browser.ChromeBackgroundService"
+        android:exported="true"
         android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
       <intent-filter>  # DIFF-ANCHOR: 99686c45
         <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/>
       </intent-filter>  # DIFF-ANCHOR: 99686c45
     </service>  # DIFF-ANCHOR: c34d99ad
     <service  # DIFF-ANCHOR: ac44dbad
-        android:exported="false"
         android:name="org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetService"
+        android:exported="false"
         android:permission="android.permission.BIND_REMOTEVIEWS">
     </service>  # DIFF-ANCHOR: ac44dbad
     <service  # DIFF-ANCHOR: 90d2ec9b
-        android:exported="false"
         android:name="org.chromium.chrome.browser.crash.ChromeMinidumpUploadJobService"
+        android:exported="false"
         android:permission="android.permission.BIND_JOB_SERVICE">
     </service>  # DIFF-ANCHOR: 90d2ec9b
-    <service  # DIFF-ANCHOR: 2ce0b6a4
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.crash.MinidumpUploadService">
-    </service>  # DIFF-ANCHOR: 2ce0b6a4
+    <service  # DIFF-ANCHOR: f72bb7bc
+        android:name="org.chromium.chrome.browser.crash.MinidumpUploadService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: f72bb7bc
     <service  # DIFF-ANCHOR: ee1c39a8
-        android:exported="true"
         android:name="org.chromium.chrome.browser.customtabs.CustomTabsConnectionService"
+        android:exported="true"
         tools:ignore="ExportedService">
       <intent-filter>  # DIFF-ANCHOR: d46bf795
         <action android:name="android.support.customtabs.action.CustomTabsService"/>
@@ -1081,418 +1081,418 @@
         <category android:name="androidx.browser.trusted.category.WebShareTargetV2"/>
       </intent-filter>  # DIFF-ANCHOR: d46bf795
     </service>  # DIFF-ANCHOR: ee1c39a8
-    <service  # DIFF-ANCHOR: 555432db
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.download.DownloadBroadcastManager">
-    </service>  # DIFF-ANCHOR: 555432db
-    <service  # DIFF-ANCHOR: 4cf14268
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.download.DownloadForegroundService">
-    </service>  # DIFF-ANCHOR: 4cf14268
-    <service  # DIFF-ANCHOR: a651602a
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.incognito.IncognitoNotificationService">
-    </service>  # DIFF-ANCHOR: a651602a
-    <service  # DIFF-ANCHOR: 4f8e62ea
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.media.MediaCaptureNotificationService">
-    </service>  # DIFF-ANCHOR: 4f8e62ea
-    <service  # DIFF-ANCHOR: 4129c705
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$CastListenerService">
+    <service  # DIFF-ANCHOR: 4b22c3f5
+        android:name="org.chromium.chrome.browser.download.DownloadBroadcastManager"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 4b22c3f5
+    <service  # DIFF-ANCHOR: 413310e5
+        android:name="org.chromium.chrome.browser.download.DownloadForegroundService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 413310e5
+    <service  # DIFF-ANCHOR: 7e3ff13a
+        android:name="org.chromium.chrome.browser.incognito.IncognitoNotificationService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 7e3ff13a
+    <service  # DIFF-ANCHOR: ac8469ff
+        android:name="org.chromium.chrome.browser.media.MediaCaptureNotificationService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: ac8469ff
+    <service  # DIFF-ANCHOR: 7ef9e4e5
+        android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$CastListenerService"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: f401157d
         <action android:name="android.intent.action.MEDIA_BUTTON"/>
       </intent-filter>  # DIFF-ANCHOR: f401157d
-    </service>  # DIFF-ANCHOR: 4129c705
-    <service  # DIFF-ANCHOR: c6abf186
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$PlaybackListenerService">
+    </service>  # DIFF-ANCHOR: 7ef9e4e5
+    <service  # DIFF-ANCHOR: 41fa6492
+        android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$PlaybackListenerService"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: f401157d
         <action android:name="android.intent.action.MEDIA_BUTTON"/>
       </intent-filter>  # DIFF-ANCHOR: f401157d
-    </service>  # DIFF-ANCHOR: c6abf186
-    <service  # DIFF-ANCHOR: 4d0d10fe
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$PresentationListenerService">
+    </service>  # DIFF-ANCHOR: 41fa6492
+    <service  # DIFF-ANCHOR: 1260bca4
+        android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$PresentationListenerService"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: f401157d
         <action android:name="android.intent.action.MEDIA_BUTTON"/>
       </intent-filter>  # DIFF-ANCHOR: f401157d
-    </service>  # DIFF-ANCHOR: 4d0d10fe
+    </service>  # DIFF-ANCHOR: 1260bca4
     <service  # DIFF-ANCHOR: 4b2220c4
-        android:exported="false"
         android:name="org.chromium.chrome.browser.notifications.NotificationJobService"
+        android:exported="false"
         android:permission="android.permission.BIND_JOB_SERVICE">
     </service>  # DIFF-ANCHOR: 4b2220c4
-    <service  # DIFF-ANCHOR: 3224d309
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.notifications.NotificationService">
-    </service>  # DIFF-ANCHOR: 3224d309
-    <service android:exported="false" android:name="org.chromium.chrome.browser.omaha.OmahaClient"/>
+    <service  # DIFF-ANCHOR: 7fb8c03f
+        android:name="org.chromium.chrome.browser.notifications.NotificationService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 7fb8c03f
+    <service android:name="org.chromium.chrome.browser.omaha.OmahaClient" android:exported="false"/>
     <service  # DIFF-ANCHOR: 53256720
+        android:name="org.chromium.chrome.browser.photo_picker.DecoderService"
         android:description="@string/decoder_description"
         android:exported="false"
         android:isolatedProcess="true"
-        android:name="org.chromium.chrome.browser.photo_picker.DecoderService"
         android:process=":decoder_service">
     </service>  # DIFF-ANCHOR: 53256720
     <service  # DIFF-ANCHOR: 064aae37
-        android:exported="true"
         android:name="org.chromium.chrome.browser.prerender.ChromePrerenderService"
+        android:exported="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 064aae37
-    <service  # DIFF-ANCHOR: d930289b
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.services.gcm.ChromeGcmListenerService">
+    <service  # DIFF-ANCHOR: 6d9cb216
+        android:name="org.chromium.chrome.browser.services.gcm.ChromeGcmListenerService"
+        android:exported="false">
       <intent-filter>  # DIFF-ANCHOR: 69e70070
         <action android:name="com.google.firebase.MESSAGING_EVENT"/>
       </intent-filter>  # DIFF-ANCHOR: 69e70070
-    </service>  # DIFF-ANCHOR: d930289b
-    <service  # DIFF-ANCHOR: 682abdc1
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.services.gcm.GCMBackgroundService">
-    </service>  # DIFF-ANCHOR: 682abdc1
-    <service  # DIFF-ANCHOR: dfb5da84
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.services.gcm.InvalidationGcmUpstreamSender">
-    </service>  # DIFF-ANCHOR: dfb5da84
-    <service  # DIFF-ANCHOR: 80f6a8e5
-        android:exported="false"
-        android:name="org.chromium.chrome.browser.tracing.TracingNotificationService">
-    </service>  # DIFF-ANCHOR: 80f6a8e5
+    </service>  # DIFF-ANCHOR: 6d9cb216
+    <service  # DIFF-ANCHOR: 7b05db30
+        android:name="org.chromium.chrome.browser.services.gcm.GCMBackgroundService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: 7b05db30
+    <service  # DIFF-ANCHOR: dcd6fa39
+        android:name="org.chromium.chrome.browser.services.gcm.InvalidationGcmUpstreamSender"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: dcd6fa39
+    <service  # DIFF-ANCHOR: c26364a8
+        android:name="org.chromium.chrome.browser.tracing.TracingNotificationService"
+        android:exported="false">
+    </service>  # DIFF-ANCHOR: c26364a8
     <service  # DIFF-ANCHOR: 8fc286d0
-        android:exported="true"
         android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskGcmTaskService"
+        android:exported="true"
         android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
       <intent-filter>  # DIFF-ANCHOR: 99686c45
         <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/>
       </intent-filter>  # DIFF-ANCHOR: 99686c45
     </service>  # DIFF-ANCHOR: 8fc286d0
     <service  # DIFF-ANCHOR: a550decc
-        android:exported="false"
         android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskJobService"
+        android:exported="false"
         android:permission="android.permission.BIND_JOB_SERVICE">
     </service>  # DIFF-ANCHOR: a550decc
     <service  # DIFF-ANCHOR: 2a1cd701
-        android:exported="true"
         android:name="org.chromium.components.payments.PaymentDetailsUpdateService"
+        android:exported="true"
         tools:ignore="ExportedService">
     </service>  # DIFF-ANCHOR: 2a1cd701
     <service  # DIFF-ANCHOR: 0c6c4fd9
+        android:name="org.chromium.content.app.PrivilegedProcessService0"
         android:exported="false"
         android:isolatedProcess="false"
-        android:name="org.chromium.content.app.PrivilegedProcessService0"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":privileged_process0">
     </service>  # DIFF-ANCHOR: 0c6c4fd9
     <service  # DIFF-ANCHOR: 6f89af32
+        android:name="org.chromium.content.app.PrivilegedProcessService1"
         android:exported="false"
         android:isolatedProcess="false"
-        android:name="org.chromium.content.app.PrivilegedProcessService1"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":privileged_process1">
     </service>  # DIFF-ANCHOR: 6f89af32
     <service  # DIFF-ANCHOR: 40e0d738
+        android:name="org.chromium.content.app.PrivilegedProcessService2"
         android:exported="false"
         android:isolatedProcess="false"
-        android:name="org.chromium.content.app.PrivilegedProcessService2"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":privileged_process2">
     </service>  # DIFF-ANCHOR: 40e0d738
     <service  # DIFF-ANCHOR: b197517d
+        android:name="org.chromium.content.app.PrivilegedProcessService3"
         android:exported="false"
         android:isolatedProcess="false"
-        android:name="org.chromium.content.app.PrivilegedProcessService3"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":privileged_process3">
     </service>  # DIFF-ANCHOR: b197517d
     <service  # DIFF-ANCHOR: 52303702
+        android:name="org.chromium.content.app.PrivilegedProcessService4"
         android:exported="false"
         android:isolatedProcess="false"
-        android:name="org.chromium.content.app.PrivilegedProcessService4"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":privileged_process4">
     </service>  # DIFF-ANCHOR: 52303702
     <service  # DIFF-ANCHOR: b1e3e8bd
+        android:name="org.chromium.content.app.SandboxedProcessService0"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService0"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process0"
         android:useAppZygote="true">
     </service>  # DIFF-ANCHOR: b1e3e8bd
     <service  # DIFF-ANCHOR: 76d1ccf8
+        android:name="org.chromium.content.app.SandboxedProcessService1"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService1"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process1">
     </service>  # DIFF-ANCHOR: 76d1ccf8
     <service  # DIFF-ANCHOR: 38b95266
+        android:name="org.chromium.content.app.SandboxedProcessService10"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService10"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process10">
     </service>  # DIFF-ANCHOR: 38b95266
     <service  # DIFF-ANCHOR: e4a2e4a2
+        android:name="org.chromium.content.app.SandboxedProcessService11"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService11"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process11">
     </service>  # DIFF-ANCHOR: e4a2e4a2
     <service  # DIFF-ANCHOR: d9b2ffba
+        android:name="org.chromium.content.app.SandboxedProcessService12"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService12"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process12">
     </service>  # DIFF-ANCHOR: d9b2ffba
     <service  # DIFF-ANCHOR: b41bb17d
+        android:name="org.chromium.content.app.SandboxedProcessService13"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService13"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process13">
     </service>  # DIFF-ANCHOR: b41bb17d
     <service  # DIFF-ANCHOR: aec0ea21
+        android:name="org.chromium.content.app.SandboxedProcessService14"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService14"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process14">
     </service>  # DIFF-ANCHOR: aec0ea21
     <service  # DIFF-ANCHOR: cf88a5e5
+        android:name="org.chromium.content.app.SandboxedProcessService15"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService15"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process15">
     </service>  # DIFF-ANCHOR: cf88a5e5
     <service  # DIFF-ANCHOR: 7d85889d
+        android:name="org.chromium.content.app.SandboxedProcessService16"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService16"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process16">
     </service>  # DIFF-ANCHOR: 7d85889d
     <service  # DIFF-ANCHOR: dae26ed4
+        android:name="org.chromium.content.app.SandboxedProcessService17"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService17"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process17">
     </service>  # DIFF-ANCHOR: dae26ed4
     <service  # DIFF-ANCHOR: 2c6cf029
+        android:name="org.chromium.content.app.SandboxedProcessService18"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService18"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process18">
     </service>  # DIFF-ANCHOR: 2c6cf029
     <service  # DIFF-ANCHOR: 1d2f0988
+        android:name="org.chromium.content.app.SandboxedProcessService19"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService19"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process19">
     </service>  # DIFF-ANCHOR: 1d2f0988
     <service  # DIFF-ANCHOR: 4a39041b
+        android:name="org.chromium.content.app.SandboxedProcessService2"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService2"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process2">
     </service>  # DIFF-ANCHOR: 4a39041b
     <service  # DIFF-ANCHOR: 073533bf
+        android:name="org.chromium.content.app.SandboxedProcessService20"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService20"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process20">
     </service>  # DIFF-ANCHOR: 073533bf
     <service  # DIFF-ANCHOR: d24da41d
+        android:name="org.chromium.content.app.SandboxedProcessService21"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService21"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process21">
     </service>  # DIFF-ANCHOR: d24da41d
     <service  # DIFF-ANCHOR: 594d8b32
+        android:name="org.chromium.content.app.SandboxedProcessService22"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService22"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process22">
     </service>  # DIFF-ANCHOR: 594d8b32
     <service  # DIFF-ANCHOR: 5528c0c3
+        android:name="org.chromium.content.app.SandboxedProcessService23"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService23"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process23">
     </service>  # DIFF-ANCHOR: 5528c0c3
     <service  # DIFF-ANCHOR: b7ab2ba3
+        android:name="org.chromium.content.app.SandboxedProcessService24"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService24"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process24">
     </service>  # DIFF-ANCHOR: b7ab2ba3
     <service  # DIFF-ANCHOR: cec6cb64
+        android:name="org.chromium.content.app.SandboxedProcessService25"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService25"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process25">
     </service>  # DIFF-ANCHOR: cec6cb64
     <service  # DIFF-ANCHOR: 5b4a00fe
+        android:name="org.chromium.content.app.SandboxedProcessService26"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService26"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process26">
     </service>  # DIFF-ANCHOR: 5b4a00fe
     <service  # DIFF-ANCHOR: ad49d203
+        android:name="org.chromium.content.app.SandboxedProcessService27"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService27"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process27">
     </service>  # DIFF-ANCHOR: ad49d203
     <service  # DIFF-ANCHOR: 573298e9
+        android:name="org.chromium.content.app.SandboxedProcessService28"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService28"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process28">
     </service>  # DIFF-ANCHOR: 573298e9
     <service  # DIFF-ANCHOR: 79897b32
+        android:name="org.chromium.content.app.SandboxedProcessService29"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService29"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process29">
     </service>  # DIFF-ANCHOR: 79897b32
     <service  # DIFF-ANCHOR: 84335864
+        android:name="org.chromium.content.app.SandboxedProcessService3"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService3"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process3">
     </service>  # DIFF-ANCHOR: 84335864
     <service  # DIFF-ANCHOR: c4bd371e
+        android:name="org.chromium.content.app.SandboxedProcessService30"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService30"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process30">
     </service>  # DIFF-ANCHOR: c4bd371e
     <service  # DIFF-ANCHOR: 394a9fd0
+        android:name="org.chromium.content.app.SandboxedProcessService31"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService31"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process31">
     </service>  # DIFF-ANCHOR: 394a9fd0
     <service  # DIFF-ANCHOR: b811afb8
+        android:name="org.chromium.content.app.SandboxedProcessService32"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService32"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process32">
     </service>  # DIFF-ANCHOR: b811afb8
     <service  # DIFF-ANCHOR: 2811ddd3
+        android:name="org.chromium.content.app.SandboxedProcessService33"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService33"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process33">
     </service>  # DIFF-ANCHOR: 2811ddd3
     <service  # DIFF-ANCHOR: 73ae1688
+        android:name="org.chromium.content.app.SandboxedProcessService34"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService34"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process34">
     </service>  # DIFF-ANCHOR: 73ae1688
     <service  # DIFF-ANCHOR: c476f324
+        android:name="org.chromium.content.app.SandboxedProcessService35"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService35"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process35">
     </service>  # DIFF-ANCHOR: c476f324
     <service  # DIFF-ANCHOR: 75d5304b
+        android:name="org.chromium.content.app.SandboxedProcessService36"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService36"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process36">
     </service>  # DIFF-ANCHOR: 75d5304b
     <service  # DIFF-ANCHOR: dc6d0617
+        android:name="org.chromium.content.app.SandboxedProcessService37"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService37"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process37">
     </service>  # DIFF-ANCHOR: dc6d0617
     <service  # DIFF-ANCHOR: e31efe49
+        android:name="org.chromium.content.app.SandboxedProcessService38"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService38"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process38">
     </service>  # DIFF-ANCHOR: e31efe49
     <service  # DIFF-ANCHOR: 5736507e
+        android:name="org.chromium.content.app.SandboxedProcessService39"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService39"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process39">
     </service>  # DIFF-ANCHOR: 5736507e
     <service  # DIFF-ANCHOR: a161be24
+        android:name="org.chromium.content.app.SandboxedProcessService4"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService4"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process4">
     </service>  # DIFF-ANCHOR: a161be24
     <service  # DIFF-ANCHOR: 8e591688
+        android:name="org.chromium.content.app.SandboxedProcessService5"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService5"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process5">
     </service>  # DIFF-ANCHOR: 8e591688
     <service  # DIFF-ANCHOR: 705141d0
+        android:name="org.chromium.content.app.SandboxedProcessService6"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService6"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process6">
     </service>  # DIFF-ANCHOR: 705141d0
     <service  # DIFF-ANCHOR: 38ed2189
+        android:name="org.chromium.content.app.SandboxedProcessService7"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService7"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process7">
     </service>  # DIFF-ANCHOR: 38ed2189
     <service  # DIFF-ANCHOR: aa417956
+        android:name="org.chromium.content.app.SandboxedProcessService8"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService8"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process8">
     </service>  # DIFF-ANCHOR: aa417956
     <service  # DIFF-ANCHOR: e2f3bbbd
+        android:name="org.chromium.content.app.SandboxedProcessService9"
         android:exported="False"
         android:isolatedProcess="true"
-        android:name="org.chromium.content.app.SandboxedProcessService9"
         android:permission="$PACKAGE.permission.CHILD_SERVICE"
         android:process=":sandboxed_process9">
     </service>  # DIFF-ANCHOR: e2f3bbbd
-    <uses-static-library android:certDigest="32a2fc74d731105859e5a85df16d95f102d85b22099b8064c5d8915c61dad1e0" android:name="org.chromium.trichromelibrary" android:version="$VERSION_NUMBER"/>
+    <uses-static-library android:name="org.chromium.trichromelibrary" android:certDigest="32a2fc74d731105859e5a85df16d95f102d85b22099b8064c5d8915c61dad1e0" android:version="$VERSION_NUMBER"/>
   </application>
 </manifest>
diff --git a/chrome/android/expectations/trichrome_library_apk.AndroidManifest.expected b/chrome/android/expectations/trichrome_library_apk.AndroidManifest.expected
index f7c9802f..8059033 100644
--- a/chrome/android/expectations/trichrome_library_apk.AndroidManifest.expected
+++ b/chrome/android/expectations/trichrome_library_apk.AndroidManifest.expected
@@ -1,14 +1,14 @@
 <?xml version="1.0" ?>
 <manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="org.chromium.trichromelibrary"
     platformBuildVersionCode="30"
     platformBuildVersionName="11"
-    tools:ignore="MissingVersion,MissingLeanbackLauncher"
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
+    tools:ignore="MissingVersion,MissingLeanbackLauncher">
+  <uses-feature android:glEsVersion="0x00020000"/>
   <uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
   <uses-feature android:name="android.software.leanback" android:required="false"/>
-  <uses-feature android:glEsVersion="0x00020000"/>
   <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="30"/>
   <application
       android:extractNativeLibs="false"
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/PriceTrackingUtilities.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/PriceTrackingUtilities.java
index c7a1ba7..b648e40 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/PriceTrackingUtilities.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/PriceTrackingUtilities.java
@@ -158,6 +158,14 @@
         return SHARED_PREFERENCES_MANAGER.readInt(PRICE_ALERTS_MESSAGE_CARD_SHOW_COUNT, 0);
     }
 
+    /**
+     * @return whether or not the user is in a state that allows them to use price tracking feature.
+     *         Note: These checks can also be used in other commerce features.
+     */
+    public static boolean canFetchCommerceData() {
+        return isSignedIn() && isOpenTabsSyncEnabled() && isAnonymizedUrlDataCollectionEnabled();
+    }
+
     private static boolean isSignedIn() {
         return IdentityServicesProvider.get()
                 .getIdentityManager(Profile.getLastUsedRegularProfile())
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
index 832ea36..5a6a977 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
@@ -116,6 +116,8 @@
                 LensFeature.SEARCH_BOX_START_VARIANT_LENS_CAMERA_ASSISTED_SEARCH,
                 LensFeature.MIN_AGSA_VERSION_LENS_CAMERA_ASSISTED_SEARCH,
                 MerchantViewerConfig.DEFAULT_TRUST_SIGNALS_MESSAGE_DELAY,
+                MerchantViewerConfig.TRUST_SIGNALS_MESSAGE_WINDOW_DURATION_SECONDS,
+                MerchantViewerConfig.TRUST_SIGNALS_SHEET_USE_PAGE_TITLE,
                 PageAnnotationsServiceConfig.PAGE_ANNOTATIONS_BASE_URL,
                 ReturnToChromeExperimentsUtil.TAB_SWITCHER_ON_RETURN_MS,
                 ShoppingPersistedTabData.TIME_TO_LIVE_MS,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
index dfc2cd1..5aeac61 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
@@ -23,6 +23,7 @@
 import org.chromium.base.EarlyTraceEvent;
 import org.chromium.base.JNIUtils;
 import org.chromium.base.LocaleUtils;
+import org.chromium.base.Log;
 import org.chromium.base.PathUtils;
 import org.chromium.base.TraceEvent;
 import org.chromium.base.library_loader.LibraryLoader;
@@ -30,6 +31,7 @@
 import org.chromium.base.memory.MemoryPressureMonitor;
 import org.chromium.base.supplier.Supplier;
 import org.chromium.base.task.AsyncTask;
+import org.chromium.build.BuildConfig;
 import org.chromium.chrome.browser.ProductConfig;
 import org.chromium.chrome.browser.crash.ApplicationStatusTracker;
 import org.chromium.chrome.browser.crash.FirebaseConfig;
@@ -40,6 +42,7 @@
 import org.chromium.chrome.browser.metrics.UmaUtils;
 import org.chromium.components.embedder_support.application.FontPreloadingWorkaround;
 import org.chromium.components.module_installer.util.ModuleUtil;
+import org.chromium.components.version_info.VersionConstants;
 import org.chromium.ui.base.ResourceBundle;
 
 /**
@@ -51,6 +54,7 @@
  * {@link SplitChromeApplication}.
  */
 public class SplitCompatApplication extends Application {
+    private static final String TAG = "SplitCompatApp";
     private static final String COMMAND_LINE_FILE = "chrome-command-line";
     private static final String ATTACH_BASE_CONTEXT_EVENT = "ChromeApplication.attachBaseContext";
     // Public to allow use in ChromeBackupAgent
@@ -111,7 +115,14 @@
     // Quirk: context.getApplicationContext() returns null during this method.
     @Override
     protected void attachBaseContext(Context context) {
+        boolean isIsolatedProcess = ContextUtils.isIsolatedProcess();
         boolean isBrowserProcess = isBrowserProcess();
+        // Using concatenation rather than %s to allow values to be inlined by R8.
+        Log.i(TAG,
+                "Launched version=" + VersionConstants.PRODUCT_VERSION
+                        + " minSdkVersion=" + BuildConfig.MIN_SDK_VERSION
+                        + " isBundle=" + ProductConfig.IS_BUNDLE + " processName=%s isIsolated=%s",
+                ContextUtils.getProcessName(), isIsolatedProcess);
 
         if (isBrowserProcess) {
             UmaUtils.recordMainEntryPointTime();
@@ -190,7 +201,7 @@
 
         BuildInfo.setFirebaseAppId(FirebaseConfig.getFirebaseAppId());
 
-        if (!ContextUtils.isIsolatedProcess()) {
+        if (!isIsolatedProcess) {
             // Incremental install disables process isolation, so things in this block will
             // actually be run for incremental apks, but not normal apks.
             PureJavaExceptionHandler.installHandler();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithRequestMetadataHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithRequestMetadataHandler.java
index e55c9140..2fe3323 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithRequestMetadataHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithRequestMetadataHandler.java
@@ -4,23 +4,16 @@
 
 package org.chromium.chrome.browser.externalnav;
 
-import android.annotation.SuppressLint;
 import android.content.Intent;
 
 import androidx.annotation.Nullable;
 
 import org.chromium.base.IntentUtils;
-import org.chromium.base.Log;
-import org.chromium.base.SecureRandomInitializer;
-import org.chromium.base.task.AsyncTask;
-import org.chromium.base.task.BackgroundOnlyAsyncTask;
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.url.Origin;
 
-import java.io.IOException;
 import java.security.SecureRandom;
 import java.util.Arrays;
-import java.util.concurrent.ExecutionException;
 
 /**
  * This class generates a token for the most recently launched external intent that has
@@ -42,8 +35,7 @@
 
     private static final Object INSTANCE_LOCK = new Object();
     private static IntentWithRequestMetadataHandler sIntentWithRequestMetadataHandler;
-    private SecureRandom mSecureRandom;
-    private AsyncTask<SecureRandom> mSecureRandomInitializer;
+    private SecureRandom mSecureRandom = new SecureRandom();
     private RequestMetadata mRequestMetadata;
     private byte[] mIntentToken;
     private String mUri;
@@ -89,25 +81,6 @@
         return sIntentWithRequestMetadataHandler;
     }
 
-    private IntentWithRequestMetadataHandler() {
-        mSecureRandomInitializer = new BackgroundOnlyAsyncTask<SecureRandom>() {
-            // SecureRandomInitializer addresses the bug in SecureRandom that "TrulyRandom"
-            // warns about, so this lint warning can safely be suppressed.
-            @SuppressLint("TrulyRandom")
-            @Override
-            protected SecureRandom doInBackground() {
-                SecureRandom secureRandom = null;
-                try {
-                    secureRandom = new SecureRandom();
-                    SecureRandomInitializer.initialize(secureRandom);
-                } catch (IOException ioe) {
-                    Log.e(TAG, "Cannot initialize SecureRandom", ioe);
-                }
-                return secureRandom;
-            }
-        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
-    }
-
     /**
      * Generate a new token for the intent and put the token and request metadata in the
      * intent extra. This will invalidate the token on the previously launched intent with request
@@ -117,15 +90,6 @@
      * @param metadata Request metadata to be put into the intent extra.
      */
     public void onNewIntentWithRequestMetadata(Intent intent, RequestMetadata metadata) {
-        if (mSecureRandomInitializer != null) {
-            try {
-                mSecureRandom = mSecureRandomInitializer.get();
-            } catch (InterruptedException | ExecutionException e) {
-                Log.e(TAG, "Error fetching SecureRandom", e);
-            }
-            mSecureRandomInitializer = null;
-        }
-        if (mSecureRandom == null) return;
         mIntentToken = new byte[32];
         mSecureRandom.nextBytes(mIntentToken);
         intent.putExtra(EXTRA_REQUEST_METADATA_TOKEN, mIntentToken);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java
index 73a5499..33d810ef 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java
@@ -11,13 +11,11 @@
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.Callback;
-import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
-import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType;
 import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler.VoiceResult;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
@@ -34,8 +32,6 @@
  * Bridge to the native AutocompleteControllerAndroid.
  */
 public class AutocompleteController {
-    private static final String TAG = "Autocomplete";
-
     // Maximum number of voice suggestions to show.
     private static final int MAX_VOICE_SUGGESTION_COUNT = 3;
 
@@ -46,14 +42,14 @@
     // was the most ideal.
     private static final int OMNIBOX_SPARE_RENDERER_DELAY_MS = 1000;
 
-    private final Callback<Profile> mSpareRendererCreator;
+    private final @NonNull Callback<Profile> mSpareRendererCreator;
     private long mNativeAutocompleteControllerAndroid;
-    private long mCurrentNativeAutocompleteResult;
     private OnSuggestionsReceivedListener mListener;
 
     private boolean mUseCachedZeroSuggestResults;
     private boolean mWaitingForSuggestionsToCache;
     private Profile mProfile;
+    private @NonNull AutocompleteResult mAutocompleteResult;
 
     /**
      * Listener for receiving OmniboxSuggestions.
@@ -64,6 +60,7 @@
     }
 
     public AutocompleteController(@NonNull Callback<Profile> spareRendererCreator) {
+        mAutocompleteResult = new AutocompleteResult(null, null);
         mSpareRendererCreator = spareRendererCreator;
     }
 
@@ -139,9 +136,6 @@
             int cursorPosition, boolean preventInlineAutocomplete, @Nullable String queryTileId,
             boolean isQueryStartedFromTiles) {
         assert mListener != null : "Ensure a listener is set prior to calling.";
-        // crbug.com/764749
-        Log.w(TAG, "starting autocomplete controller..[%b][%b]", profile == null,
-                TextUtils.isEmpty(url));
         if (profile == null || TextUtils.isEmpty(url)) return;
 
         setProfile(profile);
@@ -227,20 +221,14 @@
      * Stops generating autocomplete suggestions for the currently specified text from
      * {@link #start(Profile,String, String, boolean)}.
      *
-     * <p>
-     * Calling this method with {@code true}, will result in
-     * {@link #onSuggestionsReceived(AutocompleteResult, String, long)} being called with an empty
-     * result set.
-     *
-     * @param clear Whether to clear the most recent autocomplete results.
+     * @param clear Whether to clear the most recent autocomplete results. When true, the
+     *         {@link #onSuggestionsReceived(AutocompleteResult, String)} will be called with an
+     *         empty result set.
      */
     public void stop(boolean clear) {
         assert mListener != null : "Ensure a listener is set prior to calling.";
-        mCurrentNativeAutocompleteResult = 0;
         mWaitingForSuggestionsToCache = false;
         if (mNativeAutocompleteControllerAndroid != 0) {
-            // crbug.com/764749
-            Log.w(TAG, "stopping autocomplete.");
             AutocompleteControllerJni.get().stop(
                     mNativeAutocompleteControllerAndroid, AutocompleteController.this, clear);
         }
@@ -261,10 +249,11 @@
      * Deletes an omnibox suggestion, if possible.
      * @param position The position at which the suggestion is located.
      */
-    void deleteSuggestion(int position, int hashCode) {
+    void deleteSuggestion(int position) {
+        if (!mAutocompleteResult.verifyCoherency()) return;
         if (mNativeAutocompleteControllerAndroid != 0) {
-            AutocompleteControllerJni.get().deleteSuggestion(mNativeAutocompleteControllerAndroid,
-                    AutocompleteController.this, position, hashCode);
+            AutocompleteControllerJni.get().deleteSuggestion(
+                    mNativeAutocompleteControllerAndroid, AutocompleteController.this, position);
         }
     }
 
@@ -273,16 +262,16 @@
      */
     @VisibleForTesting
     long getCurrentNativeAutocompleteResult() {
-        return mCurrentNativeAutocompleteResult;
+        return mAutocompleteResult.getNativeObjectRef();
     }
 
     @CalledByNative
-    protected void onSuggestionsReceived(AutocompleteResult autocompleteResult,
-            String inlineAutocompleteText, long currentNativeAutocompleteResult) {
+    protected void onSuggestionsReceived(
+            AutocompleteResult autocompleteResult, String inlineAutocompleteText) {
         assert mListener != null : "Ensure a listener is set prior generating suggestions.";
         final AutocompleteResult originalResult = autocompleteResult;
 
-        mCurrentNativeAutocompleteResult = currentNativeAutocompleteResult;
+        mAutocompleteResult = autocompleteResult;
 
         // Notify callbacks of suggestions.
         mListener.onSuggestionsReceived(autocompleteResult, inlineAutocompleteText);
@@ -312,14 +301,13 @@
      * @param webContents The web contents for the tab where the selected suggestion will be shown.
      */
     @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
-    public void onSuggestionSelected(int selectedIndex, int disposition, int hashCode, int type,
+    public void onSuggestionSelected(int selectedIndex, int disposition, int type,
             String currentPageUrl, int pageClassification, long elapsedTimeSinceModified,
             int completedLength, WebContents webContents) {
+        if (!mAutocompleteResult.verifyCoherency()) return;
         assert mNativeAutocompleteControllerAndroid != 0;
-        // Don't natively log voice suggestion results as we add them in Java.
-        if (type == OmniboxSuggestionType.VOICE_SUGGEST) return;
         AutocompleteControllerJni.get().onSuggestionSelected(mNativeAutocompleteControllerAndroid,
-                AutocompleteController.this, selectedIndex, disposition, hashCode, currentPageUrl,
+                AutocompleteController.this, selectedIndex, disposition, currentPageUrl,
                 pageClassification, elapsedTimeSinceModified, completedLength, webContents);
     }
 
@@ -341,55 +329,34 @@
     }
 
     /**
-     * Verifies whether the given AutocompleteMatch object has the same hashCode as another
-     * suggestion. This is used to validate that the native AutocompleteMatch object is in sync
-     * with the Java version.
-     */
-    @CalledByNative
-    private static boolean isEquivalentOmniboxSuggestion(
-            AutocompleteMatch suggestion, int hashCode) {
-        if (suggestion.hashCode() == hashCode) return true;
-
-        // Note: these are only logged on development builds.
-        // clang-format off
-        Log.d(TAG, "Checked suggestion not valid: " + suggestion.getFillIntoEdit() + " ("
-                   + suggestion.getType() + ")");
-        // clang-format on
-        return false;
-    }
-
-    /**
      * Updates aqs parameters on the selected match that we will navigate to and returns the
-     * updated URL. |selectedIndex| and |hashCode| is the position and hash code of the selected
-     * match. |elapsedTimeSinceInputChange| is the time in ms between the first typed input
-     * and match selection.
+     * updated URL.
      *
      * @param selectedIndex The index of the autocomplete entry selected.
-     * @param hashCode Hash code of the AutocompleteMatch object that is selected.
      * @param elapsedTimeSinceInputChange The number of ms between the time the user started
-     *                                    typing in the omnibox and the time the user has selected
-     *                                    a suggestion.
+     *         typing in the omnibox and the time the user has selected a suggestion.
      */
     GURL updateMatchDestinationUrlWithQueryFormulationTime(
-            int selectedIndex, int hashCode, long elapsedTimeSinceInputChange) {
+            int selectedIndex, long elapsedTimeSinceInputChange) {
+        if (!mAutocompleteResult.verifyCoherency()) return null;
         return updateMatchDestinationUrlWithQueryFormulationTime(
-                selectedIndex, hashCode, elapsedTimeSinceInputChange, null, null);
+                selectedIndex, elapsedTimeSinceInputChange, null, null);
     }
 
     /**
      * Updates destination url on the selected match that we will navigate to and returns the
-     * updated URL. |selectedIndex| and |hashCode| is the position and hash code of the selected
-     * match. |elapsedTimeSinceInputChange| is the time in ms between the first typed input
-     * and match selection. If |newQueryText| and |newQueryParams| is not empty, they will be
-     * used to replace the existing query string and query params.
-     * For example, if |elapsedTimeSinceInputChange| > 0, |newQyeryText| is "Politics news".
-     * and the existing destination URL is "www.google.com/search?q=News+&aqs=chrome.0.69i...l3",
+     * updated URL.
+     *
+     * If |newQueryText| and |newQueryParams| are not empty, they will be used to replace the
+     * existing query string and query params. For example, if:
+     * - |elapsedTimeSinceInputChange| > 0,
+     * - |newQyeryText| is "Politics news",
+     * - existing destination URL is "www.google.com/search?q=News+&aqs=chrome.0.69i...l3",
      * the returned new URL will be of the format
-     * "www.google.com/search?q=Politics+news&aqs=chrome.0.69i...l3.1409j0j9" where
-     * ".1409j0j9" is the encoded elapsed time.
+     *   "www.google.com/search?q=Politics+news&aqs=chrome.0.69i...l3.1409j0j9"
+     * where ".1409j0j9" is the encoded elapsed time.
      *
      * @param selectedIndex The index of the autocomplete entry selected.
-     * @param hashCode Hash code of the AutocompleteMatch object that is selected.
      * @param elapsedTimeSinceInputChange The number of ms between the time the user started
      *                                    typing in the omnibox and the time the user has selected
      *                                    a suggestion.
@@ -398,11 +365,12 @@
      * @return The url to navigate to for this match with aqs parameter, query string and parameters
      *         updated, if we are making a Google search query.
      */
-    GURL updateMatchDestinationUrlWithQueryFormulationTime(int selectedIndex, int hashCode,
+    GURL updateMatchDestinationUrlWithQueryFormulationTime(int selectedIndex,
             long elapsedTimeSinceInputChange, String newQueryText, List<String> newQueryParams) {
+        if (!mAutocompleteResult.verifyCoherency()) return null;
         return AutocompleteControllerJni.get().updateMatchDestinationURLWithQueryFormulationTime(
                 mNativeAutocompleteControllerAndroid, AutocompleteController.this, selectedIndex,
-                hashCode, elapsedTimeSinceInputChange, newQueryText,
+                elapsedTimeSinceInputChange, newQueryText,
                 newQueryParams == null ? null
                                        : newQueryParams.toArray(new String[newQueryParams.size()]));
     }
@@ -433,18 +401,18 @@
                 boolean clearResults);
         void resetSession(long nativeAutocompleteControllerAndroid, AutocompleteController caller);
         void onSuggestionSelected(long nativeAutocompleteControllerAndroid,
-                AutocompleteController caller, int selectedIndex, int disposition, int hashCode,
+                AutocompleteController caller, int selectedIndex, int disposition,
                 String currentPageUrl, int pageClassification, long elapsedTimeSinceModified,
                 int completedLength, WebContents webContents);
         void onOmniboxFocused(long nativeAutocompleteControllerAndroid,
                 AutocompleteController caller, String omniboxText, String currentUrl,
                 int pageClassification, String currentTitle);
         void deleteSuggestion(long nativeAutocompleteControllerAndroid,
-                AutocompleteController caller, int selectedIndex, int hashCode);
+                AutocompleteController caller, int selectedIndex);
         GURL updateMatchDestinationURLWithQueryFormulationTime(
                 long nativeAutocompleteControllerAndroid, AutocompleteController caller,
-                int selectedIndex, int hashCode, long elapsedTimeSinceInputChange,
-                String newQueryText, String[] newQueryParams);
+                int selectedIndex, long elapsedTimeSinceInputChange, String newQueryText,
+                String[] newQueryParams);
         Tab findMatchingTabWithUrl(
                 long nativeAutocompleteControllerAndroid, AutocompleteController caller, GURL url);
         void setVoiceMatches(long nativeAutocompleteControllerAndroid, String[] matches,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
index f85a957..d4a4dce4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
@@ -539,7 +539,7 @@
             public void onClick(PropertyModel model, int buttonType) {
                 if (buttonType == ModalDialogProperties.ButtonType.POSITIVE) {
                     RecordUserAction.record("MobileOmniboxDeleteRequested");
-                    mAutocomplete.deleteSuggestion(position, suggestion.hashCode());
+                    mAutocomplete.deleteSuggestion(position);
                     manager.dismissDialog(model, DialogDismissalCause.POSITIVE_BUTTON_CLICKED);
                 } else if (buttonType == ModalDialogProperties.ButtonType.NEGATIVE) {
                     manager.dismissDialog(model, DialogDismissalCause.NEGATIVE_BUTTON_CLICKED);
@@ -618,7 +618,7 @@
         // TODO(mariakhomenko): Ideally we want to update match destination URL with new aqs
         // for query in the omnibox and voice suggestions, but it's currently difficult to do.
         GURL updatedUrl = mAutocomplete.updateMatchDestinationUrlWithQueryFormulationTime(
-                verifiedIndex, suggestion.hashCode(), getElapsedTimeSinceInputChange());
+                verifiedIndex, getElapsedTimeSinceInputChange());
 
         return updatedUrl == null ? url : updatedUrl;
     }
@@ -764,6 +764,7 @@
      */
     void loadTypedOmniboxText(long eventTime) {
         final String urlText = mUrlBarEditingTextProvider.getTextWithAutocomplete();
+        cancelAutocompleteRequests();
         if (mNativeInitialized) {
             findMatchAndLoadUrl(urlText, eventTime);
         } else {
@@ -1019,9 +1020,9 @@
         WebContents webContents =
                 mDataProvider.hasTab() ? mDataProvider.getTab().getWebContents() : null;
 
-        mAutocomplete.onSuggestionSelected(matchPosition, disposition, suggestion.hashCode(),
-                suggestion.getType(), currentPageUrl, pageClassification, elapsedTimeSinceModified,
-                autocompleteLength, webContents);
+        mAutocomplete.onSuggestionSelected(matchPosition, disposition, suggestion.getType(),
+                currentPageUrl, pageClassification, elapsedTimeSinceModified, autocompleteLength,
+                webContents);
     }
 
     @Override
@@ -1061,8 +1062,7 @@
         }
         if (suggestion == null) return;
         GURL updatedUrl = mAutocomplete.updateMatchDestinationUrlWithQueryFormulationTime(position,
-                suggestion.hashCode(), getElapsedTimeSinceInputChange(), queryTile.queryText,
-                queryTile.searchParams);
+                getElapsedTimeSinceInputChange(), queryTile.queryText, queryTile.searchParams);
         // RecordMetrics has to be called before loadUrl, or otherwise the native AutocompleteResult
         // object will be reset and the suggestion will fail validation.
         recordMetrics(position, WindowOpenDisposition.CURRENT_TAB, suggestion);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
index 2e5b24b..4e69b683 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -47,6 +47,8 @@
 import org.chromium.chrome.browser.history.HistoryManagerUtils;
 import org.chromium.chrome.browser.language.LanguageAskPrompt;
 import org.chromium.chrome.browser.layouts.LayoutStateProvider;
+import org.chromium.chrome.browser.merchant_viewer.MerchantTrustMetrics;
+import org.chromium.chrome.browser.merchant_viewer.MerchantTrustSignalsCoordinator;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
 import org.chromium.chrome.browser.offlinepages.indicator.OfflineIndicatorControllerV2;
 import org.chromium.chrome.browser.offlinepages.indicator.OfflineIndicatorInProductHelpController;
@@ -62,6 +64,7 @@
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabAssociatedApp;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.browser.tasks.tab_management.PriceTrackingUtilities;
 import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
 import org.chromium.chrome.browser.toolbar.ToolbarButtonInProductHelpController;
 import org.chromium.chrome.browser.toolbar.ToolbarIntentMetadata;
@@ -114,6 +117,7 @@
     private ContinuousSearchContainerCoordinator mContinuousSearchContainerCoordinator;
     private Callback<Integer> mContinuousSearchObserver;
     private TabObscuringHandler.Observer mContinuousSearchTabObscuringHandlerObserver;
+    private MerchantTrustSignalsCoordinator mMerchantTrustSignalsCoordinator;
 
     private int mStatusIndicatorHeight;
     private int mContinuousSearchHeight;
@@ -216,6 +220,12 @@
             mContinuousSearchObserver = null;
             mContinuousSearchTabObscuringHandlerObserver = null;
         }
+
+        if (mMerchantTrustSignalsCoordinator != null) {
+            mMerchantTrustSignalsCoordinator.destroy();
+            mMerchantTrustSignalsCoordinator = null;
+        }
+
         super.destroy();
     }
 
@@ -330,6 +340,21 @@
         PwaBottomSheetControllerFactory.attach(
                 mActivity.getWindowAndroid(), mPwaBottomSheetController);
         initContinuousSearchCoordinator();
+
+        initMerchantTrustSignals();
+    }
+
+    private void initMerchantTrustSignals() {
+        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.COMMERCE_MERCHANT_VIEWER)
+                || !PriceTrackingUtilities.canFetchCommerceData()) {
+            return;
+        }
+
+        mMerchantTrustSignalsCoordinator = new MerchantTrustSignalsCoordinator(mActivity,
+                mActivity.getWindowAndroid(), getBottomSheetController(),
+                mActivity.getWindow().getDecorView(), mActivity.getTabModelSelector(),
+                MessageDispatcherProvider.from(mActivity.getWindowAndroid()),
+                mActivity.getActivityTabProvider(), mProfileSupplier, new MerchantTrustMetrics());
     }
 
     // Protected class methods
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
index 115524e..0be8bdc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -245,8 +245,8 @@
         if (DeviceClassManager.enableFullscreen()) {
             mOverlayCoordinator = new TopToolbarOverlayCoordinator(mToolbarLayout.getContext(),
                     layoutManager, mControlContainer::getProgressBarDrawingInfo, tabSupplier,
-                    browserControlsStateProvider, mResourceManagerSupplier,
-                    topUiThemeColorProvider, LayoutType.BROWSING, false);
+                    browserControlsStateProvider, mResourceManagerSupplier, topUiThemeColorProvider,
+                    LayoutType.BROWSING | LayoutType.SIMPLE_ANIMATION, false);
             layoutManager.addSceneOverlay(mOverlayCoordinator);
             mToolbarLayout.setOverlayCoordinator(mOverlayCoordinator);
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappAuthenticator.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappAuthenticator.java
index c72ab6c..b5bf304e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappAuthenticator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappAuthenticator.java
@@ -4,13 +4,11 @@
 
 package org.chromium.chrome.browser.webapps;
 
-import android.annotation.SuppressLint;
 import android.content.Context;
 import android.util.Log;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.ContextUtils;
-import org.chromium.base.SecureRandomInitializer;
 import org.chromium.base.StrictModeContext;
 
 import java.io.File;
@@ -178,10 +176,7 @@
 
     /**
      * Generates the authentication encryption key in a background thread (if necessary).
-     * SecureRandomInitializer addresses the bug in SecureRandom that "TrulyRandom" warns about, so
-     * this lint warning can safely be suppressed.
      */
-    @SuppressLint("TrulyRandom")
     private static SecretKey generateMacKey() {
         if (sKey != null) {
             return sKey;
@@ -189,10 +184,9 @@
         try {
             KeyGenerator generator = KeyGenerator.getInstance(MAC_ALGORITHM_NAME);
             SecureRandom random = new SecureRandom();
-            SecureRandomInitializer.initialize(random);
             generator.init(MAC_KEY_BYTE_COUNT * 8, random);
             return generator.generateKey();
-        } catch (NoSuchAlgorithmException | IOException e) {
+        } catch (NoSuchAlgorithmException e) {
             throw new RuntimeException(e);
         }
     }
diff --git a/chrome/android/trichrome.gni b/chrome/android/trichrome.gni
index 27cc637..cdbfd75 100644
--- a/chrome/android/trichrome.gni
+++ b/chrome/android/trichrome.gni
@@ -123,11 +123,6 @@
       "//third_party/icu:icu_assets",
     ]
 
-    _native_lib_file =
-        rebase_path("$root_gen_dir/CHROME_VERSION.json", root_out_dir)
-    native_lib_version_arg = "@FileArg($_native_lib_file:full-quoted)"
-    native_lib_version_rule = "//build/util:chrome_version_json"
-
     # Flag whether additional deps and libs should be included for each ABI.
     _include_primary_support = false
     _include_secondary_support = false
diff --git a/chrome/android/webapk/shell_apk/request_update_for_version.gni b/chrome/android/webapk/shell_apk/request_update_for_version.gni
index 8d5127d..4db0b9c 100644
--- a/chrome/android/webapk/shell_apk/request_update_for_version.gni
+++ b/chrome/android/webapk/shell_apk/request_update_for_version.gni
@@ -6,4 +6,4 @@
 # if the WebAPK's ShellAPK version is less than
 # |request_update_for_shell_apk_version|. The version should be incremented
 # after a new ShellAPK has been uploaded to the WebAPK Minting Server.
-request_update_for_shell_apk_version = 122
+request_update_for_shell_apk_version = 135
diff --git a/chrome/app/android/chrome_jni_onload.cc b/chrome/app/android/chrome_jni_onload.cc
index 0c7c87e..8a8abbcf 100644
--- a/chrome/app/android/chrome_jni_onload.cc
+++ b/chrome/app/android/chrome_jni_onload.cc
@@ -4,9 +4,7 @@
 
 #include "chrome/app/android/chrome_jni_onload.h"
 
-#include "base/android/library_loader/library_loader_hooks.h"
 #include "chrome/app/android/chrome_main_delegate_android.h"
-#include "components/version_info/version_info.h"
 #include "content/public/app/content_jni_onload.h"
 #include "content/public/app/content_main.h"
 
@@ -16,9 +14,6 @@
   if (!content::android::OnJNIOnLoadInit())
     return false;
 
-  // Pass the library version number to content so that we can check it from the
-  // Java side before continuing initialization.
-  base::android::SetVersionNumber(version_info::GetVersionNumber().c_str());
   content::SetContentMainDelegate(new ChromeMainDelegateAndroid());
   return true;
 }
diff --git a/chrome/app/theme/default_100_percent/common/favicon_ntp.png b/chrome/app/theme/default_100_percent/common/favicon_ntp.png
new file mode 100644
index 0000000..981dbb33
--- /dev/null
+++ b/chrome/app/theme/default_100_percent/common/favicon_ntp.png
Binary files differ
diff --git a/chrome/app/theme/default_200_percent/common/favicon_ntp.png b/chrome/app/theme/default_200_percent/common/favicon_ntp.png
new file mode 100644
index 0000000..1561a58
--- /dev/null
+++ b/chrome/app/theme/default_200_percent/common/favicon_ntp.png
Binary files differ
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd
index f26b92c..51792322 100644
--- a/chrome/app/theme/theme_resources.grd
+++ b/chrome/app/theme/theme_resources.grd
@@ -151,6 +151,7 @@
         <structure type="chrome_scaled_image" name="IDR_NOTIFICATION_EASYUNLOCK_ENABLED" file="cros/notification_easyunlock_enabled.png" />
       </if>
       <if expr="not is_android">
+        <structure type="chrome_scaled_image" name="IDR_NTP_FAVICON" file="common/favicon_ntp.png" />
         <structure type="chrome_scaled_image" name="IDR_PASSWORD_CHECK" file="common/password_check.png" />
         <structure type="chrome_scaled_image" name="IDR_PASSWORD_CHECK_DARK" file="common/password_check_dark.png" />
       </if>
diff --git a/chrome/browser/android/crypto/java/src/org/chromium/chrome/browser/crypto/CipherFactory.java b/chrome/browser/android/crypto/java/src/org/chromium/chrome/browser/crypto/CipherFactory.java
index 87b4dc6..66e6faa 100644
--- a/chrome/browser/android/crypto/java/src/org/chromium/chrome/browser/crypto/CipherFactory.java
+++ b/chrome/browser/android/crypto/java/src/org/chromium/chrome/browser/crypto/CipherFactory.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.crypto;
 
-import android.annotation.SuppressLint;
 import android.os.Bundle;
 
 import androidx.annotation.AnyThread;
@@ -13,7 +12,6 @@
 import org.chromium.base.ByteArrayGenerator;
 import org.chromium.base.Log;
 import org.chromium.base.ObserverList;
-import org.chromium.base.SecureRandomInitializer;
 import org.chromium.base.task.AsyncTask;
 import org.chromium.base.task.PostTask;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
@@ -193,9 +191,6 @@
      */
     private Callable<CipherData> createGeneratorCallable() {
         return new Callable<CipherData>() {
-            // SecureRandomInitializer addresses the bug in SecureRandom that "TrulyRandom"
-            // warns about, so this lint warning can safely be suppressed.
-            @SuppressLint("TrulyRandom")
             @Override
             public CipherData call() {
                 // Poll random data to generate initialization parameters for the Cipher.
@@ -212,14 +207,10 @@
 
                 try {
                     SecureRandom random = new SecureRandom();
-                    SecureRandomInitializer.initialize(random);
 
                     KeyGenerator generator = KeyGenerator.getInstance("AES");
                     generator.init(128, random);
                     return new CipherData(generator.generateKey(), iv);
-                } catch (IOException e) {
-                    Log.e(TAG, "Couldn't get generator data.");
-                    return null;
                 } catch (GeneralSecurityException e) {
                     Log.e(TAG, "Couldn't get generator instances.");
                     return null;
diff --git a/chrome/browser/android/omnibox/autocomplete_controller_android.cc b/chrome/browser/android/omnibox/autocomplete_controller_android.cc
index 81d27b3..451e49b 100644
--- a/chrome/browser/android/omnibox/autocomplete_controller_android.cc
+++ b/chrome/browser/android/omnibox/autocomplete_controller_android.cc
@@ -89,14 +89,6 @@
 
 namespace {
 
-// Used for histograms, append only.
-enum class MatchValidationResult {
-  VALID_MATCH = 0,
-  WRONG_MATCH = 1,
-  BAD_RESULT_SIZE = 2,
-  COUNT = 3
-};
-
 void RecordClipboardMetrics(AutocompleteMatchType::Type match_type) {
   if (match_type != AutocompleteMatchType::CLIPBOARD_URL &&
       match_type != AutocompleteMatchType::CLIPBOARD_TEXT &&
@@ -191,6 +183,8 @@
   if (!autocomplete_controller_)
     return;
 
+  autocomplete_controller_->result().DestroyJavaObject();
+
   std::string desired_tld;
   GURL current_url;
   if (!j_current_url.is_null())
@@ -228,6 +222,9 @@
   if (!autocomplete_controller_)
     return ScopedJavaLocalRef<jobject>();
 
+  // The old AutocompleteResult is about to be invalidated.
+  autocomplete_controller_->result().DestroyJavaObject();
+
   inside_synchronous_start_ = true;
   Start(env, obj, j_text, -1, nullptr, nullptr, true, false, false, false,
         focused_from_fakebox, JavaRef<jstring>(), false);
@@ -297,15 +294,11 @@
     const JavaParamRef<jobject>& obj,
     jint selected_index,
     const jint j_window_open_disposition,
-    jint hash_code,
     const JavaParamRef<jstring>& j_current_url,
     jint j_page_classification,
     jlong elapsed_time_since_first_modified,
     jint completed_length,
     const JavaParamRef<jobject>& j_web_contents) {
-  if (!IsValidMatch(env, selected_index, hash_code))
-    return;
-
   std::u16string url = ConvertJavaStringToUTF16(env, j_current_url);
   const GURL current_url = GURL(url);
   const base::TimeTicks& now(base::TimeTicks::Now());
@@ -365,11 +358,7 @@
 void AutocompleteControllerAndroid::DeleteSuggestion(
     JNIEnv* env,
     const JavaParamRef<jobject>& obj,
-    jint selected_index,
-    jint hash_code) {
-  if (!IsValidMatch(env, selected_index, hash_code))
-    return;
-
+    jint selected_index) {
   const AutocompleteResult& result = autocomplete_controller_->result();
   const AutocompleteMatch& match = result.match_at(selected_index);
   if (match.SupportsDeletion())
@@ -381,12 +370,9 @@
         JNIEnv* env,
         const JavaParamRef<jobject>& obj,
         jint selected_index,
-        jint hash_code,
         jlong elapsed_time_since_input_change,
         const base::android::JavaParamRef<jstring>& jnew_query_text,
         const base::android::JavaParamRef<jobjectArray>& jnew_query_params) {
-  if (!IsValidMatch(env, selected_index, hash_code))
-    return ScopedJavaLocalRef<jstring>();
   AutocompleteMatch match(
       autocomplete_controller_->result().match_at(selected_index));
 
@@ -523,11 +509,9 @@
   ScopedJavaLocalRef<jstring> inline_text =
       ConvertUTF16ToJavaString(env, inline_autocompletion);
 
-  jlong j_autocomplete_result_raw_ptr =
-      reinterpret_cast<intptr_t>(&autocomplete_result);
   Java_AutocompleteController_onSuggestionsReceived(
       env, java_bridge, autocomplete_result.GetOrCreateJavaObject(env),
-      inline_text, j_autocomplete_result_raw_ptr);
+      inline_text);
 }
 
 void AutocompleteControllerAndroid::SetVoiceMatches(
@@ -553,48 +537,6 @@
   }
 }
 
-bool AutocompleteControllerAndroid::IsValidMatch(JNIEnv* env,
-                                                 jint selected_index,
-                                                 jint hash_code) {
-  const AutocompleteResult& result = autocomplete_controller_->result();
-  if (base::checked_cast<size_t>(selected_index) >= result.size()) {
-    UMA_HISTOGRAM_ENUMERATION("Android.Omnibox.InvalidMatch",
-                              MatchValidationResult::BAD_RESULT_SIZE,
-                              MatchValidationResult::COUNT);
-    NOTREACHED() << "No match at position " << selected_index
-                 << ": Autocomplete result size mismatch.";
-
-    return false;
-  }
-
-  // TODO(mariakhomenko): After we get results from the histogram, if invalid
-  // match count is very low, we can consider skipping the expensive
-  // verification step and removing this code.
-  bool equal = Java_AutocompleteController_isEquivalentOmniboxSuggestion(
-      env, result.match_at(selected_index).GetOrCreateJavaObject(env),
-      hash_code);
-  UMA_HISTOGRAM_ENUMERATION("Android.Omnibox.InvalidMatch",
-                            equal ? MatchValidationResult::VALID_MATCH
-                                  : MatchValidationResult::WRONG_MATCH,
-                            MatchValidationResult::COUNT);
-
-  if (!equal) {
-#ifndef NDEBUG
-    int index = 0;
-    for (const auto& match : result) {
-      DLOG(WARNING) << "Native suggestion " << index << ": "
-                    << match.fill_into_edit << " (" << match.provider->GetName()
-                    << ", " << match.type << ")";
-      index++;
-    }
-#endif
-    NOTREACHED()
-        << "AutocompleteMatch mismatch with native-sourced suggestions.";
-  }
-
-  return equal;
-}
-
 static jlong JNI_AutocompleteController_Init(
     JNIEnv* env,
     const JavaParamRef<jobject>& obj,
diff --git a/chrome/browser/android/omnibox/autocomplete_controller_android.h b/chrome/browser/android/omnibox/autocomplete_controller_android.h
index f1a7fcf..5b9d7769 100644
--- a/chrome/browser/android/omnibox/autocomplete_controller_android.h
+++ b/chrome/browser/android/omnibox/autocomplete_controller_android.h
@@ -68,7 +68,6 @@
       const base::android::JavaParamRef<jobject>& obj,
       jint selected_index,
       const jint j_window_open_disposition,
-      jint hash_code,
       const base::android::JavaParamRef<jstring>& j_current_url,
       jint j_page_classification,
       jlong elapsed_time_since_first_modified,
@@ -76,14 +75,12 @@
       const base::android::JavaParamRef<jobject>& j_web_contents);
   void DeleteSuggestion(JNIEnv* env,
                         const base::android::JavaParamRef<jobject>& obj,
-                        jint selected_index,
-                        jint hash_code);
+                        jint selected_index);
   base::android::ScopedJavaLocalRef<jobject>
   UpdateMatchDestinationURLWithQueryFormulationTime(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& obj,
       jint selected_index,
-      jint hash_code,
       jlong elapsed_time_since_input_change,
       const base::android::JavaParamRef<jstring>& jnew_query_text,
       const base::android::JavaParamRef<jobjectArray>& jnew_query_params);
@@ -141,8 +138,6 @@
   void NotifySuggestionsReceived(
       const AutocompleteResult& autocomplete_result);
 
-  bool IsValidMatch(JNIEnv* env, jint selected_index, jint hash_code);
-
   std::unique_ptr<AutocompleteController> autocomplete_controller_;
 
   // Last input we sent to the autocomplete controller.
diff --git a/chrome/browser/ash/crosapi/browser_data_migrator.cc b/chrome/browser/ash/crosapi/browser_data_migrator.cc
index 3c85540f..a3327e61 100644
--- a/chrome/browser/ash/crosapi/browser_data_migrator.cc
+++ b/chrome/browser/ash/crosapi/browser_data_migrator.cc
@@ -17,8 +17,11 @@
 #include "base/system/sys_info.h"
 #include "base/task/post_task.h"
 #include "base/task/thread_pool.h"
+#include "base/threading/thread_restrictions.h"
 #include "chrome/browser/ash/crosapi/browser_util.h"
+#include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/common/chrome_paths.h"
+#include "components/account_id/account_id.h"
 #include "components/user_manager/user_manager.h"
 
 namespace ash {
@@ -37,11 +40,13 @@
 BrowserDataMigrator::TargetInfo::~TargetInfo() = default;
 
 // static
-void BrowserDataMigrator::MaybeMigrate(const UserContext& user_context,
+void BrowserDataMigrator::MaybeMigrate(const AccountId& account_id,
+                                       const std::string& user_id_hash,
+                                       bool async,
                                        base::OnceClosure callback) {
   // Get the current user.
   const user_manager::User* user =
-      user_manager::UserManager::Get()->FindUser(user_context.GetAccountId());
+      user_manager::UserManager::Get()->FindUser(account_id);
   if (!user || !IsMigrationRequiredOnUI(user)) {
     // If lacros isn't enabled, skip migration and move on to the next step.
     RecordStatus(FinalStatus::kSkipped);
@@ -57,18 +62,31 @@
     return;
   }
 
-  base::FilePath profile_data_dir = user_data_dir.Append(
-      base::StringPrintf("u-%s", user_context.GetUserIDHash().c_str()));
+  // Use `GetUserProfileDir()` to manually get base name for profile dir since
+  // `MaybeMigrate()` is called before profile creation.
+  base::FilePath profile_data_dir =
+      user_data_dir.Append(ProfileHelper::GetUserProfileDir(user_id_hash));
 
   std::unique_ptr<BrowserDataMigrator> browser_data_migrator =
       std::make_unique<BrowserDataMigrator>(profile_data_dir);
 
-  base::ThreadPool::PostTaskAndReplyWithResult(
-      FROM_HERE, {base::MayBlock()},
-      base::BindOnce(&BrowserDataMigrator::MigrateInternal,
-                     std::move(browser_data_migrator)),
-      base::BindOnce(&BrowserDataMigrator::MigrateInternalFinishedUIThread,
-                     std::move(callback)));
+  if (async) {
+    base::ThreadPool::PostTaskAndReplyWithResult(
+        FROM_HERE,
+        {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
+         base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
+        base::BindOnce(&BrowserDataMigrator::MigrateInternal,
+                       std::move(browser_data_migrator)),
+        base::BindOnce(&BrowserDataMigrator::MigrateInternalFinishedUIThread,
+                       std::move(callback)));
+  } else {
+    // Temporarily allowing blocking since we have to ensure that the migration
+    // happens before profile is created.
+    base::ScopedAllowBlocking allow_blocking;
+    // Migrate synchronously on UI thread.
+    bool did_migrate = browser_data_migrator->MigrateInternal();
+    MigrateInternalFinishedUIThread(std::move(callback), did_migrate);
+  }
 }
 
 // static
@@ -193,7 +211,7 @@
   for (base::FilePath entry = enumerator.Next(); !entry.empty();
        entry = enumerator.Next()) {
     if (base::Contains(kNoCopyPaths, entry.BaseName().value())) {
-      // Skip if the base name is present in kNoCopyPaths.
+      // Skip if the base name is present in `kNoCopyPaths`.
       continue;
     }
 
@@ -203,7 +221,7 @@
       target_info.total_byte_count += info.GetSize();
     } else {
       // Treat symlink the same as directory since even if it points to a file,
-      // both ComputeDirectorySize and CopyDirectory can be used.
+      // both `ComputeDirectorySize()` and `CopyDirectory()` can be used.
       target_info.dir_paths.emplace_back(entry);
       target_info.total_byte_count += base::ComputeDirectorySize(entry);
     }
@@ -228,7 +246,7 @@
   base::File::Error error;
   if (!base::CreateDirectoryAndGetError(tmp_dir_, &error)) {
     PLOG(ERROR) << "CreateDirectoryFailed " << error;
-    // Maps to histogram enum PlatformFileError.
+    // Maps to histogram enum `PlatformFileError`.
     UMA_HISTOGRAM_ENUMERATION(kCreateDirectoryFail, -error,
                               -base::File::FILE_ERROR_MAX);
     return false;
diff --git a/chrome/browser/ash/crosapi/browser_data_migrator.h b/chrome/browser/ash/crosapi/browser_data_migrator.h
index 190f158..f38788f 100644
--- a/chrome/browser/ash/crosapi/browser_data_migrator.h
+++ b/chrome/browser/ash/crosapi/browser_data_migrator.h
@@ -28,8 +28,8 @@
     "Ash.BrowserDataMigrator.CreateDirectoryFailure";
 
 // BrowserDataMigrator is responsible for one time browser data migration from
-// ash-chrome to lacros-chrome. The static method MaybeMigrate() instantiates
-// an instance and calls MigrateInternal().
+// ash-chrome to lacros-chrome. The static method `MaybeMigrate()` instantiates
+// an instance and calls `MigrateInternal()`.
 class BrowserDataMigrator {
  public:
   // Used to describe what files/dirs have to be migrated to the new location
@@ -60,18 +60,22 @@
     kMaxValue = kMoveFailed
   };
 
-  // The class is instantiated on UI thread, bound to MigrateInternal and then
-  // posted to worker thread.
+  // The class is instantiated on UI thread, bound to `MigrateInternal()` and
+  // then posted to worker thread.
   explicit BrowserDataMigrator(const base::FilePath& from);
   BrowserDataMigrator(const BrowserDataMigrator&) = delete;
   BrowserDataMigrator& operator=(const BrowserDataMigrator&) = delete;
   ~BrowserDataMigrator();
 
-  // Called on UI thread. If lacros is enabled, it posts MigrateInternal() to a
-  // worker thread with callback as reply. If lacros is not enabled, it calls
-  // the callback immediately. Files are copied to |tmp_dir_| first and then
-  // moved to |to_dir_| in an atomic way.
-  static void MaybeMigrate(const UserContext& user_context,
+  // Called on UI thread. If `async` is true, it posts `MigrateInternal()` to a
+  // worker thread with callback as reply. If `async` is false, the whole
+  // process will be done on UI thread. Since the migration copies user data
+  // files, it has to be completed before ash chrome starts accessing those
+  // files. Files are copied to `tmp_dir_` first and then moved to `to_dir_` in
+  // an atomic way.
+  static void MaybeMigrate(const AccountId& account_id,
+                           const std::string& user_id_hash,
+                           bool async,
                            base::OnceClosure callback);
 
  private:
@@ -88,8 +92,8 @@
   // Called when the migration is finished on the UI thread.
   static void MigrateInternalFinishedUIThread(base::OnceClosure callback,
                                               bool did_migrate);
-  // Records to UMA histograms. Note that if target_info is nullptr, timer will
-  // be ignored.
+  // Records to UMA histograms. Note that if `target_info` is nullptr, timer
+  // will be ignored.
   static void RecordStatus(const FinalStatus& final_status,
                            const TargetInfo* target_info = nullptr,
                            const base::ElapsedTimer* timer = nullptr);
@@ -100,12 +104,12 @@
   // Gets what files/dirs need to be copied and the total byte size of files to
   // be copied.
   TargetInfo GetTargetInfo() const;
-  // Compares space available under |from_dir_| against total byte size that
+  // Compares space available under `from_dir_` against total byte size that
   // needs to be copied.
   bool HasEnoughDiskSpace(const TargetInfo& target_info) const;
-  // Copies files from |from_dir_| to |tmp_dir_|.
+  // Copies files from `from_dir_` to `tmp_dir_`.
   bool CopyToTmpDir(const TargetInfo& target_info) const;
-  // Moves |tmp_dir_| to |to_dir_|.
+  // Moves `tmp_dir_` to `to_dir_`.
   bool MoveTmpToTargetDir() const;
 
   // Path to the original profile data directory. It is directly under the
diff --git a/chrome/browser/ash/crosapi/browser_data_migrator_browsertest.cc b/chrome/browser/ash/crosapi/browser_data_migrator_browsertest.cc
new file mode 100644
index 0000000..ec61e2db
--- /dev/null
+++ b/chrome/browser/ash/crosapi/browser_data_migrator_browsertest.cc
@@ -0,0 +1,87 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ash/crosapi/browser_data_migrator.h"
+
+#include "ash/constants/ash_features.h"
+#include "ash/constants/ash_switches.h"
+#include "base/files/file_util.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/threading/thread_restrictions.h"
+#include "chrome/browser/ash/login/login_manager_test.h"
+#include "chrome/browser/ash/login/test/login_manager_mixin.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/common/chrome_constants.h"
+#include "components/account_id/account_id.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/test_launcher.h"
+
+namespace ash {
+class BrowserDataMigratorRestartTest : public chromeos::LoginManagerTest {
+ public:
+  BrowserDataMigratorRestartTest() = default;
+  BrowserDataMigratorRestartTest(BrowserDataMigratorRestartTest&) = delete;
+  BrowserDataMigratorRestartTest& operator=(BrowserDataMigratorRestartTest&) =
+      delete;
+  ~BrowserDataMigratorRestartTest() override = default;
+
+  // chromeos::LoginManagerTest:
+  void SetUp() override {
+    if (content::IsPreTest()) {
+      feature_list_.InitAndDisableFeature(chromeos::features::kLacrosSupport);
+    } else {
+      feature_list_.InitAndEnableFeature(chromeos::features::kLacrosSupport);
+    }
+
+    login_manager_.AppendRegularUsers(1);
+    // This allows chrome to startup with the session info from
+    // `PRE_MigrateOnRestart` without actually needing to go through the login
+    // screen on `MigrateOnRestart`.
+    login_manager_.set_session_restore_enabled();
+
+    chromeos::LoginManagerTest::SetUp();
+  }
+
+  void LoginAsRegularUser() {
+    const auto& users = login_manager_.users();
+
+    LoginUser(users[0].account_id);
+  }
+
+ private:
+  LoginManagerMixin login_manager_{&mixin_host_};
+  base::test::ScopedFeatureList feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(BrowserDataMigratorRestartTest, PRE_MigrateOnRestart) {
+  LoginAsRegularUser();
+  Profile* profile =
+      g_browser_process->profile_manager()->GetPrimaryUserProfile();
+  {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    const base::FilePath new_profile_data_directory =
+        profile->GetPath().Append(kLacrosProfileDir);
+    // Make sure that lacros directory does not exist before migration.
+    ASSERT_FALSE(base::DirectoryExists(new_profile_data_directory));
+    ASSERT_FALSE(base::PathExists(
+        new_profile_data_directory.Append(chrome::kPreferencesFilename)));
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(BrowserDataMigratorRestartTest, MigrateOnRestart) {
+  Profile* profile =
+      g_browser_process->profile_manager()->GetPrimaryUserProfile();
+  {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    const base::FilePath new_profile_data_directory =
+        profile->GetPath().Append(kLacrosProfileDir);
+    // Check that the new profile data directory is created.
+    ASSERT_TRUE(base::DirectoryExists(new_profile_data_directory));
+    ASSERT_TRUE(base::PathExists(
+        new_profile_data_directory.Append(chrome::kPreferencesFilename)));
+  }
+}
+}  // namespace ash
diff --git a/chrome/browser/ash/crosapi/browser_data_migrator_unittest.cc b/chrome/browser/ash/crosapi/browser_data_migrator_unittest.cc
index d7c1465..b70da0b 100644
--- a/chrome/browser/ash/crosapi/browser_data_migrator_unittest.cc
+++ b/chrome/browser/ash/crosapi/browser_data_migrator_unittest.cc
@@ -63,8 +63,8 @@
   FakeChromeUserManager fake_user_manager;
 
   {
-    // If lacros is disabled, IsMigrationRequiredOnUI should return false even
-    // for regular users.
+    // If lacros is disabled, `IsMigrationRequiredOnUI()` should return false
+    // even for regular users.
     base::test::ScopedFeatureList feature_list;
     feature_list.InitAndDisableFeature(chromeos::features::kLacrosSupport);
 
@@ -110,19 +110,19 @@
 TEST_F(BrowserDataMigratorTest, IsMigrationRequiredOnWorker) {
   BrowserDataMigrator browser_data_migrator(from_dir_.GetPath());
 
-  // If |BrowserDataMigrator::to_dir_| does not exist, run migration.
+  // If `BrowserDataMigrator::to_dir_` does not exist, run migration.
   EXPECT_TRUE(browser_data_migrator.IsMigrationRequiredOnWorker());
 
-  // Create |BrowserDataMigrator::to_dir_|.
+  // Create `BrowserDataMigrator::to_dir_`.
   ASSERT_TRUE(
       base::CreateDirectory(from_dir_.GetPath().Append(kLacrosProfileDir)));
 
-  // If |BrowserDataMigrator::to_dir_| already exists, do not run migration.
+  // If `BrowserDataMigrator::to_dir_` already exists, do not run migration.
   EXPECT_FALSE(browser_data_migrator.IsMigrationRequiredOnWorker());
 
   ASSERT_TRUE(base::DeletePathRecursively(from_dir_.GetPath()));
 
-  // If |BrowserDataMigrator::from_dir_| does not exist, do not run migration.
+  // If `BrowserDataMigrator::from_dir_` does not exist, do not run migration.
   EXPECT_FALSE(browser_data_migrator.IsMigrationRequiredOnWorker());
 }
 
@@ -148,8 +148,8 @@
 
 TEST_F(BrowserDataMigratorTest, RecordStatus) {
   {
-    // If FinalStatus::kSkipped, only record the status and do not record copied
-    // data size or total time.
+    // If `FinalStatus::kSkipped`, only record the status and do not record
+    // copied data size or total time.
     base::HistogramTester histogram_tester;
 
     BrowserDataMigrator::RecordStatus(
@@ -164,8 +164,8 @@
   }
 
   {
-    // If FInalStatus::kSuccess, the three UMA kFinalStatus,
-    // kCopiedDataSize, kTotalTime should be recorded.
+    // If `FInalStatus::kSuccess`, the three UMA `kFinalStatus`,
+    // `kCopiedDataSize`, `kTotalTime` should be recorded.
     base::HistogramTester histogram_tester;
     BrowserDataMigrator browser_data_migrator(from_dir_.GetPath());
 
@@ -217,7 +217,7 @@
                                      .Append(kDirName)
                                      .Append(kDownloads)
                                      .Append(kFileName)));
-  }  // browser_data_migrator is destructed and RecordStatus is called.
+  }  // `browser_data_migrator` is destructed and `RecordStatus()` is called.
 
   histogram_tester.ExpectTotalCount(kFinalStatus, 1);
   histogram_tester.ExpectTotalCount(kCopiedDataSize, 1);
diff --git a/chrome/browser/ash/login/existing_user_controller.cc b/chrome/browser/ash/login/existing_user_controller.cc
index 6de68a6e..20974eb 100644
--- a/chrome/browser/ash/login/existing_user_controller.cc
+++ b/chrome/browser/ash/login/existing_user_controller.cc
@@ -935,7 +935,8 @@
   // Before continuing with post login setups such as starting a session,
   // check if browser data needs to be migrated from ash to lacros.
   ash::BrowserDataMigrator::MaybeMigrate(
-      user_context,
+      user_context.GetAccountId(), user_context.GetUserIDHash(),
+      true /* async */,
       base::BindOnce(&ExistingUserController::ContinueOnAuthSuccess,
                      weak_factory_.GetWeakPtr(), user_context));
 }
diff --git a/chrome/browser/ash/login/saml/saml_browsertest.cc b/chrome/browser/ash/login/saml/saml_browsertest.cc
index 5cb7f8ce..6d5f924 100644
--- a/chrome/browser/ash/login/saml/saml_browsertest.cc
+++ b/chrome/browser/ash/login/saml/saml_browsertest.cc
@@ -419,6 +419,8 @@
     ASSERT_TRUE(message_queue.WaitForMessage(&message));
   } while (message != "\"SamlLoaded\"");
 
+  test::OobeJS().ExpectPathDisplayed(false, kBackButton);
+
   // Fill-in the SAML IdP form and submit.
   SigninFrameJS().TypeIntoPath("fake_user", {"Email"});
   SigninFrameJS().TypeIntoPath("not_the_password", {"Dummy"});
@@ -464,6 +466,7 @@
 
   histogram_tester.ExpectUniqueSample("ChromeOS.SAML.APILogin", 1, 1);
   histogram_tester.ExpectUniqueSample("ChromeOS.SAML.Provider", 1, 1);
+  histogram_tester.ExpectTotalCount("OOBE.GaiaLoginTime", 0);
 }
 
 // Tests the sign-in flow when the credentials passing API is used w/o 'confirm'
@@ -500,6 +503,7 @@
 
   histogram_tester.ExpectUniqueSample("ChromeOS.SAML.APILogin", 1, 1);
   histogram_tester.ExpectUniqueSample("ChromeOS.SAML.Provider", 1, 1);
+  histogram_tester.ExpectTotalCount("OOBE.GaiaLoginTime", 0);
 }
 
 // Tests the single password scraped flow.
@@ -540,6 +544,7 @@
   histogram_tester.ExpectUniqueSample("ChromeOS.SAML.APILogin", 2, 1);
   histogram_tester.ExpectUniqueSample("ChromeOS.SAML.Scraping.PasswordCountAll",
                                       1, 1);
+  histogram_tester.ExpectTotalCount("OOBE.GaiaLoginTime", 0);
 }
 
 // Tests password scraping from a dynamically created password field.
@@ -602,6 +607,7 @@
   histogram_tester.ExpectUniqueSample("ChromeOS.SAML.APILogin", 2, 1);
   histogram_tester.ExpectUniqueSample("ChromeOS.SAML.Scraping.PasswordCountAll",
                                       2, 1);
+  histogram_tester.ExpectTotalCount("OOBE.GaiaLoginTime", 0);
 }
 
 // Tests the no password scraped flow.
@@ -636,6 +642,7 @@
   histogram_tester.ExpectUniqueSample("ChromeOS.SAML.APILogin", 2, 1);
   histogram_tester.ExpectUniqueSample("ChromeOS.SAML.Scraping.PasswordCountAll",
                                       0, 1);
+  histogram_tester.ExpectTotalCount("OOBE.GaiaLoginTime", 0);
 }
 
 // Types the second user e-mail into the GAIA login form but then authenticates
diff --git a/chrome/browser/ash/login/webview_login_browsertest.cc b/chrome/browser/ash/login/webview_login_browsertest.cc
index 5d65986..0605be5 100644
--- a/chrome/browser/ash/login/webview_login_browsertest.cc
+++ b/chrome/browser/ash/login/webview_login_browsertest.cc
@@ -291,6 +291,7 @@
     command_line->AppendSwitch(switches::kOobeSkipPostLogin);
     OobeBaseTest::SetUpCommandLine(command_line);
   }
+  base::HistogramTester histogram_tester;
 
  protected:
   void ExpectIdentifierPage() {
@@ -402,7 +403,6 @@
 
 // Basic signin with username and password.
 IN_PROC_BROWSER_TEST_F(WebviewLoginTest, Basic) {
-  base::HistogramTester histogram_tester;
   WaitForGaiaPageLoadAndPropertyUpdate();
 
   ExpectIdentifierPage();
@@ -433,6 +433,7 @@
   EXPECT_FALSE(LoginDisplayHost::default_host());
 
   histogram_tester.ExpectUniqueSample("ChromeOS.SAML.APILogin", 0, 1);
+  histogram_tester.ExpectTotalCount("OOBE.GaiaLoginTime", 1);
 }
 
 IN_PROC_BROWSER_TEST_F(WebviewLoginTest, BackButton) {
@@ -644,6 +645,7 @@
             reauth_user_.account_id.GetUserEmail());
   EXPECT_EQ(fake_gaia_.fake_gaia()->is_supervised(), "1");
   EXPECT_EQ(fake_gaia_.fake_gaia()->is_device_owner(), "1");
+  histogram_tester.ExpectTotalCount("OOBE.GaiaLoginTime", 0);
 }
 
 IN_PROC_BROWSER_TEST_F(WebviewLoginTest, StoragePartitionHandling) {
diff --git a/chrome/browser/browsing_data/cookies_tree_model.cc b/chrome/browser/browsing_data/cookies_tree_model.cc
index 8e53c73..bcba833 100644
--- a/chrome/browser/browsing_data/cookies_tree_model.cc
+++ b/chrome/browser/browsing_data/cookies_tree_model.cc
@@ -741,7 +741,7 @@
     if (container) {
       container->shared_worker_helper_->DeleteSharedWorker(
           shared_worker_info_->worker, shared_worker_info_->name,
-          shared_worker_info_->constructor_origin);
+          shared_worker_info_->storage_key);
       container->shared_worker_info_list_.erase(shared_worker_info_);
     }
   }
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 59cb5cc..c6cd0c1 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -2588,7 +2588,7 @@
     const GURL& site_for_cookies,
     const base::Optional<url::Origin>& top_frame_origin,
     const std::string& name,
-    const url::Origin& constructor_origin,
+    const storage::StorageKey& storage_key,
     content::BrowserContext* context,
     int render_process_id,
     int render_frame_id) {
@@ -2601,7 +2601,7 @@
           .get());
 
   content_settings::PageSpecificContentSettings::SharedWorkerAccessed(
-      render_process_id, render_frame_id, worker_url, name, constructor_origin,
+      render_process_id, render_frame_id, worker_url, name, storage_key,
       !allow);
   return allow;
 }
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 3115a69..c16fb05d 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -70,6 +70,10 @@
 class SeatbeltExecClient;
 }  // namespace sandbox
 
+namespace storage {
+class StorageKey;
+}  // namespace storage
+
 namespace ui {
 class NativeTheme;
 }
@@ -245,7 +249,7 @@
                          const GURL& site_for_cookies,
                          const base::Optional<url::Origin>& top_frame_origin,
                          const std::string& name,
-                         const url::Origin& constructor_origin,
+                         const storage::StorageKey& storage_key,
                          content::BrowserContext* context,
                          int render_process_id,
                          int render_frame_id) override;
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index bfa27a1..08e79de 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -24,6 +24,7 @@
 #include "ash/system/pcie_peripheral/pcie_peripheral_notification_controller.h"
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/lazy_instance.h"
@@ -48,6 +49,7 @@
 #include "chrome/browser/ash/app_mode/web_app/web_kiosk_app_manager.h"
 #include "chrome/browser/ash/arc/enterprise/arc_data_snapshotd_delegate.h"
 #include "chrome/browser/ash/arc/session/arc_service_launcher.h"
+#include "chrome/browser/ash/crosapi/browser_data_migrator.h"
 #include "chrome/browser/ash/crosapi/browser_manager.h"
 #include "chrome/browser/ash/crosapi/crosapi_manager.h"
 #include "chrome/browser/ash/display/quirks_manager_delegate_impl.h"
@@ -846,6 +848,16 @@
     // In case of multi-profiles --login-profile will contain user_id_hash.
     std::string user_id_hash =
         parsed_command_line().GetSwitchValueASCII(switches::kLoginProfile);
+
+    // Before creating a session, migrate user data if required. The migration
+    // will happen at this timing only if lacros chrome was enabled via
+    // chrome://flags. In other cases, migration will happen upon login
+    // asynchronously. This migration has to complete before profile is created
+    // and chrome starts accessing those user data files, thus we pass
+    // async=false.
+    ash::BrowserDataMigrator::MaybeMigrate(
+        account_id, user_id_hash, false /* async */, base::DoNothing());
+
     session_manager::SessionManager::Get()->CreateSessionForRestart(
         account_id, user_id_hash);
 
diff --git a/chrome/browser/chromeos/full_restore/app_launch_handler_browsertest.cc b/chrome/browser/chromeos/full_restore/app_launch_handler_browsertest.cc
index 8d93072..aa51dc32 100644
--- a/chrome/browser/chromeos/full_restore/app_launch_handler_browsertest.cc
+++ b/chrome/browser/chromeos/full_restore/app_launch_handler_browsertest.cc
@@ -725,6 +725,39 @@
   CloseAppWindow(app_window2);
 }
 
+// Tests that fullscreened windows will not be restored as fullscreen, which is
+// not supported for full restore. Regression test for
+// https://crbug.com/1203010.
+IN_PROC_BROWSER_TEST_F(AppLaunchHandlerBrowserTest, ImmersiveFullscreenApp) {
+  ::full_restore::SetActiveProfilePath(profile()->GetPath());
+
+  // Create the restore data.
+  const extensions::Extension* extension =
+      LoadAndLaunchPlatformApp("launch", "Launched");
+  ASSERT_TRUE(extension);
+  SaveChromeAppLaunchInfo(extension->id());
+
+  extensions::AppWindow* app_window = CreateAppWindow(profile(), extension);
+  ASSERT_TRUE(app_window);
+
+  // Toggle immersive fullscreen by simulating what happens when F4 is pressed.
+  // FullRestoreController will save to file when the state changes.
+  const ash::WMEvent event(ash::WM_EVENT_TOGGLE_FULLSCREEN);
+  ash::WindowState::Get(app_window->GetNativeWindow())->OnWMEvent(&event);
+
+  WaitForAppLaunchInfoSaved();
+
+  // Read from the restore data.
+  auto app_launch_handler = std::make_unique<AppLaunchHandler>(profile());
+  app_launch_handler->SetShouldRestore();
+  content::RunAllTasksUntilIdle();
+
+  // Tests that the created window is not fullscreen.
+  app_window = CreateAppWindow(browser()->profile(), extension);
+  ASSERT_TRUE(app_window);
+  EXPECT_FALSE(app_window->GetBaseWindow()->IsFullscreenOrPending());
+}
+
 class AppLaunchHandlerArcAppBrowserTest : public AppLaunchHandlerBrowserTest {
  protected:
   // AppLaunchHandlerBrowserTest:
diff --git a/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc b/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
index dd66a7a..db5165c 100644
--- a/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
+++ b/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
@@ -622,6 +622,35 @@
       base::BindOnce(CrashReportsLoaded, upload_list, std::move(callback)));
 }
 
+em::ActiveTimePeriod::SessionType GetSessionType(
+    const std::string& user_email) {
+  policy::DeviceLocalAccount::Type type;
+  if (!IsDeviceLocalAccountUser(user_email, &type)) {
+    return em::ActiveTimePeriod::SESSION_AFFILIATED_USER;
+  }
+
+  switch (type) {
+    case policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION:
+    case policy::DeviceLocalAccount::TYPE_SAML_PUBLIC_SESSION:
+      return em::ActiveTimePeriod::SESSION_MANAGED_GUEST;
+
+    case policy::DeviceLocalAccount::TYPE_KIOSK_APP:
+      return em::ActiveTimePeriod::SESSION_KIOSK;
+
+    case policy::DeviceLocalAccount::TYPE_ARC_KIOSK_APP:
+      return em::ActiveTimePeriod::SESSION_ARC_KIOSK;
+
+    case policy::DeviceLocalAccount::TYPE_WEB_KIOSK_APP:
+      return em::ActiveTimePeriod::SESSION_WEB_KIOSK;
+
+    default:
+      NOTREACHED();
+  }
+
+  NOTREACHED();
+  return em::ActiveTimePeriod::SESSION_UNKNOWN;
+}
+
 }  // namespace
 
 namespace policy {
@@ -1959,12 +1988,15 @@
   // multi-user sessions.
   const user_manager::User* const primary_user =
       user_manager::UserManager::Get()->GetPrimaryUser();
-  if (!primary_user || !primary_user->HasGaiaAccount())
+  if (!primary_user)
     return std::string();
 
-  // Report only affiliated users for enterprise reporting.
+  // Store affiliated user emails or the kiosk app id / guest session account
+  // emails. Those emails will be used to calculate the session type when
+  // constructing the ActiveTimePeriod protos sent as part of the report.
   std::string primary_user_email = primary_user->GetAccountId().GetUserEmail();
-  if (!ash::ChromeUserManager::Get()->ShouldReportUser(primary_user_email)) {
+  if (primary_user->HasGaiaAccount() &&
+      !ash::ChromeUserManager::Get()->ShouldReportUser(primary_user_email)) {
     return std::string();
   }
   return primary_user_email;
@@ -2001,9 +2033,19 @@
       period->set_end_timestamp(end_timestamp);
       active_period->set_active_duration(activity_period.end_timestamp() -
                                          activity_period.start_timestamp());
-      // Report user email only if users reporting is turned on.
+      // Report user email and session_type only if users reporting is on.
       if (!user_email.empty()) {
-        active_period->set_user_email(user_email);
+        em::ActiveTimePeriod::SessionType session_type =
+            GetSessionType(user_email);
+        // Don't report the email address for MGS / Kiosk apps
+        if (session_type == em::ActiveTimePeriod::SESSION_AFFILIATED_USER) {
+          active_period->set_user_email(user_email);
+        }
+        if (session_type != em::ActiveTimePeriod::SESSION_UNKNOWN &&
+            base::FeatureList::IsEnabled(
+                features::kActivityReportingSessionType)) {
+          active_period->set_session_type(session_type);
+        }
       }
       if (last_reported_end_timestamp_ < end_timestamp) {
         last_reported_end_timestamp_ = end_timestamp;
@@ -2656,7 +2698,11 @@
   // should be displayed to a user in the transparency panel. User activity for
   // a current user is reported only if the user is managed by the same
   // organization as a device.
-  return report_activity_times_ && !GetUserForActivityReporting().empty();
+  if (!report_activity_times_) {
+    return false;
+  }
+  std::string user_email = GetUserForActivityReporting();
+  return !user_email.empty() && !IsDeviceLocalAccountUser(user_email, NULL);
 }
 bool DeviceStatusCollector::ShouldReportNetworkInterfaces() const {
   return report_network_interfaces_;
@@ -2664,7 +2710,11 @@
 bool DeviceStatusCollector::ShouldReportUsers() const {
   // For more details, see comment in
   // DeviceStatusCollector::ShouldReportActivityTimes() function.
-  return report_users_ && !GetUserForActivityReporting().empty();
+  if (!report_users_) {
+    return false;
+  }
+  std::string user_email = GetUserForActivityReporting();
+  return !user_email.empty() && !IsDeviceLocalAccountUser(user_email, NULL);
 }
 bool DeviceStatusCollector::ShouldReportHardwareStatus() const {
   return report_hardware_status_;
diff --git a/chrome/browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc b/chrome/browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc
index 952a861..42905e83 100644
--- a/chrome/browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc
+++ b/chrome/browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc
@@ -1397,6 +1397,8 @@
 }
 
 TEST_F(DeviceStatusCollectorTest, ActivityNoUser) {
+  scoped_feature_list_.InitAndEnableFeature(
+      features::kActivityReportingSessionType);
   ui::IdleState test_states[] = {ui::IDLE_STATE_ACTIVE, ui::IDLE_STATE_ACTIVE,
                                  ui::IDLE_STATE_ACTIVE};
   scoped_testing_cros_settings_.device_settings()->SetBoolean(
@@ -1411,17 +1413,20 @@
   GetStatus();
   EXPECT_EQ(1, device_status_.active_periods_size());
   EXPECT_TRUE(device_status_.active_periods(0).user_email().empty());
+  EXPECT_FALSE(device_status_.active_periods(0).has_session_type());
 }
 
 TEST_F(DeviceStatusCollectorTest, ActivityWithPublicSessionUser) {
+  scoped_feature_list_.InitAndEnableFeature(
+      features::kActivityReportingSessionType);
   ui::IdleState test_states[] = {ui::IDLE_STATE_ACTIVE, ui::IDLE_STATE_ACTIVE,
                                  ui::IDLE_STATE_ACTIVE};
   scoped_testing_cros_settings_.device_settings()->SetBoolean(
       chromeos::kReportDeviceActivityTimes, true);
   scoped_testing_cros_settings_.device_settings()->SetBoolean(
       chromeos::kReportDeviceUsers, true);
-  const AccountId public_account_id(
-      AccountId::FromUserEmail("public@localhost"));
+  const AccountId public_account_id(AccountId::FromUserEmail(
+      "public@public-accounts.device-local.localhost"));
   user_manager_->CreatePublicAccountUser(public_account_id);
 
   EXPECT_FALSE(status_collector_->ShouldReportActivityTimes());
@@ -1431,9 +1436,37 @@
   GetStatus();
   EXPECT_EQ(1, device_status_.active_periods_size());
   EXPECT_TRUE(device_status_.active_periods(0).user_email().empty());
+  EXPECT_EQ(em::ActiveTimePeriod::SESSION_MANAGED_GUEST,
+            device_status_.active_periods(0).session_type());
+}
+
+TEST_F(DeviceStatusCollectorTest, ActivityWithKioskUser) {
+  scoped_feature_list_.InitAndEnableFeature(
+      features::kActivityReportingSessionType);
+  ui::IdleState test_states[] = {ui::IDLE_STATE_ACTIVE, ui::IDLE_STATE_ACTIVE,
+                                 ui::IDLE_STATE_ACTIVE};
+  scoped_testing_cros_settings_.device_settings()->SetBoolean(
+      chromeos::kReportDeviceActivityTimes, true);
+  scoped_testing_cros_settings_.device_settings()->SetBoolean(
+      chromeos::kReportDeviceUsers, true);
+  const AccountId public_account_id(
+      AccountId::FromUserEmail("public@web-kiosk-apps.device-local.localhost"));
+  user_manager_->CreatePublicAccountUser(public_account_id);
+
+  EXPECT_FALSE(status_collector_->ShouldReportActivityTimes());
+  EXPECT_FALSE(status_collector_->ShouldReportUsers());
+
+  status_collector_->Simulate(test_states, 3);
+  GetStatus();
+  EXPECT_EQ(1, device_status_.active_periods_size());
+  EXPECT_TRUE(device_status_.active_periods(0).user_email().empty());
+  EXPECT_EQ(em::ActiveTimePeriod::SESSION_WEB_KIOSK,
+            device_status_.active_periods(0).session_type());
 }
 
 TEST_F(DeviceStatusCollectorTest, ActivityWithAffiliatedUser) {
+  scoped_feature_list_.InitAndEnableFeature(
+      features::kActivityReportingSessionType);
   ui::IdleState test_states[] = {ui::IDLE_STATE_ACTIVE, ui::IDLE_STATE_ACTIVE,
                                  ui::IDLE_STATE_ACTIVE};
   scoped_testing_cros_settings_.device_settings()->SetBoolean(
@@ -1452,6 +1485,8 @@
   EXPECT_EQ(1, device_status_.active_periods_size());
   EXPECT_EQ(account_id0.GetUserEmail(),
             device_status_.active_periods(0).user_email());
+  EXPECT_EQ(em::ActiveTimePeriod::SESSION_AFFILIATED_USER,
+            device_status_.active_periods(0).session_type());
   device_status_.clear_active_periods();  // Clear the result protobuf.
 
   scoped_testing_cros_settings_.device_settings()->SetBoolean(
@@ -1464,9 +1499,12 @@
   GetStatus();
   EXPECT_EQ(1, device_status_.active_periods_size());
   EXPECT_TRUE(device_status_.active_periods(0).user_email().empty());
+  EXPECT_FALSE(device_status_.active_periods(0).has_session_type());
 }
 
 TEST_F(DeviceStatusCollectorTest, ActivityWithNotAffiliatedUser) {
+  scoped_feature_list_.InitAndEnableFeature(
+      features::kActivityReportingSessionType);
   ui::IdleState test_states[] = {ui::IDLE_STATE_ACTIVE, ui::IDLE_STATE_ACTIVE,
                                  ui::IDLE_STATE_ACTIVE};
   scoped_testing_cros_settings_.device_settings()->SetBoolean(
@@ -1484,6 +1522,7 @@
   GetStatus();
   EXPECT_EQ(1, device_status_.active_periods_size());
   EXPECT_TRUE(device_status_.active_periods(0).user_email().empty());
+  EXPECT_FALSE(device_status_.active_periods(0).has_session_type());
   device_status_.clear_active_periods();  // Clear the result protobuf.
 
   scoped_testing_cros_settings_.device_settings()->SetBoolean(
@@ -1496,6 +1535,7 @@
   GetStatus();
   EXPECT_EQ(1, device_status_.active_periods_size());
   EXPECT_TRUE(device_status_.active_periods(0).user_email().empty());
+  EXPECT_FALSE(device_status_.active_periods(0).has_session_type());
 }
 
 TEST_F(DeviceStatusCollectorTest, DevSwitchBootMode) {
diff --git a/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl.cc b/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl.cc
index 9a1d7a4..8e61921 100644
--- a/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl.cc
+++ b/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl.cc
@@ -321,6 +321,14 @@
 }
 
 void NearbyConnectionBrokerImpl::OnMojoDisconnection() {
+  PA_LOG(INFO) << __func__;
+
+  // If there is a mojo disconnect while requesting a connection, we should
+  // still try to disconnect from the endpoint in case the endpoint was almost
+  // about to be connected.
+  if (connection_status_ == ConnectionStatus::kRequestingConnection)
+    need_to_disconnect_endpoint_ = true;
+
   Disconnect(util::NearbyDisconnectionReason::kDisconnectionRequestedByClient);
 }
 
@@ -361,6 +369,11 @@
     return;
   }
 
+  // Ignore in the event we are currently disconnecting. Either
+  // OnConnectionRejected or OnDisconnected will be called eventually.
+  if (connection_status_ == ConnectionStatus::kDisconnecting)
+    return;
+
   DCHECK_EQ(ConnectionStatus::kRequestingConnection, connection_status_);
   TransitionToStatus(ConnectionStatus::kAcceptingConnection);
   need_to_disconnect_endpoint_ = true;
@@ -399,6 +412,15 @@
     return;
   }
 
+  if (connection_status_ == ConnectionStatus::kDisconnecting) {
+    // If this callback is invoked while we are disconnecting, we can consider
+    // the disconnect successful.
+    need_to_disconnect_endpoint_ = false;
+    Disconnect(
+        util::NearbyDisconnectionReason::kDisconnectionRequestedByClient);
+    return;
+  }
+
   PA_LOG(WARNING) << "Connection rejected: " << status;
   Disconnect(util::NearbyDisconnectionReason::kConnectionRejected);
 }
diff --git a/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl_unittest.cc b/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl_unittest.cc
index 43294c1..386e951 100644
--- a/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl_unittest.cc
+++ b/chrome/browser/chromeos/secure_channel/nearby_connection_broker_impl_unittest.cc
@@ -426,9 +426,13 @@
   SimulateTimeout(/*expected_to_disconnect=*/false);
 }
 
+TEST_F(NearbyConnectionBrokerImplTest, MojoDisconnectionBeforeDiscovery) {
+  DisconnectMojoBindings(/*expected_to_disconnect=*/false);
+}
+
 TEST_F(NearbyConnectionBrokerImplTest, MojoDisconnectionAfterDiscovery) {
   DiscoverEndpoint();
-  DisconnectMojoBindings(/*expected_to_disconnect=*/false);
+  DisconnectMojoBindings(/*expected_to_disconnect=*/true);
 
   // Run callback to prevent DCHECK() crash that ensures all Mojo callbacks are
   // invoked.
diff --git a/chrome/browser/commerce/merchant_viewer/android/BUILD.gn b/chrome/browser/commerce/merchant_viewer/android/BUILD.gn
index 1460b3a6..9a4c2e71 100644
--- a/chrome/browser/commerce/merchant_viewer/android/BUILD.gn
+++ b/chrome/browser/commerce/merchant_viewer/android/BUILD.gn
@@ -14,6 +14,7 @@
     "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageScheduler.java",
     "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMetrics.java",
     "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator.java",
+    "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsDataProvider.java",
     "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsEvent.java",
     "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsEventStorage.java",
     "java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediator.java",
@@ -28,18 +29,21 @@
     "//chrome/android/features/tab_ui:java_resources",
     "//chrome/android/features/tab_ui:java_strings_grd",
     "//chrome/browser/android/lifecycle:java",
+    "//chrome/browser/commerce/merchant_viewer:optimization_guide_protos_java",
     "//chrome/browser/flags:java",
-    "//chrome/browser/preferences:java",
+    "//chrome/browser/optimization_guide/android:java",
     "//chrome/browser/profiles/android:java",
     "//chrome/browser/tab:java",
     "//chrome/browser/tabmodel:java",
     "//chrome/browser/version:java",
     "//components/browser_ui/bottomsheet/android:java",
     "//components/browser_ui/widget/android:java",
+    "//components/embedder_support/android:browser_context_java",
     "//components/embedder_support/android:content_view_java",
     "//components/embedder_support/android:util_java",
     "//components/embedder_support/android:web_contents_delegate_java",
     "//components/messages/android:java",
+    "//components/optimization_guide/proto:optimization_guide_proto_java",
     "//components/security_state/content/android:java",
     "//components/security_state/core:security_state_enums_java",
     "//components/thin_webview:factory_java",
@@ -48,7 +52,6 @@
     "//components/url_formatter/android:url_formatter_java",
     "//content/public/android:content_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
-    "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/androidx:androidx_core_core_java",
     "//ui/android:ui_no_recycler_view_java",
     "//url:gurl_java",
@@ -68,7 +71,8 @@
     "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustDetailsTabMediatorTest.java",
     "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageContextTest.java",
     "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageSchedulerTest.java",
-    "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java",
+    "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCallbackHelper.java",
+    "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsDataProviderTest.java",
     "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediatorTest.java",
   ]
 
@@ -78,12 +82,15 @@
     "//base:base_junit_test_support",
     "//chrome/android:base_module_java",
     "//chrome/android:chrome_java",
+    "//chrome/android/features/tab_ui:java_resources",
+    "//chrome/android/features/tab_ui:java_strings_grd",
     "//chrome/browser/android/lifecycle:java",
+    "//chrome/browser/commerce/merchant_viewer:optimization_guide_protos_java",
     "//chrome/browser/commerce/merchant_viewer/android:java",
     "//chrome/browser/flags:java",
+    "//chrome/browser/optimization_guide/android:java",
     "//chrome/browser/profiles/android:java",
     "//chrome/browser/tab:java",
-    "//chrome/browser/tab:java",
     "//chrome/browser/tabmodel:java",
     "//chrome/test/android:chrome_java_test_support",
     "//components/browser_ui/bottomsheet/android:java",
@@ -91,9 +98,12 @@
     "//components/embedder_support/android:util_java",
     "//components/embedder_support/android:web_contents_delegate_java",
     "//components/messages/android:java",
+    "//components/optimization_guide/proto:optimization_guide_proto_java",
     "//components/security_state/content/android:java",
     "//components/security_state/core:security_state_enums_java",
     "//content/public/android:content_java",
+    "//content/public/test/android:content_java_test_support",
+    "//third_party/android_deps:protobuf_lite_runtime_java",
     "//third_party/android_deps:robolectric_all_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/androidx:androidx_test_runner_java",
@@ -103,12 +113,14 @@
     "//ui/android:ui_no_recycler_view_java",
     "//url:gurl_java",
   ]
+  resources_package = "org.chromium.chrome.tab_ui"
 }
 
 android_library("javatests") {
   testonly = true
 
   sources = [
+    "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java",
     "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsEventLoadCallbackHelper.java",
     "javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsEventStorageTest.java",
   ]
@@ -116,14 +128,24 @@
   deps = [
     "//base:base_java",
     "//base:base_java_test_support",
+    "//chrome/browser/commerce/merchant_viewer:optimization_guide_protos_java",
     "//chrome/browser/commerce/merchant_viewer/android:java",
     "//chrome/browser/flags:java",
     "//chrome/browser/profiles/android:java",
+    "//chrome/browser/tabmodel:java",
     "//chrome/test/android:chrome_java_test_support",
+    "//components/browser_ui/bottomsheet/android:java",
+    "//components/messages/android:java",
+    "//content/public/android:content_full_java",
     "//content/public/test/android:content_java_test_support",
+    "//third_party/android_support_test_runner:runner_java",
     "//third_party/androidx:androidx_test_core_java",
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/junit",
+    "//third_party/mockito:mockito_java",
+    "//ui/android:ui_java_test_support",
+    "//ui/android:ui_no_recycler_view_java",
+    "//url:gurl_java",
   ]
 }
 
diff --git a/chrome/browser/commerce/merchant_viewer/android/DEPS b/chrome/browser/commerce/merchant_viewer/android/DEPS
index 79b6e0ec..3ee1847 100644
--- a/chrome/browser/commerce/merchant_viewer/android/DEPS
+++ b/chrome/browser/commerce/merchant_viewer/android/DEPS
@@ -1,5 +1,6 @@
 include_rules = [
-  "+content/public/android/java/src/org/chromium/content_public/browser",
+  "+chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide",
   "+components/thin_webview/java/src/org/chromium/components/thinwebview",
+  "+content/public/android/java/src/org/chromium/content_public/browser",
   "+content/public/android/java/src/org/chromium/content_public/common",
 ]
\ No newline at end of file
diff --git a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustDetailsTabMediator.java b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustDetailsTabMediator.java
index a6d35c8f94..994d6e1 100644
--- a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustDetailsTabMediator.java
+++ b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustDetailsTabMediator.java
@@ -35,9 +35,6 @@
     private final MerchantTrustMetrics mMetrics;
     private static final long HIDE_PROGRESS_BAR_DELAY_MS = 50;
 
-    // TODO: Read from config.
-    private static final boolean sShouldUsePageTitle = true;
-
     /** Creates a new instance. */
     MerchantTrustDetailsTabMediator(BottomSheetController bottomSheetController,
             int topControlsHeightDp, MerchantTrustMetrics metrics) {
@@ -81,7 +78,7 @@
 
             @Override
             public void titleWasSet(String title) {
-                if (!sShouldUsePageTitle) return;
+                if (!MerchantViewerConfig.TRUST_SIGNALS_SHEET_USE_PAGE_TITLE.getValue()) return;
                 mSheetContent.setTitle(title);
             }
 
diff --git a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageContext.java b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageContext.java
index 7796cee..c0c3f6a 100644
--- a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageContext.java
+++ b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageContext.java
@@ -4,26 +4,26 @@
 
 package org.chromium.chrome.browser.merchant_viewer;
 
-import android.text.TextUtils;
+import androidx.annotation.NonNull;
 
 import org.chromium.content_public.browser.WebContents;
-
+import org.chromium.url.GURL;
 /**
  * Additional data required for publishing and handling a merchant trust signals message.
  */
 class MerchantTrustMessageContext {
-    private final String mHostName;
     private final WebContents mWebContents;
+    private final GURL mUrl;
 
     /** Creates a new instance. */
-    MerchantTrustMessageContext(String hostName, WebContents webContents) {
-        mHostName = hostName;
+    MerchantTrustMessageContext(@NonNull GURL url, @NonNull WebContents webContents) {
+        mUrl = url;
         mWebContents = webContents;
     }
 
     /** Returns the host name for which the message is intended to be shown. */
     String getHostName() {
-        return mHostName;
+        return mUrl == null ? "" : mUrl.getHost();
     }
 
     /* Returns the {@link WebContentns} for which the message is intended to be shown. */
@@ -31,8 +31,14 @@
         return mWebContents;
     }
 
+    /** Returns the {@link GURL} associated with the context. */
+    GURL getUrl() {
+        return mUrl;
+    }
+
     /* Checks whether or not the context is valid. */
     boolean isValid() {
-        return mWebContents != null && !mWebContents.isDestroyed() && !TextUtils.isEmpty(mHostName);
+        return mWebContents != null && !mWebContents.isDestroyed() && mUrl != null
+                && !mUrl.isEmpty();
     }
 }
\ No newline at end of file
diff --git a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageScheduler.java b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageScheduler.java
index 24eb835b..6b98acc 100644
--- a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageScheduler.java
+++ b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageScheduler.java
@@ -5,11 +5,14 @@
 package org.chromium.chrome.browser.merchant_viewer;
 
 import android.os.Handler;
+import android.util.Pair;
 
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.base.Callback;
 import org.chromium.base.ThreadUtils;
 import org.chromium.chrome.browser.merchant_viewer.MerchantTrustMetrics.MessageClearReason;
+import org.chromium.components.messages.DismissReason;
 import org.chromium.components.messages.MessageDispatcher;
 import org.chromium.components.messages.MessageScopeType;
 import org.chromium.ui.modelutil.PropertyModel;
@@ -21,7 +24,7 @@
     private final MessageDispatcher mMessageDispatcher;
     private final MerchantTrustMetrics mMetrics;
     private Handler mEnqueueMessageTimer;
-    private MerchantTrustMessageContext mScheduledMessageContext;
+    private Pair<MerchantTrustMessageContext, PropertyModel> mScheduledMessage;
 
     public MerchantTrustMessageScheduler(
             MessageDispatcher messageDispatcher, MerchantTrustMetrics metrics) {
@@ -32,31 +35,58 @@
 
     /** Cancels any scheduled messages. */
     void clear(@MessageClearReason int clearReason) {
-        if (mScheduledMessageContext != null) {
+        if (mScheduledMessage != null) {
             mMetrics.recordMetricsForMessageCleared(clearReason);
         }
         mEnqueueMessageTimer.removeCallbacksAndMessages(null);
-        setScheduledMessageContext(null);
+        if (mScheduledMessage != null && mScheduledMessage.second != null) {
+            mMessageDispatcher.dismissMessage(
+                    mScheduledMessage.second, DismissReason.SCOPE_DESTROYED);
+        }
+        setScheduledMessage(null);
     }
 
     /** Adds a message to the underlying {@link MessageDispatcher} queue. */
-    void schedule(
-            PropertyModel model, MerchantTrustMessageContext messageContext, long delayInMillis) {
-        setScheduledMessageContext(messageContext);
+    void schedule(PropertyModel model, MerchantTrustMessageContext messageContext,
+            long delayInMillis, Callback<MerchantTrustMessageContext> messageEnqueuedCallback) {
+        setScheduledMessage(
+                new Pair<MerchantTrustMessageContext, PropertyModel>(messageContext, model));
         mMetrics.recordMetricsForMessagePrepared();
         mEnqueueMessageTimer.postDelayed(() -> {
             if (messageContext.isValid()) {
                 mMessageDispatcher.enqueueMessage(
                         model, messageContext.getWebContents(), MessageScopeType.NAVIGATION);
                 mMetrics.recordMetricsForMessageShown();
+                messageEnqueuedCallback.onResult(messageContext);
+            } else {
+                messageEnqueuedCallback.onResult(null);
             }
-            setScheduledMessageContext(null);
+            setScheduledMessage(null);
         }, delayInMillis);
     }
 
+    /**
+     * Forces the currently scheduled message (if any) to be enqueued through the {@link
+     * MessageDispatcher} right away without having to wait for the original time. This is achieved
+     * by calling MerchantTrustMessageScheduler#schedule with no delay time. This is a NOP if there
+     * isn't a scheduled message.
+     */
+    void expedite(Callback<MerchantTrustMessageContext> callback) {
+        if (mScheduledMessage == null) {
+            callback.onResult(null);
+            return;
+        }
+
+        Pair<MerchantTrustMessageContext, PropertyModel> replacement =
+                new Pair<MerchantTrustMessageContext, PropertyModel>(
+                        mScheduledMessage.first, mScheduledMessage.second);
+        clear(MessageClearReason.NAVIGATE_TO_SAME_DOMAIN);
+        schedule(replacement.second, replacement.first, MESSAGE_ENQUEUE_NO_DELAY, callback);
+    }
+
     /** Returns the currently scheduled message. */
     MerchantTrustMessageContext getScheduledMessageContext() {
-        return mScheduledMessageContext;
+        return mScheduledMessage == null ? null : mScheduledMessage.first;
     }
 
     @VisibleForTesting
@@ -65,9 +95,9 @@
     }
 
     @VisibleForTesting
-    void setScheduledMessageContext(MerchantTrustMessageContext messageContext) {
+    void setScheduledMessage(Pair<MerchantTrustMessageContext, PropertyModel> pair) {
         synchronized (mEnqueueMessageTimer) {
-            mScheduledMessageContext = messageContext;
+            mScheduledMessage = pair;
         }
     }
 }
diff --git a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator.java b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator.java
index febdb50..20b07259 100644
--- a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator.java
+++ b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinator.java
@@ -5,29 +5,40 @@
 package org.chromium.chrome.browser.merchant_viewer;
 
 import android.content.Context;
+import android.graphics.Typeface;
+import android.text.Spannable;
+import android.text.SpannableStringBuilder;
+import android.text.style.StyleSpan;
 import android.view.View;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.core.content.res.ResourcesCompat;
 
+import org.chromium.base.Callback;
 import org.chromium.base.supplier.Supplier;
 import org.chromium.chrome.browser.merchant_viewer.MerchantTrustMetrics.MessageClearReason;
+import org.chromium.chrome.browser.merchant_viewer.proto.MerchantTrustSignalsOuterClass.MerchantTrustSignals;
+import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.tab_ui.R;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.messages.DismissReason;
 import org.chromium.components.messages.MessageBannerProperties;
+import org.chromium.components.messages.MessageDispatcher;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.url.GURL;
 
+import java.text.NumberFormat;
 import java.util.concurrent.TimeUnit;
 
 /**
  * Coordinator for managing merchant trust signals experience.
  */
 public class MerchantTrustSignalsCoordinator {
-    // TODO: Make the value configurable.
-    @VisibleForTesting
-    public static final long MESSAGE_ENQUEUE_DELAY_MILLIS = TimeUnit.SECONDS.toMillis(2);
+    private static final int BASELINE_RATING = 5;
+
     private final MerchantTrustSignalsMediator mMediator;
     private final MerchantTrustMessageScheduler mMessageScheduler;
     private final MerchantTrustDetailsTabCoordinator mDetailsTabCoordinator;
@@ -36,16 +47,33 @@
     private final BottomSheetController mBottomSheetController;
     private final View mLayoutView;
     private final MerchantTrustMetrics mMetrics;
+    private final MerchantTrustSignalsDataProvider mDataProvider;
+    private final MerchantTrustSignalsEventStorage mStorage;
 
     /** Creates a new instance. */
     public MerchantTrustSignalsCoordinator(Context context, WindowAndroid windowAndroid,
             BottomSheetController bottomSheetController, View layoutView,
+            TabModelSelector tabModelSelector, MessageDispatcher messageDispatcher,
+            Supplier<Tab> tabSupplier, Supplier<Profile> profileSupplier,
+            MerchantTrustMetrics metrics) {
+        this(context, windowAndroid, bottomSheetController, layoutView, tabModelSelector,
+                new MerchantTrustMessageScheduler(messageDispatcher, metrics), tabSupplier,
+                new MerchantTrustSignalsDataProvider(),
+                new MerchantTrustSignalsEventStorage(profileSupplier.get()), metrics);
+    }
+
+    @VisibleForTesting
+    MerchantTrustSignalsCoordinator(Context context, WindowAndroid windowAndroid,
+            BottomSheetController bottomSheetController, View layoutView,
             TabModelSelector tabModelSelector, MerchantTrustMessageScheduler messageScheduler,
-            Supplier<Tab> tabSupplier, MerchantTrustMetrics metrics) {
+            Supplier<Tab> tabSupplier, MerchantTrustSignalsDataProvider dataProvider,
+            MerchantTrustSignalsEventStorage storage, MerchantTrustMetrics metrics) {
         mContext = context;
         mWindowAndroid = windowAndroid;
         mBottomSheetController = bottomSheetController;
         mLayoutView = layoutView;
+        mDataProvider = dataProvider;
+        mStorage = storage;
         mMetrics = metrics;
 
         mMediator = new MerchantTrustSignalsMediator(tabModelSelector, this::maybeDisplayMessage);
@@ -65,42 +93,91 @@
                 mMessageScheduler.getScheduledMessageContext();
         if (scheduledMessage != null && scheduledMessage.getHostName() != null
                 && scheduledMessage.getHostName().equals(item.getHostName())) {
-            MerchantTrustMessageContext replacementMessage = new MerchantTrustMessageContext(
-                    scheduledMessage.getHostName(), scheduledMessage.getWebContents());
-            mMessageScheduler.clear(MessageClearReason.NAVIGATE_TO_SAME_DOMAIN);
-            mMessageScheduler.schedule(getMessagePropertyModel(replacementMessage.getHostName()),
-                    replacementMessage, MerchantTrustMessageScheduler.MESSAGE_ENQUEUE_NO_DELAY);
+            mMessageScheduler.expedite(this::onMessageEnqueued);
         } else {
             mMessageScheduler.clear(MessageClearReason.NAVIGATE_TO_DIFFERENT_DOMAIN);
-            if (!isUnfamiliarMerchant(item.getHostName())) {
-                return;
-            }
 
-            mMessageScheduler.schedule(getMessagePropertyModel(item.getHostName()), item,
-                    MESSAGE_ENQUEUE_DELAY_MILLIS);
+            getDataForUnfamiliarMerchant(item.getUrl(), (trustSignals) -> {
+                if (trustSignals == null) {
+                    return;
+                }
+
+                mMessageScheduler.schedule(getMessagePropertyModel(item, trustSignals), item,
+                        MerchantViewerConfig.DEFAULT_TRUST_SIGNALS_MESSAGE_DELAY.getValue(),
+                        this::onMessageEnqueued);
+            });
         }
     }
 
-    private boolean isUnfamiliarMerchant(String hostname) {
-        // TODO: Check if the user has never seen the message for hostname before.
-        return true;
+    private void onMessageEnqueued(MerchantTrustMessageContext messageContext) {
+        if (messageContext == null) {
+            return;
+        }
+        mStorage.save(new MerchantTrustSignalsEvent(
+                messageContext.getHostName(), System.currentTimeMillis()));
     }
 
-    private PropertyModel getMessagePropertyModel(String hostname) {
-        // TODO: populate the PropertyModel fields.
+    private void getDataForUnfamiliarMerchant(GURL url, Callback<MerchantTrustSignals> callback) {
+        mStorage.load(url.getHost(), (event) -> {
+            if (event == null) {
+                mDataProvider.getDataForUrl(url, callback);
+            } else if (System.currentTimeMillis() - event.getTimestamp()
+                    > TimeUnit.SECONDS.toMillis(
+                            MerchantViewerConfig.TRUST_SIGNALS_MESSAGE_WINDOW_DURATION_SECONDS
+                                    .getValue())) {
+                mStorage.delete(event);
+                mDataProvider.getDataForUrl(url, callback);
+            } else {
+                callback.onResult(null);
+            }
+        });
+    }
+
+    private void launchDetailsPage(GURL url) {
+        mDetailsTabCoordinator.requestOpenSheet(url,
+                mContext.getResources().getString(R.string.merchant_viewer_preview_sheet_title));
+    }
+
+    private PropertyModel getMessagePropertyModel(
+            MerchantTrustMessageContext messageContext, MerchantTrustSignals trustSignals) {
         return new PropertyModel.Builder(MessageBannerProperties.ALL_KEYS)
-                .with(MessageBannerProperties.ON_PRIMARY_ACTION, this::onMessageTapped)
+                .with(MessageBannerProperties.ICON,
+                        ResourcesCompat.getDrawable(mContext.getResources(),
+                                R.drawable.ic_logo_googleg_24dp, mContext.getTheme()))
+                .with(MessageBannerProperties.ICON_TINT_COLOR, MessageBannerProperties.TINT_NONE)
+                .with(MessageBannerProperties.TITLE,
+                        mContext.getResources().getString(R.string.merchant_viewer_message_title))
+                .with(MessageBannerProperties.DESCRIPTION, getMessageDescription(trustSignals))
+                .with(MessageBannerProperties.PRIMARY_BUTTON_TEXT,
+                        mContext.getResources().getString(R.string.merchant_viewer_message_action))
                 .with(MessageBannerProperties.ON_DISMISSED, this::onMessageDismissed)
+                .with(MessageBannerProperties.ON_PRIMARY_ACTION,
+                        () -> {
+                            mMetrics.recordMetricsForMessageTapped();
+                            launchDetailsPage(new GURL(trustSignals.getMerchantDetailsPageUrl()));
+                        })
                 .build();
     }
 
     @VisibleForTesting
-    void onMessageTapped() {
-        mMetrics.recordMetricsForMessageTapped();
-    }
-
-    @VisibleForTesting
     void onMessageDismissed(@DismissReason int dismissReason) {
         mMetrics.recordMetricsForMessageDismissed(dismissReason);
     }
+
+    private Spannable getMessageDescription(MerchantTrustSignals trustSignals) {
+        SpannableStringBuilder builder = new SpannableStringBuilder();
+        NumberFormat numberFormatter = NumberFormat.getIntegerInstance();
+        numberFormatter.setMaximumFractionDigits(1);
+        builder.append(mContext.getResources().getString(
+                R.string.merchant_viewer_message_description_rating,
+                numberFormatter.format(trustSignals.getMerchantStarRating()),
+                numberFormatter.format(BASELINE_RATING)));
+        builder.append(" ");
+        builder.setSpan(new StyleSpan(Typeface.BOLD), 0, builder.length(),
+                Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
+        builder.append(mContext.getResources().getQuantityString(
+                R.plurals.merchant_viewer_message_description_reviews,
+                trustSignals.getMerchantCountRating(), trustSignals.getMerchantCountRating()));
+        return builder;
+    }
 }
\ No newline at end of file
diff --git a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsDataProvider.java b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsDataProvider.java
new file mode 100644
index 0000000..2b42feb
--- /dev/null
+++ b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsDataProvider.java
@@ -0,0 +1,55 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// 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.merchant_viewer;
+
+import org.chromium.base.Callback;
+import org.chromium.base.Log;
+import org.chromium.chrome.browser.merchant_viewer.proto.MerchantTrustSignalsOuterClass.MerchantTrustSignals;
+import org.chromium.chrome.browser.optimization_guide.OptimizationGuideBridgeFactory;
+import org.chromium.components.optimization_guide.OptimizationGuideDecision;
+import org.chromium.components.optimization_guide.proto.HintsProto;
+import org.chromium.url.GURL;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+/**
+ * Merchant trust data provider using {@link OptimizationGuideBridge}.
+ */
+class MerchantTrustSignalsDataProvider {
+    private static final String TAG = "MTDP";
+    private static final OptimizationGuideBridgeFactory sOptimizationGuideBridgeFactory =
+            new OptimizationGuideBridgeFactory(
+                    Arrays.asList(HintsProto.OptimizationType.MERCHANT_TRUST_SIGNALS));
+
+    /** Fetches {@link MerchantTrustSignals} through {@link OptimizationGuideBridge}. */
+    public void getDataForUrl(GURL url, Callback<MerchantTrustSignals> callback) {
+        sOptimizationGuideBridgeFactory.create().canApplyOptimization(
+                url, HintsProto.OptimizationType.MERCHANT_TRUST_SIGNALS, (decision, metadata) -> {
+                    if (decision != OptimizationGuideDecision.TRUE || metadata == null) {
+                        callback.onResult(null);
+                        return;
+                    }
+                    try {
+                        MerchantTrustSignals trustSignals =
+                                MerchantTrustSignals.parseFrom(metadata.getValue());
+
+                        callback.onResult(
+                                isValidMerchantTrustSignals(trustSignals) ? trustSignals : null);
+                    } catch (IOException e) {
+                        // Catching Exception instead of InvalidProtocolBufferException in order to
+                        // avoid increasing the apk size by taking a dependency on protobuf lib.
+                        Log.i(TAG,
+                                "There was a problem parsing MerchantTrustSignals."
+                                        + e.getMessage());
+                        callback.onResult(null);
+                    }
+                });
+    }
+
+    private boolean isValidMerchantTrustSignals(MerchantTrustSignals trustSignals) {
+        return trustSignals.hasMerchantCountRating() && trustSignals.hasMerchantStarRating()
+                && trustSignals.hasMerchantDetailsPageUrl();
+    }
+}
\ No newline at end of file
diff --git a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediator.java b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediator.java
index 0de7ad62..447f68f 100644
--- a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediator.java
+++ b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediator.java
@@ -13,7 +13,6 @@
 import org.chromium.content_public.browser.NavigationHandle;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsObserver;
-import org.chromium.url.GURL;
 
 /** Responsible for detecting candidate events for publishing the merchant trust message. */
 class MerchantTrustSignalsMediator {
@@ -44,12 +43,8 @@
                 return;
             }
 
-            if (!hasMerchantTrustSignals(navigation.getUrl())) {
-                return;
-            }
-
-            mDelegate.maybeDisplayMessage(new MerchantTrustMessageContext(
-                    navigation.getUrl().getHost(), mCurrentWebContents));
+            mDelegate.maybeDisplayMessage(
+                    new MerchantTrustMessageContext(navigation.getUrl(), mCurrentWebContents));
         }
     };
 
@@ -57,6 +52,7 @@
             TabModelSelector tabModelSelector, MerchantTrustSignalsCallback delegate) {
         mTabModelSelector = tabModelSelector;
         mDelegate = delegate;
+
         mTabModelObserver = new TabModelObserver() {
             @Override
             public void didSelectTab(Tab tab, @TabSelectionType int type, int lastId) {
@@ -72,6 +68,13 @@
         };
 
         mTabModelSelector.getTabModelFilterProvider().addTabModelFilterObserver(mTabModelObserver);
+
+        // Listen on the initial tab's changes.
+        mTab = tabModelSelector.getCurrentTab();
+        if (mTab != null) {
+            mCurrentWebContents = mTab.getWebContents();
+            mCurrentWebContents.addObserver(mWebContentsObserver);
+        }
     }
 
     void destroy() {
@@ -80,8 +83,4 @@
                     mTabModelObserver);
         }
     }
-
-    private boolean hasMerchantTrustSignals(GURL url) {
-        return true;
-    }
 }
diff --git a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantViewerConfig.java b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantViewerConfig.java
index ba70914..9c16b3c 100644
--- a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantViewerConfig.java
+++ b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantViewerConfig.java
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 package org.chromium.chrome.browser.merchant_viewer;
 
+import org.chromium.chrome.browser.flags.BooleanCachedFieldTrialParameter;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.IntCachedFieldTrialParameter;
 
@@ -10,9 +11,22 @@
 
 /** Flag configuration for Merchant Viewer experience. */
 public class MerchantViewerConfig {
-    private static final String TRUST_SIGNALS_MESSAGE_DELAY_PARAM = "trust_signals_message_delay";
+    private static final String TRUST_SIGNALS_MESSAGE_DELAY_PARAM =
+            "trust_signals_message_delay_ms";
+    private static final String TRUST_SIGNALS_MESSAGE_WINDOW_DURATION_PARAM =
+            "trust_signals_message_window_duration_ms";
+    private static final String TRUST_SIGNALS_SHEET_USE_PAGE_TITLE_PARAM =
+            "trust_signals_sheet_use_page_title";
 
     public static final IntCachedFieldTrialParameter DEFAULT_TRUST_SIGNALS_MESSAGE_DELAY =
             new IntCachedFieldTrialParameter(ChromeFeatureList.COMMERCE_MERCHANT_VIEWER,
                     TRUST_SIGNALS_MESSAGE_DELAY_PARAM, (int) TimeUnit.SECONDS.toMillis(30));
+
+    public static final IntCachedFieldTrialParameter TRUST_SIGNALS_MESSAGE_WINDOW_DURATION_SECONDS =
+            new IntCachedFieldTrialParameter(ChromeFeatureList.COMMERCE_MERCHANT_VIEWER,
+                    TRUST_SIGNALS_MESSAGE_WINDOW_DURATION_PARAM, (int) TimeUnit.DAYS.toMillis(365));
+
+    public static final BooleanCachedFieldTrialParameter TRUST_SIGNALS_SHEET_USE_PAGE_TITLE =
+            new BooleanCachedFieldTrialParameter(ChromeFeatureList.COMMERCE_MERCHANT_VIEWER,
+                    TRUST_SIGNALS_SHEET_USE_PAGE_TITLE_PARAM, true);
 }
diff --git a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustDetailsTabMediatorTest.java b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustDetailsTabMediatorTest.java
index c82cb5e..5b9b2d9 100644
--- a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustDetailsTabMediatorTest.java
+++ b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustDetailsTabMediatorTest.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.merchant_viewer;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyString;
@@ -166,6 +168,33 @@
     }
 
     @Test
+    public void testWebContentsDelegateShouldCreateWebContents() {
+        MerchantTrustDetailsTabMediator instance = getMediatorUnderTest();
+        instance.init(mMockWebContents, mMockContentView, mMockSheetContent, mMockProfile);
+        verify(mMockSheetContent, times(1))
+                .attachWebContents(eq(mMockWebContents), eq(mMockContentView),
+                        mWebContentsDelegateCaptor.capture());
+        instance.requestShowContent(mMockDestinationGurl, DUMMY_SHEET_TITLE);
+
+        assertFalse(mWebContentsDelegateCaptor.getValue().shouldCreateWebContents(
+                mMockDestinationGurl));
+
+        verify(mMockNavigationController, times(2)).loadUrl(any(LoadUrlParams.class));
+    }
+
+    @Test
+    public void testGetTopControlsHeight() {
+        MerchantTrustDetailsTabMediator instance = getMediatorUnderTest();
+        instance.init(mMockWebContents, mMockContentView, mMockSheetContent, mMockProfile);
+        verify(mMockSheetContent, times(1))
+                .attachWebContents(eq(mMockWebContents), eq(mMockContentView),
+                        mWebContentsDelegateCaptor.capture());
+        instance.requestShowContent(mMockDestinationGurl, DUMMY_SHEET_TITLE);
+
+        assertEquals(100, mWebContentsDelegateCaptor.getValue().getTopControlsHeight());
+    }
+
+    @Test
     public void testLoadingStateChanges() {
         MerchantTrustDetailsTabMediator instance = getMediatorUnderTest();
         instance.init(mMockWebContents, mMockContentView, mMockSheetContent, mMockProfile);
diff --git a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageContextTest.java b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageContextTest.java
index 82fac029..265f154b 100644
--- a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageContextTest.java
+++ b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageContextTest.java
@@ -20,6 +20,7 @@
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.content_public.browser.WebContents;
+import org.chromium.url.GURL;
 
 /**
  * Tests for {@link MerchantTrustMessageContext}.
@@ -29,19 +30,24 @@
 public class MerchantTrustMessageContextTest {
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-    }
+
+    @Mock
+    private GURL mMockGurl;
 
     @Mock
     private WebContents mMockWebContents;
 
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        doReturn("fake_host").when(mMockGurl).getHost();
+    }
+
     @Test
     public void testIsValid() {
         doReturn(false).when(mMockWebContents).isDestroyed();
         MerchantTrustMessageContext context =
-                new MerchantTrustMessageContext("fake_host", mMockWebContents);
+                new MerchantTrustMessageContext(mMockGurl, mMockWebContents);
         assertTrue(context.isValid());
     }
 
@@ -49,14 +55,16 @@
     public void testIsValidDestroyedWebContents() {
         doReturn(true).when(mMockWebContents).isDestroyed();
         MerchantTrustMessageContext context =
-                new MerchantTrustMessageContext("fake_host", mMockWebContents);
+                new MerchantTrustMessageContext(mMockGurl, mMockWebContents);
         assertFalse(context.isValid());
     }
 
     @Test
     public void testIsValidEmptyHostname() {
-        doReturn(true).when(mMockWebContents).isDestroyed();
-        MerchantTrustMessageContext context = new MerchantTrustMessageContext("", mMockWebContents);
+        doReturn(false).when(mMockWebContents).isDestroyed();
+        doReturn(true).when(mMockGurl).isEmpty();
+        MerchantTrustMessageContext context =
+                new MerchantTrustMessageContext(mMockGurl, mMockWebContents);
         assertFalse(context.isValid());
     }
 
@@ -70,7 +78,7 @@
 
     @Test
     public void testIsValidNullWebContents() {
-        MerchantTrustMessageContext context = new MerchantTrustMessageContext("fake_host", null);
+        MerchantTrustMessageContext context = new MerchantTrustMessageContext(mMockGurl, null);
         assertFalse(context.isValid());
     }
 }
\ No newline at end of file
diff --git a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageSchedulerTest.java b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageSchedulerTest.java
index 0d63db3e..1a1752b0 100644
--- a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageSchedulerTest.java
+++ b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageSchedulerTest.java
@@ -5,7 +5,9 @@
 package org.chromium.chrome.browser.merchant_viewer;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
@@ -13,7 +15,9 @@
 import static org.mockito.Mockito.verify;
 
 import android.os.Handler;
+import android.util.Pair;
 
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -21,17 +25,19 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.browser.merchant_viewer.MerchantTrustMetrics.MessageClearReason;
 import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.components.messages.DismissReason;
 import org.chromium.components.messages.MessageDispatcher;
 import org.chromium.components.messages.MessageScopeType;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.modelutil.PropertyModel;
 
+import java.util.concurrent.TimeoutException;
+
 /**
  * Tests for {@link MerchantTrustMessageScheduler}.
  */
@@ -40,10 +46,6 @@
 public class MerchantTrustMessageSchedulerTest {
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-    }
 
     @Mock
     private MessageDispatcher mMockMessageDispatcher;
@@ -54,8 +56,26 @@
     @Mock
     private MerchantTrustMetrics mMockMetrics;
 
+    @Mock
+    private Handler mMockHandler;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        doAnswer(invocation -> {
+            Runnable runnable = (Runnable) (invocation.getArguments()[0]);
+            runnable.run();
+            return null;
+        })
+                .when(mMockHandler)
+                .postDelayed(any(Runnable.class), anyLong());
+    }
+
     @Test
-    public void testSchedule() {
+    public void testSchedule() throws TimeoutException {
+        MerchantTrustSignalsCallbackHelper callbackHelper =
+                new MerchantTrustSignalsCallbackHelper();
         MerchantTrustMessageScheduler scheduler = getSchedulerUnderTest();
         PropertyModel mockPropteryModel = mock(PropertyModel.class);
         doReturn(false).when(mMockWebContents).isDestroyed();
@@ -64,18 +84,26 @@
         doReturn(true).when(mockMessagesContext).isValid();
         doReturn(mMockWebContents).when(mockMessagesContext).getWebContents();
 
-        scheduler.schedule(mockPropteryModel, mockMessagesContext, 0);
-        verify(mMockMetrics, times(1)).recordMetricsForMessagePrepared();
-        Robolectric.flushForegroundThreadScheduler();
+        scheduler.setHandlerForTesting(mMockHandler);
 
+        int callCount = callbackHelper.getCallCount();
+        scheduler.schedule(
+                mockPropteryModel, mockMessagesContext, 2000, callbackHelper::notifyCalled);
+
+        callbackHelper.waitForCallback(callCount);
+        Assert.assertNotNull(callbackHelper.getResult());
+        verify(mMockHandler, times(1)).postDelayed(any(Runnable.class), eq(2000L));
         verify(mMockMessageDispatcher, times(1))
                 .enqueueMessage(eq(mockPropteryModel), eq(mMockWebContents),
                         eq(MessageScopeType.NAVIGATION));
+        verify(mMockMetrics, times(1)).recordMetricsForMessagePrepared();
         verify(mMockMetrics, times(1)).recordMetricsForMessageShown();
     }
 
     @Test
-    public void testScheduleInvalidWebContents() {
+    public void testScheduleInvalidMessageContext() throws TimeoutException {
+        MerchantTrustSignalsCallbackHelper callbackHelper =
+                new MerchantTrustSignalsCallbackHelper();
         MerchantTrustMessageScheduler scheduler = getSchedulerUnderTest();
         PropertyModel mockPropteryModel = mock(PropertyModel.class);
         doReturn(false).when(mMockWebContents).isDestroyed();
@@ -84,8 +112,15 @@
         doReturn(false).when(mockMessagesContext).isValid();
         doReturn(mMockWebContents).when(mockMessagesContext).getWebContents();
 
-        scheduler.schedule(mockPropteryModel, mockMessagesContext, 0);
-        Robolectric.flushForegroundThreadScheduler();
+        scheduler.setHandlerForTesting(mMockHandler);
+
+        int callCount = callbackHelper.getCallCount();
+        scheduler.schedule(
+                mockPropteryModel, mockMessagesContext, 2000, callbackHelper::notifyCalled);
+        callbackHelper.waitForCallback(callCount);
+
+        Assert.assertNull(callbackHelper.getResult());
+        Assert.assertNull(scheduler.getScheduledMessageContext());
 
         verify(mMockMessageDispatcher, never())
                 .enqueueMessage(eq(mockPropteryModel), eq(mMockWebContents),
@@ -93,7 +128,7 @@
     }
 
     @Test
-    public void testScheduleWithDelay() {
+    public void testClear() throws TimeoutException {
         MerchantTrustMessageScheduler scheduler = getSchedulerUnderTest();
         PropertyModel mockPropteryModel = mock(PropertyModel.class);
         doReturn(false).when(mMockWebContents).isDestroyed();
@@ -102,24 +137,77 @@
         doReturn(true).when(mockMessagesContext).isValid();
         doReturn(mMockWebContents).when(mockMessagesContext).getWebContents();
 
-        Handler mockHandler = mock(Handler.class);
-        scheduler.setHandlerForTesting(mockHandler);
-        scheduler.schedule(mockPropteryModel, mockMessagesContext, 100);
-        verify(mockHandler, times(1)).postDelayed(any(Runnable.class), eq(100L));
+        scheduler.setScheduledMessage(new Pair<MerchantTrustMessageContext, PropertyModel>(
+                mockMessagesContext, mockPropteryModel));
+        Assert.assertNotNull(scheduler.getScheduledMessageContext());
+        scheduler.clear(MessageClearReason.UNKNOWN);
+        Assert.assertNull(scheduler.getScheduledMessageContext());
+        verify(mMockMessageDispatcher, times(1))
+                .dismissMessage(eq(mockPropteryModel), eq(DismissReason.SCOPE_DESTROYED));
+        verify(mMockMetrics, times(1))
+                .recordMetricsForMessageCleared(eq(MessageClearReason.UNKNOWN));
     }
 
     @Test
-    public void testClear() {
+    public void testExpedite() throws TimeoutException {
+        MerchantTrustSignalsCallbackHelper callbackHelper =
+                new MerchantTrustSignalsCallbackHelper();
+
+        MerchantTrustMessageScheduler scheduler = getSchedulerUnderTest();
+        PropertyModel mockPropteryModel = mock(PropertyModel.class);
+        doReturn(false).when(mMockWebContents).isDestroyed();
+
+        MerchantTrustMessageContext mockMessagesContext = mock(MerchantTrustMessageContext.class);
+        doReturn(true).when(mockMessagesContext).isValid();
+        doReturn(mMockWebContents).when(mockMessagesContext).getWebContents();
+
+        scheduler.schedule(
+                mockPropteryModel, mockMessagesContext, 50000, callbackHelper::notifyCalled);
+        Assert.assertNotNull(scheduler.getScheduledMessageContext());
+
+        MerchantTrustSignalsCallbackHelper expediteCallbackHelper =
+                new MerchantTrustSignalsCallbackHelper();
+        int callCount = expediteCallbackHelper.getCallCount();
+        scheduler.setHandlerForTesting(mMockHandler);
+        scheduler.expedite(expediteCallbackHelper::notifyCalled);
+        expediteCallbackHelper.waitForCallback(callCount);
+        Assert.assertNotNull(expediteCallbackHelper.getResult());
+        Assert.assertNull(scheduler.getScheduledMessageContext());
+        verify(mMockMessageDispatcher, times(1))
+                .enqueueMessage(eq(mockPropteryModel), eq(mMockWebContents),
+                        eq(MessageScopeType.NAVIGATION));
+    }
+
+    @Test
+    public void testExpediteNoScheduledMessage() throws TimeoutException {
+        MerchantTrustMessageScheduler scheduler = getSchedulerUnderTest();
+        PropertyModel mockPropteryModel = mock(PropertyModel.class);
+        doReturn(false).when(mMockWebContents).isDestroyed();
+
+        MerchantTrustMessageContext mockMessagesContext = mock(MerchantTrustMessageContext.class);
+        doReturn(true).when(mockMessagesContext).isValid();
+        doReturn(mMockWebContents).when(mockMessagesContext).getWebContents();
+
+        Assert.assertNull(scheduler.getScheduledMessageContext());
+
+        MerchantTrustSignalsCallbackHelper expediteCallbackHelper =
+                new MerchantTrustSignalsCallbackHelper();
+        int callCount = expediteCallbackHelper.getCallCount();
+        scheduler.expedite(expediteCallbackHelper::notifyCalled);
+
+        expediteCallbackHelper.waitForCallback(callCount);
+        Assert.assertNull(scheduler.getScheduledMessageContext());
+        verify(mMockMessageDispatcher, never())
+                .enqueueMessage(eq(mockPropteryModel), eq(mMockWebContents),
+                        eq(MessageScopeType.NAVIGATION));
+    }
+
+    @Test
+    public void testClearNoScheduledMessage() {
         MerchantTrustMessageScheduler scheduler = getSchedulerUnderTest();
         scheduler.clear(MessageClearReason.UNKNOWN);
         verify(mMockMetrics, times(0))
                 .recordMetricsForMessageCleared(eq(MessageClearReason.UNKNOWN));
-
-        MerchantTrustMessageContext mockMessagesContext = mock(MerchantTrustMessageContext.class);
-        scheduler.setScheduledMessageContext(mockMessagesContext);
-        scheduler.clear(MessageClearReason.UNKNOWN);
-        verify(mMockMetrics, times(1))
-                .recordMetricsForMessageCleared(eq(MessageClearReason.UNKNOWN));
     }
 
     private MerchantTrustMessageScheduler getSchedulerUnderTest() {
diff --git a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCallbackHelper.java b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCallbackHelper.java
new file mode 100644
index 0000000..2e8bb4f1
--- /dev/null
+++ b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCallbackHelper.java
@@ -0,0 +1,41 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// 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.merchant_viewer;
+
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.chrome.browser.merchant_viewer.proto.MerchantTrustSignalsOuterClass.MerchantTrustSignals;
+
+/**
+ * Extends {@link CallbackHelper} to offer a set of convenience methods for handling merchant trust
+ * callbacks.
+ */
+class MerchantTrustSignalsCallbackHelper extends CallbackHelper {
+    private MerchantTrustMessageContext mResult;
+    private MerchantTrustSignals mMerchantTrustSignalsResult;
+
+    /** Handles callbacks with type {@link MerchantTrustMessageContext}. */
+    void notifyCalled(MerchantTrustMessageContext context) {
+        mResult = context;
+        notifyCalled();
+    }
+
+    /** Handles callbacks with type {@link MerchantTrustSignals}. */
+    void notifyCalled(MerchantTrustSignals signals) {
+        mMerchantTrustSignalsResult = signals;
+        notifyCalled();
+    }
+
+    /** Returns the cached {@link MerchantTrustSignals} result. */
+
+    MerchantTrustSignals getMerchantTrustSignalsResult() {
+        return mMerchantTrustSignalsResult;
+    }
+
+    /** Returns the cached {@link MerchantTrustMessageContext} result. */
+
+    MerchantTrustMessageContext getResult() {
+        return mResult;
+    }
+}
diff --git a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java
index 85bbd62f..6471715 100644
--- a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java
+++ b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java
@@ -5,8 +5,12 @@
 package org.chromium.chrome.browser.merchant_viewer;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyObject;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
@@ -14,37 +18,58 @@
 import android.content.res.Resources;
 import android.view.View;
 
+import androidx.test.filters.SmallTest;
+
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 
+import org.chromium.base.Callback;
 import org.chromium.base.supplier.Supplier;
-import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.UiThreadTest;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.merchant_viewer.MerchantTrustMetrics.MessageClearReason;
+import org.chromium.chrome.browser.merchant_viewer.proto.MerchantTrustSignalsOuterClass.MerchantTrustSignals;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModelFilterProvider;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.messages.DismissReason;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.display.DisplayAndroid;
 import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.url.GURL;
+
+import java.util.concurrent.TimeUnit;
 
 /**
  * Tests for {@link MerchantTrustSignalsCoordinator}.
  */
-@RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
+@RunWith(BaseJUnit4ClassRunner.class)
+@EnableFeatures({ChromeFeatureList.COMMERCE_MERCHANT_VIEWER + "<Study"})
+@CommandLineFlags.
+Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "force-fieldtrials=Study/Group"})
 public class MerchantTrustSignalsCoordinatorTest {
     @Rule
-    public TestRule mProcessor = new Features.JUnitProcessor();
+    public final ChromeBrowserTestRule mBrowserTestRule = new ChromeBrowserTestRule();
+
+    @Rule
+    public TestRule mProcessor = new Features.InstrumentationProcessor();
 
     @Mock
     private TabModelSelector mMockTabModelSelector;
@@ -82,81 +107,208 @@
     @Mock
     private MerchantTrustMetrics mMockMetrics;
 
+    @Mock
+    private GURL mMockGurl;
+
+    @Mock
+    private GURL mMockGurl2;
+
+    @Mock
+    private MerchantTrustSignalsDataProvider mMockMerchantTrustDataProvider;
+
+    @Mock
+    private MerchantTrustSignalsEventStorage mMockMerchantTrustStorage;
+
+    @Mock
+    private MerchantTrustSignalsEvent mMockMerchantTrustSignalsEvent;
+
+    @Captor
+    private ArgumentCaptor<Callback> mOnMessageEnqueuedCallbackCaptor;
+
+    private MerchantTrustSignals mDummyMerchantTrustSignals =
+            MerchantTrustSignals.newBuilder()
+                    .setMerchantStarRating(4.5f)
+                    .setMerchantCountRating(100)
+                    .setMerchantDetailsPageUrl("http://dummy/url")
+                    .build();
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         doReturn(mTabModelFilterProvider).when(mMockTabModelSelector).getTabModelFilterProvider();
+        doReturn("Test").when(mMockResources).getString(anyInt(), anyObject());
+        doReturn("Test").when(mMockResources).getQuantityString(anyInt(), anyInt(), anyObject());
         doReturn(100).when(mMockResources).getDimensionPixelSize(any(Integer.class));
         doReturn(mMockResources).when(mMockContext).getResources();
         doReturn(1f).when(mMockDisplayAndroid).getDipScale();
         doReturn(mMockDisplayAndroid).when(mMockWindowAndroid).getDisplay();
+        doReturn("fake_host").when(mMockGurl).getHost();
+        doReturn("different_host").when(mMockGurl2).getHost();
     }
 
+    @UiThreadTest
+    @SmallTest
     @Test
+    @CommandLineFlags.
+    Add({"force-fieldtrial-params=Study.Group:trust_signals_message_window_duration_ms/-1"})
     public void testMaybeDisplayMessage() {
         // Verify previous scheduled message is canceled.
         MerchantTrustSignalsCoordinator coordinator = getCoordinatorUnderTest();
         doReturn(null).when(mMockMerchantMessageScheduler).getScheduledMessageContext();
+        doReturn(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1))
+                .when(mMockMerchantTrustSignalsEvent)
+                .getTimestamp();
+        doReturn("fake_host").when(mMockMerchantTrustSignalsEvent).getKey();
+
+        setMockTrustSignalsData(mDummyMerchantTrustSignals);
+        setMockTrustSignalsEventData("fake_host", mMockMerchantTrustSignalsEvent);
 
         coordinator.maybeDisplayMessage(
-                new MerchantTrustMessageContext("fake_host", mMockWebContents));
+                new MerchantTrustMessageContext(mMockGurl, mMockWebContents));
 
         verify(mMockMerchantMessageScheduler, times(1))
                 .clear(eq(MessageClearReason.NAVIGATE_TO_DIFFERENT_DOMAIN));
 
-        // TODO: validate PropertyModel once it's populated.
         verify(mMockMerchantMessageScheduler, times(1))
                 .schedule(any(PropertyModel.class), any(MerchantTrustMessageContext.class),
-                        eq(MerchantTrustSignalsCoordinator.MESSAGE_ENQUEUE_DELAY_MILLIS));
+                        eq((long) MerchantViewerConfig.DEFAULT_TRUST_SIGNALS_MESSAGE_DELAY
+                                        .getValue()),
+                        any(Callback.class));
+
+        verify(mMockMerchantTrustStorage, times(1)).delete(eq(mMockMerchantTrustSignalsEvent));
+        verify(mMockMerchantTrustDataProvider, times(1))
+                .getDataForUrl(eq(mMockGurl), any(Callback.class));
     }
 
+    @UiThreadTest
+    @SmallTest
+    @Test
+    @CommandLineFlags.
+    Add({"force-fieldtrial-params=Study.Group:trust_signals_message_window_duration_ms/60000"})
+    public void testMaybeDisplayMessageLastEventWithinTimeWindow() {
+        // Verify previous scheduled message is canceled.
+        MerchantTrustSignalsCoordinator coordinator = getCoordinatorUnderTest();
+        doReturn(null).when(mMockMerchantMessageScheduler).getScheduledMessageContext();
+        doReturn(System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(10))
+                .when(mMockMerchantTrustSignalsEvent)
+                .getTimestamp();
+        doReturn("fake_host").when(mMockMerchantTrustSignalsEvent).getKey();
+
+        setMockTrustSignalsData(mDummyMerchantTrustSignals);
+        setMockTrustSignalsEventData("fake_host", mMockMerchantTrustSignalsEvent);
+
+        coordinator.maybeDisplayMessage(
+                new MerchantTrustMessageContext(mMockGurl, mMockWebContents));
+
+        verify(mMockMerchantMessageScheduler, times(1))
+                .clear(eq(MessageClearReason.NAVIGATE_TO_DIFFERENT_DOMAIN));
+        verify(mMockMerchantMessageScheduler, never())
+                .schedule(any(PropertyModel.class), any(MerchantTrustMessageContext.class),
+                        eq((long) MerchantViewerConfig.DEFAULT_TRUST_SIGNALS_MESSAGE_DELAY
+                                        .getValue()),
+                        any(Callback.class));
+    }
+
+    @UiThreadTest
+    @SmallTest
+    @Test
+    @CommandLineFlags.
+    Add({"force-fieldtrial-params=Study.Group:trust_signals_message_window_duration_ms/-1"})
+    public void testMaybeDisplayMessageFirstTime() {
+        // Verify previous scheduled message is canceled.
+        MerchantTrustSignalsCoordinator coordinator = getCoordinatorUnderTest();
+        doReturn(null).when(mMockMerchantMessageScheduler).getScheduledMessageContext();
+        doReturn(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1))
+                .when(mMockMerchantTrustSignalsEvent)
+                .getTimestamp();
+        doReturn("fake_host").when(mMockMerchantTrustSignalsEvent).getKey();
+
+        setMockTrustSignalsData(mDummyMerchantTrustSignals);
+        setMockTrustSignalsEventData("fake_host", null);
+
+        coordinator.maybeDisplayMessage(
+                new MerchantTrustMessageContext(mMockGurl, mMockWebContents));
+
+        verify(mMockMerchantMessageScheduler, times(1))
+                .clear(eq(MessageClearReason.NAVIGATE_TO_DIFFERENT_DOMAIN));
+        verify(mMockMerchantMessageScheduler, times(1))
+                .schedule(any(PropertyModel.class), any(MerchantTrustMessageContext.class),
+                        eq((long) MerchantViewerConfig.DEFAULT_TRUST_SIGNALS_MESSAGE_DELAY
+                                        .getValue()),
+                        any(Callback.class));
+    }
+
+    @UiThreadTest
+    @SmallTest
+    @Test
+    @CommandLineFlags.
+    Add({"force-fieldtrial-params=Study.Group:trust_signals_message_window_duration_ms/-1"})
+    public void testMaybeDisplayMessageNoMerchantTrustData() {
+        // Verify previous scheduled message is canceled.
+        MerchantTrustSignalsCoordinator coordinator = getCoordinatorUnderTest();
+        doReturn(null).when(mMockMerchantMessageScheduler).getScheduledMessageContext();
+        doReturn(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1))
+                .when(mMockMerchantTrustSignalsEvent)
+                .getTimestamp();
+        doReturn("fake_host").when(mMockMerchantTrustSignalsEvent).getKey();
+
+        setMockTrustSignalsData(null);
+        setMockTrustSignalsEventData("fake_host", null);
+
+        // doReturn(mDummyMerchantTrustSignalsEvent)
+        coordinator.maybeDisplayMessage(
+                new MerchantTrustMessageContext(mMockGurl, mMockWebContents));
+
+        verify(mMockMerchantMessageScheduler, times(1))
+                .clear(eq(MessageClearReason.NAVIGATE_TO_DIFFERENT_DOMAIN));
+        verify(mMockMerchantMessageScheduler, never())
+                .schedule(any(PropertyModel.class), any(MerchantTrustMessageContext.class),
+                        eq((long) MerchantViewerConfig.DEFAULT_TRUST_SIGNALS_MESSAGE_DELAY
+                                        .getValue()),
+                        any(Callback.class));
+    }
+
+    @UiThreadTest
+    @SmallTest
     @Test
     public void testMaybeDisplayMessageWithScheduledMessage() {
         // Verify previous scheduled message is canceled.
         MerchantTrustSignalsCoordinator coordinator = getCoordinatorUnderTest();
-        doReturn(new MerchantTrustMessageContext("fake_host", mMockWebContents))
+        doReturn(new MerchantTrustMessageContext(mMockGurl, mMockWebContents))
                 .when(mMockMerchantMessageScheduler)
                 .getScheduledMessageContext();
 
         coordinator.maybeDisplayMessage(
-                new MerchantTrustMessageContext("fake_host", mMockWebContents));
+                new MerchantTrustMessageContext(mMockGurl, mMockWebContents));
 
         verify(mMockMerchantMessageScheduler, times(1))
-                .clear(eq(MessageClearReason.NAVIGATE_TO_SAME_DOMAIN));
-
-        // TODO: validate PropertyModel once it's populated.
-        verify(mMockMerchantMessageScheduler, times(1))
-                .schedule(any(PropertyModel.class), any(MerchantTrustMessageContext.class),
-                        eq(MerchantTrustMessageScheduler.MESSAGE_ENQUEUE_NO_DELAY));
+                .expedite(mOnMessageEnqueuedCallbackCaptor.capture());
     }
 
+    @UiThreadTest
+    @SmallTest
     @Test
-    public void testMaybeDisplayMessageWithScheduledMessageDifferentHost() {
-        // Verify previous scheduled message is canceled.
+    public void testMaybeDisplayMessageWithScheduledMessageForDifferentHost() {
         MerchantTrustSignalsCoordinator coordinator = getCoordinatorUnderTest();
-        doReturn(new MerchantTrustMessageContext("different_host", mMockWebContents))
+        doReturn(new MerchantTrustMessageContext(mMockGurl2, mMockWebContents))
                 .when(mMockMerchantMessageScheduler)
                 .getScheduledMessageContext();
 
+        setMockTrustSignalsData(mDummyMerchantTrustSignals);
+        setMockTrustSignalsEventData("fake_host", null);
         coordinator.maybeDisplayMessage(
-                new MerchantTrustMessageContext("fake_host", mMockWebContents));
+                new MerchantTrustMessageContext(mMockGurl, mMockWebContents));
 
         verify(mMockMerchantMessageScheduler, times(1))
                 .clear(eq(MessageClearReason.NAVIGATE_TO_DIFFERENT_DOMAIN));
 
-        // TODO: validate PropertyModel once it's populated.
         verify(mMockMerchantMessageScheduler, times(1))
                 .schedule(any(PropertyModel.class), any(MerchantTrustMessageContext.class),
-                        eq(MerchantTrustSignalsCoordinator.MESSAGE_ENQUEUE_DELAY_MILLIS));
+                        eq((long) MerchantViewerConfig.DEFAULT_TRUST_SIGNALS_MESSAGE_DELAY
+                                        .getValue()),
+                        any(Callback.class));
     }
 
-    @Test
-    public void testOnMessageTapped() {
-        MerchantTrustSignalsCoordinator coordinator = getCoordinatorUnderTest();
-        coordinator.onMessageTapped();
-        verify(mMockMetrics, times(1)).recordMetricsForMessageTapped();
-    }
-
+    @SmallTest
     @Test
     public void testOnMessageDismissed() {
         MerchantTrustSignalsCoordinator coordinator = getCoordinatorUnderTest();
@@ -164,9 +316,36 @@
         verify(mMockMetrics, times(1)).recordMetricsForMessageDismissed(eq(DismissReason.TIMER));
     }
 
+    private void setMockTrustSignalsData(MerchantTrustSignals trustSignalsData) {
+        doAnswer(new Answer<Void>() {
+            @Override
+            public Void answer(InvocationOnMock invocation) {
+                Callback callback = (Callback) invocation.getArguments()[1];
+                callback.onResult(trustSignalsData);
+                return null;
+            }
+        })
+                .when(mMockMerchantTrustDataProvider)
+                .getDataForUrl(any(GURL.class), any(Callback.class));
+    }
+
+    private void setMockTrustSignalsEventData(String hostname, MerchantTrustSignalsEvent event) {
+        doAnswer(new Answer<Void>() {
+            @Override
+            public Void answer(InvocationOnMock invocation) {
+                Callback callback = (Callback) invocation.getArguments()[1];
+                callback.onResult(event);
+                return null;
+            }
+        })
+                .when(mMockMerchantTrustStorage)
+                .load(eq(hostname), any(Callback.class));
+    }
+
     private MerchantTrustSignalsCoordinator getCoordinatorUnderTest() {
         return new MerchantTrustSignalsCoordinator(mMockContext, mMockWindowAndroid,
                 mMockBottomSheetController, mMockDecorView, mMockTabModelSelector,
-                mMockMerchantMessageScheduler, mMockTabProvider, mMockMetrics);
+                mMockMerchantMessageScheduler, mMockTabProvider, mMockMerchantTrustDataProvider,
+                mMockMerchantTrustStorage, mMockMetrics);
     }
 }
\ No newline at end of file
diff --git a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsDataProviderTest.java b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsDataProviderTest.java
new file mode 100644
index 0000000..3fcd38f
--- /dev/null
+++ b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsDataProviderTest.java
@@ -0,0 +1,166 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// 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.merchant_viewer;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+
+import com.google.protobuf.ByteString;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.JniMocker;
+import org.chromium.chrome.browser.merchant_viewer.proto.MerchantTrustSignalsOuterClass.MerchantTrustSignals;
+import org.chromium.chrome.browser.optimization_guide.OptimizationGuideBridge;
+import org.chromium.chrome.browser.optimization_guide.OptimizationGuideBridge.OptimizationGuideCallback;
+import org.chromium.chrome.browser.optimization_guide.OptimizationGuideBridgeJni;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.components.optimization_guide.OptimizationGuideDecision;
+import org.chromium.components.optimization_guide.proto.CommonTypesProto.Any;
+import org.chromium.url.GURL;
+
+import java.util.concurrent.TimeoutException;
+/**
+ * Tests for {@link MerchantTrustSignalsDataProvider}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class MerchantTrustSignalsDataProviderTest {
+    @Rule
+    public TestRule mProcessor = new Features.JUnitProcessor();
+
+    @Mock
+    private GURL mMockDestinationGurl;
+
+    @Rule
+    public JniMocker mMocker = new JniMocker();
+
+    @Mock
+    private Profile mMockProfile;
+
+    @Mock
+    private OptimizationGuideBridge.Natives mMockOptimizationGuideBridgeJni;
+
+    static final MerchantTrustSignals FAKE_MERCHANT_TRUST_SIGNALS =
+            MerchantTrustSignals.newBuilder()
+                    .setMerchantStarRating(4.5f)
+                    .setMerchantCountRating(100)
+                    .setMerchantDetailsPageUrl("http://dummy/url")
+                    .build();
+
+    static final Any ANY_MERHCANT_TRUST_SIGNALS =
+            Any.newBuilder()
+                    .setValue(ByteString.copyFrom(FAKE_MERCHANT_TRUST_SIGNALS.toByteArray()))
+                    .build();
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mMocker.mock(OptimizationGuideBridgeJni.TEST_HOOKS, mMockOptimizationGuideBridgeJni);
+        doReturn(1L).when(mMockOptimizationGuideBridgeJni).init();
+        doReturn(false).when(mMockProfile).isOffTheRecord();
+        Profile.setLastUsedProfileForTesting(mMockProfile);
+    }
+
+    @Test
+    public void testGetDataForUrlNoMetadata() throws TimeoutException {
+        MerchantTrustSignalsDataProvider instance = getDataProvider();
+
+        MerchantTrustSignalsCallbackHelper callbackHelper =
+                new MerchantTrustSignalsCallbackHelper();
+
+        int callCount = callbackHelper.getCallCount();
+        mockOptimizationGuideResponse(mMockOptimizationGuideBridgeJni,
+                OptimizationGuideDecision.FALSE, ANY_MERHCANT_TRUST_SIGNALS);
+        instance.getDataForUrl(mMockDestinationGurl, callbackHelper::notifyCalled);
+        callbackHelper.waitForCallback(callCount);
+        Assert.assertNull(callbackHelper.getMerchantTrustSignalsResult());
+    }
+
+    @Test
+    public void testGetDataForUrlNullMetadata() throws TimeoutException {
+        MerchantTrustSignalsDataProvider instance = getDataProvider();
+
+        MerchantTrustSignalsCallbackHelper callbackHelper =
+                new MerchantTrustSignalsCallbackHelper();
+
+        int callCount = callbackHelper.getCallCount();
+        mockOptimizationGuideResponse(
+                mMockOptimizationGuideBridgeJni, OptimizationGuideDecision.TRUE, null);
+        instance.getDataForUrl(mMockDestinationGurl, callbackHelper::notifyCalled);
+        callbackHelper.waitForCallback(callCount);
+        Assert.assertNull(callbackHelper.getMerchantTrustSignalsResult());
+    }
+
+    @Test
+    public void testGetDataForUrlInvalidMetadata() throws TimeoutException {
+        MerchantTrustSignalsDataProvider instance = getDataProvider();
+
+        MerchantTrustSignalsCallbackHelper callbackHelper =
+                new MerchantTrustSignalsCallbackHelper();
+
+        int callCount = callbackHelper.getCallCount();
+        mockOptimizationGuideResponse(mMockOptimizationGuideBridgeJni,
+                OptimizationGuideDecision.TRUE, Any.getDefaultInstance());
+        instance.getDataForUrl(mMockDestinationGurl, callbackHelper::notifyCalled);
+        callbackHelper.waitForCallback(callCount);
+        Assert.assertNull(callbackHelper.getMerchantTrustSignalsResult());
+    }
+
+    @Test
+    public void testGetDataForUrlValid() throws TimeoutException {
+        MerchantTrustSignalsDataProvider instance = getDataProvider();
+
+        MerchantTrustSignalsCallbackHelper callbackHelper =
+                new MerchantTrustSignalsCallbackHelper();
+
+        int callCount = callbackHelper.getCallCount();
+        mockOptimizationGuideResponse(mMockOptimizationGuideBridgeJni,
+                OptimizationGuideDecision.TRUE, ANY_MERHCANT_TRUST_SIGNALS);
+        instance.getDataForUrl(mMockDestinationGurl, callbackHelper::notifyCalled);
+        callbackHelper.waitForCallback(callCount);
+
+        MerchantTrustSignals result = callbackHelper.getMerchantTrustSignalsResult();
+        Assert.assertNotNull(result);
+        Assert.assertEquals(4.5f, result.getMerchantStarRating(), 0.0f);
+        Assert.assertEquals(100, result.getMerchantCountRating());
+        Assert.assertEquals("http://dummy/url", result.getMerchantDetailsPageUrl());
+    }
+
+    static void mockOptimizationGuideResponse(OptimizationGuideBridge.Natives optimizationGuideJni,
+            @OptimizationGuideDecision int decision, Any metadata) {
+        doAnswer(new Answer<Void>() {
+            @Override
+            public Void answer(InvocationOnMock invocation) {
+                OptimizationGuideCallback callback =
+                        (OptimizationGuideCallback) invocation.getArguments()[3];
+                callback.onOptimizationGuideDecision(decision, metadata);
+                return null;
+            }
+        })
+                .when(optimizationGuideJni)
+                .canApplyOptimization(
+                        anyLong(), any(GURL.class), anyInt(), any(OptimizationGuideCallback.class));
+    }
+
+    private MerchantTrustSignalsDataProvider getDataProvider() {
+        return new MerchantTrustSignalsDataProvider();
+    }
+}
\ No newline at end of file
diff --git a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediatorTest.java b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediatorTest.java
index e2b98e04..f68449e 100644
--- a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediatorTest.java
+++ b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsMediatorTest.java
@@ -198,6 +198,20 @@
         verify(mMockDelegate, never()).maybeDisplayMessage(any(MerchantTrustMessageContext.class));
     }
 
+    @Test
+    public void testInitialTabSelection() {
+        doReturn(mMockPrimaryTab).when(mMockTabModelSelector).getCurrentTab();
+        MerchantTrustSignalsMediator mediator = getMediatorUnderTest(null);
+        verify(mMockWebContents, times(1)).addObserver(mWebContentsObserver.capture());
+    }
+
+    @Test
+    public void testInitialTabEmpty() {
+        doReturn(null).when(mMockTabModelSelector).getCurrentTab();
+        MerchantTrustSignalsMediator mediator = getMediatorUnderTest(null);
+        verify(mMockWebContents, never()).addObserver(mWebContentsObserver.capture());
+    }
+
     private MerchantTrustSignalsMediator getMediatorUnderTest(TabImpl tabToSelect) {
         MerchantTrustSignalsMediator mediator =
                 new MerchantTrustSignalsMediator(mMockTabModelSelector, mMockDelegate);
diff --git a/chrome/browser/commerce/merchant_viewer/proto/merchant_trust_signals.proto b/chrome/browser/commerce/merchant_viewer/proto/merchant_trust_signals.proto
index 19ca11e..871062e 100644
--- a/chrome/browser/commerce/merchant_viewer/proto/merchant_trust_signals.proto
+++ b/chrome/browser/commerce/merchant_viewer/proto/merchant_trust_signals.proto
@@ -4,9 +4,9 @@
 
 syntax = "proto2";
 
-package org.chromium.chrome.browser.merchant_viewer;
-
-option java_package = "org.chromium.chrome.browser.merchant_viewer";
+package org.chromium.chrome.browser.merchant_viewer.proto;
+option optimize_for = LITE_RUNTIME;
+option java_package = "org.chromium.chrome.browser.merchant_viewer.proto";
 
 message MerchantTrustSignals {
   // Overall rating out of 5.
diff --git a/chrome/browser/content_creation/notes/internal/BUILD.gn b/chrome/browser/content_creation/notes/internal/BUILD.gn
index f3bd411a..1310f25 100644
--- a/chrome/browser/content_creation/notes/internal/BUILD.gn
+++ b/chrome/browser/content_creation/notes/internal/BUILD.gn
@@ -12,4 +12,12 @@
     "//components/content_creation/notes/core",
     "//components/keyed_service/core",
   ]
+
+  if (is_android) {
+    sources += [ "android/note_service_bridge_factory.cc" ]
+
+    deps += [
+      "//chrome/browser/content_creation/notes/internal/android:jni_headers",
+    ]
+  }
 }
diff --git a/chrome/browser/content_creation/notes/internal/android/BUILD.gn b/chrome/browser/content_creation/notes/internal/android/BUILD.gn
new file mode 100644
index 0000000..e7018d73
--- /dev/null
+++ b/chrome/browser/content_creation/notes/internal/android/BUILD.gn
@@ -0,0 +1,33 @@
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/config.gni")
+import("//build/config/android/rules.gni")
+
+android_library("java") {
+  visibility = [
+    ":*",
+    "//chrome/android:chrome_all_java",
+  ]
+
+  sources = [ "android/java/src/org/chromium/chrome/browser/content_creation/notes/NoteServiceFactory.java" ]
+
+  deps = [
+    "//base:base_java",
+    "//chrome/browser/profiles/android:java",
+    "//components/content_creation/notes/android:java",
+  ]
+
+  resources_package = "org.chromium.chrome.browser.content_creation.notes"
+  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+}
+
+generate_jni("jni_headers") {
+  visibility = [
+    ":*",
+    "//chrome/browser",
+  ]
+
+  sources = [ "android/java/src/org/chromium/chrome/browser/content_creation/notes/NoteServiceFactory.java" ]
+}
diff --git a/chrome/browser/content_creation/notes/internal/android/java/src/org/chromium/chrome/browser/content_creation/notes/NoteServiceFactory.java b/chrome/browser/content_creation/notes/internal/android/java/src/org/chromium/chrome/browser/content_creation/notes/NoteServiceFactory.java
new file mode 100644
index 0000000..be4432e
--- /dev/null
+++ b/chrome/browser/content_creation/notes/internal/android/java/src/org/chromium/chrome/browser/content_creation/notes/NoteServiceFactory.java
@@ -0,0 +1,27 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// 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.content_creation.notes;
+
+import org.chromium.base.annotations.NativeMethods;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.components.content_creation.notes.NoteService;
+
+/**
+ * Basic factory that creates and returns a {@link NoteService} that is
+ * attached natively to the given {@link Profile}.
+ */
+public class NoteServiceFactory {
+    /**
+     * Used to get access to the note service backend.
+     */
+    public static NoteService getForProfile(Profile profile) {
+        return NoteServiceFactoryJni.get().getForProfile(profile);
+    }
+
+    @NativeMethods
+    interface Natives {
+        NoteService getForProfile(Profile profile);
+    }
+}
\ No newline at end of file
diff --git a/chrome/browser/content_creation/notes/internal/android/note_service_bridge_factory.cc b/chrome/browser/content_creation/notes/internal/android/note_service_bridge_factory.cc
new file mode 100644
index 0000000..7ceaaf74
--- /dev/null
+++ b/chrome/browser/content_creation/notes/internal/android/note_service_bridge_factory.cc
@@ -0,0 +1,30 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// 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/content_creation/internal/jni_headers/NoteServiceFactory_jni.h"
+#include "chrome/browser/content_creation/internal/note_service_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_android.h"
+#include "chrome/browser/profiles/profile_key.h"
+#include "components/content_creation/notes/android/note_service_bridge.h"
+
+// Takes a Java Profile and returns a Java NoteService.
+static base::android::ScopedJavaLocalRef<jobject>
+JNI_NoteServiceFactory_GetForProfile(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& j_profile) {
+  Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
+  ProfileKey* profile_key = profile->GetProfileKey();
+
+  // Return null if there is no reasonable context for the provided Java
+  // profile.
+  if (profile_key == nullptr)
+    return base::android::ScopedJavaLocalRef<jobject>();
+
+  content_creation::NoteService* note_service =
+      NoteServiceFactory::GetInstance()->GetForKey(profile_key);
+  return content_creation::NoteServiceBridge::GetBridgeForNoteService(
+      note_service);
+}
diff --git a/chrome/browser/extensions/api/tabs/tabs_test.cc b/chrome/browser/extensions/api/tabs/tabs_test.cc
index d681c36..fb329f4 100644
--- a/chrome/browser/extensions/api/tabs/tabs_test.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_test.cc
@@ -10,6 +10,7 @@
 #include <string>
 
 #include "apps/test/app_window_waiter.h"
+#include "base/format_macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/strings/pattern.h"
diff --git a/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc b/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc
index 1b241b39..fa8aef7d 100644
--- a/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc
+++ b/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc
@@ -446,7 +446,7 @@
       return;
     }
 
-    if (HasPersistedPermission()) {
+    if (HasPersistedPermission() || AncestorHasPersistedPermission()) {
       // TODO(https://crbug.com/1197304): Add histogram loggging to see how old
       // the persisted permission was when we use it to auto-grant.
       SetStatus(PermissionStatus::GRANTED,
@@ -548,6 +548,16 @@
   }
 
   bool HasPersistedPermission() const { return HasPersistedPermission(type_); }
+  bool AncestorHasPersistedPermission() const {
+    for (base::FilePath parent = path_.DirName(); parent != parent.DirName();
+         parent = parent.DirName()) {
+      if (context_->HasPersistedPermission(origin_, parent,
+                                           HandleType::kDirectory, type_)) {
+        return true;
+      }
+    }
+    return false;
+  }
 
   const url::Origin& origin() const {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -779,8 +789,6 @@
   // operator[] might insert a new OriginState in |origins_|, but that
   // is exactly what we want.
   auto& origin_state = origins_[origin];
-  // TODO(https://crbug.com/984772): If a parent directory is already
-  // readable this newly returned grant should also be readable.
   auto*& existing_grant = origin_state.read_grants[path];
   scoped_refptr<PermissionGrantImpl> new_grant;
 
@@ -810,6 +818,15 @@
           PersistedPermissionOptions::kDoNotUpdatePersistedPermission);
       break;
     case CONTENT_SETTING_ASK:
+      // If a parent directory is already readable this new grant should also be
+      // readable.
+      if (new_grant &&
+          AncestorHasActivePermission(origin, path, GrantType::kRead)) {
+        existing_grant->SetStatus(
+            PermissionStatus::GRANTED,
+            PersistedPermissionOptions::kUpdatePersistedPermission);
+        break;
+      }
       switch (user_action) {
         case UserAction::kOpen:
         case UserAction::kSave:
@@ -822,7 +839,6 @@
           existing_grant->SetStatus(
               PermissionStatus::GRANTED,
               PersistedPermissionOptions::kUpdatePersistedPermission);
-          ScheduleUsageIconUpdate();
           break;
         case UserAction::kLoadFromStorage:
           break;
@@ -845,6 +861,9 @@
       break;
   }
 
+  if (existing_grant->GetStatus() == PermissionStatus::GRANTED)
+    ScheduleUsageIconUpdate();
+
   return existing_grant;
 }
 
@@ -858,8 +877,6 @@
   // operator[] might insert a new OriginState in |origins_|, but that
   // is exactly what we want.
   auto& origin_state = origins_[origin];
-  // TODO(https://crbug.com/984772): If a parent directory is already
-  // writable this newly returned grant should also be writable.
   auto*& existing_grant = origin_state.write_grants[path];
   scoped_refptr<PermissionGrantImpl> new_grant;
 
@@ -889,13 +906,21 @@
           PersistedPermissionOptions::kDoNotUpdatePersistedPermission);
       break;
     case CONTENT_SETTING_ASK:
+      // If a parent directory is already writable this new grant should also be
+      // writable.
+      if (new_grant &&
+          AncestorHasActivePermission(origin, path, GrantType::kWrite)) {
+        existing_grant->SetStatus(
+            PermissionStatus::GRANTED,
+            PersistedPermissionOptions::kUpdatePersistedPermission);
+        break;
+      }
       switch (user_action) {
         case UserAction::kSave:
           // Only automatically grant write access for save dialogs.
           existing_grant->SetStatus(
               PermissionStatus::GRANTED,
               PersistedPermissionOptions::kUpdatePersistedPermission);
-          ScheduleUsageIconUpdate();
           break;
         case UserAction::kOpen:
         case UserAction::kDragAndDrop:
@@ -920,6 +945,9 @@
       break;
   }
 
+  if (existing_grant->GetStatus() == PermissionStatus::GRANTED)
+    ScheduleUsageIconUpdate();
+
   return existing_grant;
 }
 
@@ -1336,6 +1364,31 @@
 #endif
 }
 
+bool ChromeFileSystemAccessPermissionContext::AncestorHasActivePermission(
+    const url::Origin& origin,
+    const base::FilePath& path,
+    GrantType grant_type) {
+  auto it = origins_.find(origin);
+  if (it == origins_.end())
+    return false;
+  const auto& relevant_grants = grant_type == GrantType::kWrite
+                                    ? it->second.write_grants
+                                    : it->second.read_grants;
+  if (relevant_grants.empty())
+    return false;
+
+  // Permissions are inherited from the closest ancestor.
+  for (base::FilePath parent = path.DirName(); parent != parent.DirName();
+       parent = parent.DirName()) {
+    auto i = relevant_grants.find(parent);
+    if (i != relevant_grants.end() && i->second &&
+        i->second->GetStatus() == PermissionStatus::GRANTED) {
+      return true;
+    }
+  }
+  return false;
+}
+
 bool ChromeFileSystemAccessPermissionContext::OriginIsInstalledPWA(
     const url::Origin& origin) {
   return DoesOriginContainAnyInstalledWebApp(profile_, origin.GetURL());
diff --git a/chrome/browser/file_system_access/chrome_file_system_access_permission_context.h b/chrome/browser/file_system_access/chrome_file_system_access_permission_context.h
index 39c5d932..f1d77db 100644
--- a/chrome/browser/file_system_access/chrome_file_system_access_permission_context.h
+++ b/chrome/browser/file_system_access/chrome_file_system_access_permission_context.h
@@ -213,6 +213,9 @@
                                           const base::Value& grant,
                                           bool is_installed_pwa);
 
+  bool AncestorHasActivePermission(const url::Origin& origin,
+                                   const base::FilePath& path,
+                                   GrantType grant_type);
   base::Optional<base::Value> GetPersistedPermission(
       const url::Origin& origin,
       const base::FilePath& path);
diff --git a/chrome/browser/file_system_access/chrome_file_system_access_permission_context_unittest.cc b/chrome/browser/file_system_access/chrome_file_system_access_permission_context_unittest.cc
index 10abb88..578b8a3c 100644
--- a/chrome/browser/file_system_access/chrome_file_system_access_permission_context_unittest.cc
+++ b/chrome/browser/file_system_access/chrome_file_system_access_permission_context_unittest.cc
@@ -989,6 +989,222 @@
 }
 
 TEST_F(ChromeFileSystemAccessPermissionContextTest,
+       GetReadPermissionGrant_InheritFromAncestor) {
+  FileSystemAccessPermissionRequestManager::FromWebContents(web_contents_.get())
+      ->set_auto_response_for_test(PermissionAction::GRANTED);
+
+  auto dir_grant = permission_context()->GetReadPermissionGrant(
+      kTestOrigin, kTestPath, HandleType::kDirectory, UserAction::kOpen);
+  EXPECT_EQ(PermissionStatus::ASK, dir_grant->GetStatus());
+  base::RunLoop loop;
+  dir_grant->RequestPermission(
+      frame_id(), UserActivationState::kNotRequired,
+      base::BindLambdaForTesting([&](PermissionRequestOutcome outcome) {
+        EXPECT_EQ(PermissionRequestOutcome::kUserGranted, outcome);
+        loop.Quit();
+      }));
+  loop.Run();
+  EXPECT_EQ(PermissionStatus::GRANTED, dir_grant->GetStatus());
+  EXPECT_TRUE(permission_context_->HasPersistedPermissionForTesting(
+      kTestOrigin, kTestPath, HandleType::kDirectory, GrantType::kRead));
+
+  // A file in |dir_path|'s directory should be auto-granted permissions.
+  auto file_path = kTestPath.AppendASCII("baz");
+  auto file_grant = permission_context()->GetReadPermissionGrant(
+      kTestOrigin, file_path, HandleType::kFile, UserAction::kLoadFromStorage);
+  EXPECT_EQ(PermissionStatus::GRANTED, file_grant->GetStatus());
+  EXPECT_TRUE(permission_context_->HasPersistedPermissionForTesting(
+      kTestOrigin, file_path, HandleType::kFile, GrantType::kRead));
+}
+
+TEST_F(ChromeFileSystemAccessPermissionContextTest,
+       GetWritePermissionGrant_InheritFromAncestor) {
+  FileSystemAccessPermissionRequestManager::FromWebContents(web_contents_.get())
+      ->set_auto_response_for_test(PermissionAction::GRANTED);
+
+  auto dir_grant = permission_context()->GetWritePermissionGrant(
+      kTestOrigin, kTestPath, HandleType::kDirectory, UserAction::kOpen);
+  EXPECT_EQ(PermissionStatus::ASK, dir_grant->GetStatus());
+  base::RunLoop loop;
+  dir_grant->RequestPermission(
+      frame_id(), UserActivationState::kNotRequired,
+      base::BindLambdaForTesting([&](PermissionRequestOutcome outcome) {
+        EXPECT_EQ(PermissionRequestOutcome::kUserGranted, outcome);
+        loop.Quit();
+      }));
+  loop.Run();
+  EXPECT_EQ(PermissionStatus::GRANTED, dir_grant->GetStatus());
+  EXPECT_TRUE(permission_context_->HasPersistedPermissionForTesting(
+      kTestOrigin, kTestPath, HandleType::kDirectory, GrantType::kWrite));
+
+  // A file in |dir_path|'s directory should be auto-granted permissions.
+  auto file_path = kTestPath.AppendASCII("baz");
+  auto file_grant = permission_context()->GetWritePermissionGrant(
+      kTestOrigin, file_path, HandleType::kFile, UserAction::kLoadFromStorage);
+  EXPECT_EQ(PermissionStatus::GRANTED, file_grant->GetStatus());
+  EXPECT_TRUE(permission_context_->HasPersistedPermissionForTesting(
+      kTestOrigin, file_path, HandleType::kFile, GrantType::kWrite));
+}
+
+TEST_F(ChromeFileSystemAccessPermissionContextTest,
+       DoNotInheritFromAncestorOfOppositeType) {
+  FileSystemAccessPermissionRequestManager::FromWebContents(web_contents_.get())
+      ->set_auto_response_for_test(PermissionAction::GRANTED);
+
+  auto dir_grant = permission_context()->GetReadPermissionGrant(
+      kTestOrigin, kTestPath, HandleType::kDirectory, UserAction::kOpen);
+  EXPECT_EQ(PermissionStatus::ASK, dir_grant->GetStatus());
+  base::RunLoop loop;
+  dir_grant->RequestPermission(
+      frame_id(), UserActivationState::kNotRequired,
+      base::BindLambdaForTesting([&](PermissionRequestOutcome outcome) {
+        EXPECT_EQ(PermissionRequestOutcome::kUserGranted, outcome);
+        loop.Quit();
+      }));
+  loop.Run();
+  EXPECT_EQ(PermissionStatus::GRANTED, dir_grant->GetStatus());
+  EXPECT_TRUE(permission_context_->HasPersistedPermissionForTesting(
+      kTestOrigin, kTestPath, HandleType::kDirectory, GrantType::kRead));
+
+  // |dir_path| has read permission while we're asking for write permission, so
+  // do not auto-grant the permission.
+  auto file_path = kTestPath.AppendASCII("baz");
+  auto file_grant = permission_context()->GetWritePermissionGrant(
+      kTestOrigin, file_path, HandleType::kFile, UserAction::kLoadFromStorage);
+  EXPECT_EQ(PermissionStatus::ASK, file_grant->GetStatus());
+  EXPECT_FALSE(permission_context_->HasPersistedPermissionForTesting(
+      kTestOrigin, file_path, HandleType::kFile, GrantType::kWrite));
+}
+
+TEST_F(ChromeFileSystemAccessPermissionContextTest,
+       GetReadPermissionGrant_InheritFromPersistedAncestor) {
+  FileSystemAccessPermissionRequestManager::FromWebContents(web_contents_.get())
+      ->set_auto_response_for_test(PermissionAction::GRANTED);
+
+  auto dir_grant = permission_context()->GetReadPermissionGrant(
+      kTestOrigin, kTestPath, HandleType::kDirectory, UserAction::kOpen);
+  EXPECT_EQ(PermissionStatus::ASK, dir_grant->GetStatus());
+  base::RunLoop loop;
+  dir_grant->RequestPermission(
+      frame_id(), UserActivationState::kNotRequired,
+      base::BindLambdaForTesting([&](PermissionRequestOutcome outcome) {
+        EXPECT_EQ(PermissionRequestOutcome::kUserGranted, outcome);
+        loop.Quit();
+      }));
+  loop.Run();
+  EXPECT_EQ(PermissionStatus::GRANTED, dir_grant->GetStatus());
+  EXPECT_TRUE(permission_context_->HasPersistedPermissionForTesting(
+      kTestOrigin, kTestPath, HandleType::kDirectory, GrantType::kRead));
+
+  // Remove the active grant, but not the persisted permission.
+  dir_grant.reset();
+
+  // A file in |dir_path|'s directory should not be granted permission until
+  // permission is explicitly requested.
+  auto file_path = kTestPath.AppendASCII("baz");
+  auto file_grant = permission_context()->GetReadPermissionGrant(
+      kTestOrigin, file_path, HandleType::kFile, UserAction::kLoadFromStorage);
+  EXPECT_EQ(PermissionStatus::ASK, file_grant->GetStatus());
+  base::RunLoop loop2;
+  file_grant->RequestPermission(
+      frame_id(), UserActivationState::kNotRequired,
+      base::BindLambdaForTesting([&](PermissionRequestOutcome outcome) {
+        EXPECT_EQ(PermissionRequestOutcome::kGrantedByPersistentPermission,
+                  outcome);
+        loop2.Quit();
+      }));
+  loop2.Run();
+  EXPECT_EQ(PermissionStatus::GRANTED, file_grant->GetStatus());
+  EXPECT_TRUE(permission_context_->HasPersistedPermissionForTesting(
+      kTestOrigin, file_path, HandleType::kFile, GrantType::kRead));
+}
+
+TEST_F(ChromeFileSystemAccessPermissionContextTest,
+       GetWritePermissionGrant_InheritFromPersistedAncestor) {
+  FileSystemAccessPermissionRequestManager::FromWebContents(web_contents_.get())
+      ->set_auto_response_for_test(PermissionAction::GRANTED);
+
+  auto dir_grant = permission_context()->GetWritePermissionGrant(
+      kTestOrigin, kTestPath, HandleType::kDirectory, UserAction::kOpen);
+  EXPECT_EQ(PermissionStatus::ASK, dir_grant->GetStatus());
+  base::RunLoop loop;
+  dir_grant->RequestPermission(
+      frame_id(), UserActivationState::kNotRequired,
+      base::BindLambdaForTesting([&](PermissionRequestOutcome outcome) {
+        EXPECT_EQ(PermissionRequestOutcome::kUserGranted, outcome);
+        loop.Quit();
+      }));
+  loop.Run();
+  EXPECT_EQ(PermissionStatus::GRANTED, dir_grant->GetStatus());
+  EXPECT_TRUE(permission_context_->HasPersistedPermissionForTesting(
+      kTestOrigin, kTestPath, HandleType::kDirectory, GrantType::kWrite));
+
+  // Remove the active grant, but not the persisted permission.
+  dir_grant.reset();
+
+  // A file in |dir_path|'s directory should not be granted permission until
+  // permission is explicitly requested.
+  auto file_path = kTestPath.AppendASCII("baz");
+  auto file_grant = permission_context()->GetWritePermissionGrant(
+      kTestOrigin, file_path, HandleType::kFile, UserAction::kLoadFromStorage);
+  EXPECT_EQ(PermissionStatus::ASK, file_grant->GetStatus());
+  base::RunLoop loop2;
+  file_grant->RequestPermission(
+      frame_id(), UserActivationState::kNotRequired,
+      base::BindLambdaForTesting([&](PermissionRequestOutcome outcome) {
+        EXPECT_EQ(PermissionRequestOutcome::kGrantedByPersistentPermission,
+                  outcome);
+        loop2.Quit();
+      }));
+  loop2.Run();
+  EXPECT_EQ(PermissionStatus::GRANTED, file_grant->GetStatus());
+  EXPECT_TRUE(permission_context_->HasPersistedPermissionForTesting(
+      kTestOrigin, file_path, HandleType::kFile, GrantType::kWrite));
+}
+
+TEST_F(ChromeFileSystemAccessPermissionContextTest,
+       DoNotInheritFromPersistedAncestorOfOppositeType) {
+  FileSystemAccessPermissionRequestManager::FromWebContents(web_contents_.get())
+      ->set_auto_response_for_test(PermissionAction::GRANTED);
+
+  auto dir_grant = permission_context()->GetReadPermissionGrant(
+      kTestOrigin, kTestPath, HandleType::kDirectory, UserAction::kOpen);
+  EXPECT_EQ(PermissionStatus::ASK, dir_grant->GetStatus());
+  base::RunLoop loop;
+  dir_grant->RequestPermission(
+      frame_id(), UserActivationState::kNotRequired,
+      base::BindLambdaForTesting([&](PermissionRequestOutcome outcome) {
+        EXPECT_EQ(PermissionRequestOutcome::kUserGranted, outcome);
+        loop.Quit();
+      }));
+  loop.Run();
+  EXPECT_EQ(PermissionStatus::GRANTED, dir_grant->GetStatus());
+  EXPECT_TRUE(permission_context_->HasPersistedPermissionForTesting(
+      kTestOrigin, kTestPath, HandleType::kDirectory, GrantType::kRead));
+
+  // Remove the active grant, but not the persisted permission.
+  dir_grant.reset();
+
+  // |dir_path| has read permission while we're asking for write permission, so
+  // do not auto-grant the permission and do not grant via persisted permission.
+  auto file_path = kTestPath.AppendASCII("baz");
+  auto file_grant = permission_context()->GetWritePermissionGrant(
+      kTestOrigin, file_path, HandleType::kFile, UserAction::kLoadFromStorage);
+  EXPECT_EQ(PermissionStatus::ASK, file_grant->GetStatus());
+  base::RunLoop loop2;
+  file_grant->RequestPermission(
+      frame_id(), UserActivationState::kNotRequired,
+      base::BindLambdaForTesting([&](PermissionRequestOutcome outcome) {
+        EXPECT_EQ(PermissionRequestOutcome::kUserGranted, outcome);
+        loop2.Quit();
+      }));
+  loop2.Run();
+  EXPECT_EQ(PermissionStatus::GRANTED, file_grant->GetStatus());
+  EXPECT_TRUE(permission_context_->HasPersistedPermissionForTesting(
+      kTestOrigin, file_path, HandleType::kFile, GrantType::kWrite));
+}
+
+TEST_F(ChromeFileSystemAccessPermissionContextTest,
        PersistedPermission_GrantExpired) {
   auto grant = permission_context()->GetWritePermissionGrant(
       kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave);
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 83a35832..eeb02a758 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -4613,7 +4613,9 @@
 
 const char kLacrosSupportName[] = "Lacros support";
 const char kLacrosSupportDescription[] =
-    "Support for the experimental lacros-chrome browser.";
+    "Support for the experimental lacros-chrome browser. Please note that the "
+    "first restart can take some time to setup lacros-chrome. Please DO NOT "
+    "attempt to turn off the device during the restart.";
 
 const char kLimitAltTabToActiveDeskName[] =
     "Limit Alt-Tab windows to active desk";
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 358ad0e..84e403b 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -72,7 +72,7 @@
 // Array of features exposed through the Java ChromeFeatureList API. Entries in
 // this array may either refer to features defined in the header of this file or
 // in other locations in the code base (e.g. chrome/, components/, etc).
-const base::Feature* kFeaturesExposedToJava[] = {
+const base::Feature* const kFeaturesExposedToJava[] = {
     &autofill::features::kAutofillCreditCardAuthentication,
     &autofill::features::kAutofillDownstreamCvcPromptUseGooglePayLogo,
     &autofill::features::kAutofillEnablePasswordInfoBarAccountIndicationFooter,
diff --git a/chrome/browser/media/router/providers/cast/app_activity_unittest.cc b/chrome/browser/media/router/providers/cast/app_activity_unittest.cc
index 5d47e30..ae1656a1 100644
--- a/chrome/browser/media/router/providers/cast/app_activity_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/app_activity_unittest.cc
@@ -64,10 +64,8 @@
   MediaRoute& route() const { return activity_->route_; }
 
   MockCastSessionClient* AddMockClient(const std::string& client_id) {
-    CastMediaSource source("dummySourceId", std::vector<CastAppInfo>());
-    source.set_client_id(client_id);
-    activity_->AddClient(source, url::Origin(), tab_id_counter_++);
-    return MockCastSessionClient::instances().back();
+    return CastActivityTestBase::AddMockClient(activity_.get(), client_id,
+                                               tab_id_counter_++);
   }
 
   int tab_id_counter_ = 239;  // Arbitrary number.
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_manager.cc b/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
index d456996a..a2498a5 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
+++ b/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
@@ -205,9 +205,11 @@
   if (MediaSource(cast_source.source_id()).IsCastPresentationUrl()) {
     presentation_connection =
         activity_ptr->AddClient(cast_source, params.origin, tab_id);
-    activity_ptr->SendMessageToClient(
-        client_id,
-        CreateReceiverActionCastMessage(client_id, sink, hash_token_));
+    if (!client_id.empty()) {
+      activity_ptr->SendMessageToClient(
+          client_id,
+          CreateReceiverActionCastMessage(client_id, sink, hash_token_));
+    }
   }
 
   if (tab_id != -1) {
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_test_base.cc b/chrome/browser/media/router/providers/cast/cast_activity_test_base.cc
index dadb4c7..a192223 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_test_base.cc
+++ b/chrome/browser/media/router/providers/cast/cast_activity_test_base.cc
@@ -111,4 +111,14 @@
   return std::make_unique<MockCastSessionClient>(client_id, origin, tab_id);
 }
 
+MockCastSessionClient* CastActivityTestBase::AddMockClient(
+    CastActivity* activity,
+    const std::string& client_id,
+    int tab_id) {
+  CastMediaSource source("dummySourceId", std::vector<CastAppInfo>());
+  source.set_client_id(client_id);
+  activity->AddClient(source, url::Origin(), tab_id);
+  return MockCastSessionClient::instances().back();
+}
+
 }  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_test_base.h b/chrome/browser/media/router/providers/cast/cast_activity_test_base.h
index 4a29b6e..cc74733 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_test_base.h
+++ b/chrome/browser/media/router/providers/cast/cast_activity_test_base.h
@@ -97,6 +97,11 @@
       const url::Origin& origin,
       int tab_id) override;
 
+  // Adds a client to |activity| and returns a mock instance.
+  MockCastSessionClient* AddMockClient(CastActivity* activity,
+                                       const std::string& client_id,
+                                       int tab_id);
+
   // TODO(crbug.com/954797): Factor out members also present in
   // CastActivityManagerTest.
   content::BrowserTaskEnvironment task_environment_;
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity.cc b/chrome/browser/media/router/providers/cast/mirroring_activity.cc
index f67f8aff..7b8bfa84 100644
--- a/chrome/browser/media/router/providers/cast/mirroring_activity.cc
+++ b/chrome/browser/media/router/providers/cast/mirroring_activity.cc
@@ -265,16 +265,6 @@
                      weak_ptr_factory_.GetWeakPtr(), route().media_route_id()));
 }
 
-void MirroringActivity::SendMessageToClient(
-    const std::string& client_id,
-    blink::mojom::PresentationConnectionMessagePtr message) {
-  // A client exists if this is a site-initiated mirroring session. Given client
-  // ID is a Cast SDK concept, the client may not have an ID if it joined by
-  // directly using the Presentation API, and we wouldn't be able to distinguish
-  // them. We also do not expect the mirroring receiver to send any messages, so
-  // we drop them.
-}
-
 void MirroringActivity::OnAppMessage(
     const cast::channel::CastMessage& message) {
   if (!route_.is_local())
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity.h b/chrome/browser/media/router/providers/cast/mirroring_activity.h
index 2ca6b41..ca1c8fb4 100644
--- a/chrome/browser/media/router/providers/cast/mirroring_activity.h
+++ b/chrome/browser/media/router/providers/cast/mirroring_activity.h
@@ -64,9 +64,6 @@
   void Send(mirroring::mojom::CastMessagePtr message) override;
 
   // CastActivity implementation
-  void SendMessageToClient(
-      const std::string& client_id,
-      blink::mojom::PresentationConnectionMessagePtr message) override;
   void OnAppMessage(const cast::channel::CastMessage& message) override;
   void OnInternalMessage(const cast_channel::InternalMessage& message) override;
 
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity_unittest.cc b/chrome/browser/media/router/providers/cast/mirroring_activity_unittest.cc
index 40eac30..f822fcf 100644
--- a/chrome/browser/media/router/providers/cast/mirroring_activity_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/mirroring_activity_unittest.cc
@@ -17,6 +17,7 @@
 #include "components/mirroring/mojom/session_parameters.mojom.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "third_party/blink/public/mojom/presentation/presentation.mojom.h"
 
 using base::test::IsJson;
 using testing::_;
@@ -372,4 +373,21 @@
                   message_json.value())));
 }
 
+// Site-initiated mirroring activities must be able to send messages to the
+// client, which may be expecting to receive Cast protocol messages.
+// See crbug.com/1078481 for context.
+TEST_F(MirroringActivityTest, SendMessageToClient) {
+  MakeActivity();
+
+  static constexpr char kClientId[] = "theClientId";
+  blink::mojom::PresentationConnectionMessagePtr message =
+      blink::mojom::PresentationConnectionMessage::NewMessage("\"theMessage\"");
+  auto* message_ptr = message.get();
+  auto* client = AddMockClient(activity_.get(), kClientId, 1);
+  EXPECT_CALL(*client, SendMessageToClient).WillOnce([=](auto arg) {
+    EXPECT_EQ(message_ptr, arg.get());
+  });
+  activity_->SendMessageToClient(kClientId, std::move(message));
+}
+
 }  // namespace media_router
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index a5c98c2..8e5fd2a 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -2840,9 +2840,8 @@
   if (!entry)
     return false;
 
-  bool incognito = browser_context_->IsOffTheRecord();
   return qrcode_generator::QRCodeGeneratorBubbleController::
-      IsGeneratorAvailable(entry->GetURL(), incognito);
+      IsGeneratorAvailable(entry->GetURL());
 }
 
 void RenderViewContextMenu::AppendQRCodeGeneratorItem(bool for_image,
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.html b/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.html
index 7bc1e48..2183cc9 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.html
+++ b/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.html
@@ -94,20 +94,26 @@
         flex-direction: column;
       }
 
-      .bottom-buttons-container {
+      .buttons-common {
+        /* Always allocate height for buttons even a container is empty */
         min-height: var(--oobe-button-height);
+        z-index: 1;
+      }
+
+      :host([no-buttons]) .buttons-common {
+        display: none;
+      }
+
+      .bottom-buttons-container {
         padding-bottom: var(--oobe-adaptive-dialog-buttons-vertical-padding);
         padding-inline-end:
           var(--oobe-adaptive-dialog-buttons-horizontal-padding);
         padding-inline-start:
           var(--oobe-adaptive-dialog-buttons-horizontal-padding);
         padding-top: var(--oobe-adaptive-dialog-buttons-vertical-padding);
-        z-index: 1;
       }
 
       .back-button-container {
-        /* Always allocate height for buttons even a container is empty */
-        min-height: var(--oobe-button-height);
         padding-bottom:
           var(--oobe-adaptive-dialog-back-button-vertical-padding);
         padding-inline-end:
@@ -115,7 +121,6 @@
         padding-inline-start:
           var(--oobe-adaptive-dialog-back-button-horizontal-padding);
         padding-top: var(--oobe-adaptive-dialog-back-button-vertical-padding);
-        z-index: 1;
       }
 
       #oobe-icon-div ::slotted(hd-iron-icon),
@@ -127,7 +132,7 @@
     </style>
     <cr-lazy-render id="lazy">
       <template>
-        <div class="back-button-container">
+        <div class="buttons-common back-button-container">
           <slot name="back-navigation"></slot>
         </div>
         <div id="mainContainer" class="layout vertical flex">
@@ -138,7 +143,8 @@
             </div>
           </div>
         </div>
-        <div class="bottom-buttons-container vertical-mode-centering">
+        <div class="buttons-common bottom-buttons-container
+            vertical-mode-centering">
           <slot class="layout horizontal end-justified" name="bottom-buttons">
           </slot>
         </div>
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.js b/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.js
index 58dbcc1..f547b1c 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.js
+++ b/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog.js
@@ -9,6 +9,14 @@
 
   properties: {
     /**
+     * Supports dialog which is shown without buttons.
+     */
+    noButtons: {
+      type: Boolean,
+      value: false,
+    },
+
+    /**
      * If set, prevents lazy instantiation of the dialog.
      */
     noLazy: {
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog_old.js b/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog_old.js
index 16aa599..1552516c 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog_old.js
+++ b/chrome/browser/resources/chromeos/login/components/oobe_content_dialog/oobe_content_dialog_old.js
@@ -41,7 +41,7 @@
     },
 
     /**
-     * Supports loading dialog which is shown without buttons.
+     * Supports dialog which is shown without buttons.
      */
     noButtons: {
       type: Boolean,
diff --git a/chrome/browser/resources/chromeos/login/gaia_dialog.html b/chrome/browser/resources/chromeos/login/gaia_dialog.html
index 28c8b3b..6c8606b7 100644
--- a/chrome/browser/resources/chromeos/login/gaia_dialog.html
+++ b/chrome/browser/resources/chromeos/login/gaia_dialog.html
@@ -120,8 +120,7 @@
     <!-- As this dialog have pre-loading logic that require access to elements,
          dialog is marked as no-lazy. -->
     <oobe-content-dialog role="dialog" id="gaiaDialog"
-        has-buttons$="[[!isSamlSsoVisible]]"
-        no-footer-padding no-lazy>
+        no-buttons$="[[isSamlSsoVisible]]" no-footer-padding no-lazy>
       <div slot="content" id="signin-frame-container"
           hideshadows$="[[isPopUpOverlayVisible_]]"
           class="flex layout vertical">
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
index fcdf0ecd..eeb217c 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
@@ -48,6 +48,12 @@
   SAML_INTERSTITIAL: 'saml-interstitial',
 };
 
+/**
+ * Steps that could be the first one in the flow.
+ */
+const POSSIBLE_FIRST_SIGNIN_STEPS =
+    [DialogMode.GAIA, DialogMode.GAIA_LOADING, DialogMode.SAML_INTERSTITIAL];
+
 Polymer({
   is: 'gaia-signin-element',
 
@@ -350,8 +356,8 @@
    */
   isFirstSigninStep(uiStep, canGaiaGoBack, isSaml) {
     return !this.isClosable_() &&
-        (uiStep == DialogMode.GAIA || uiStep == DialogMode.GAIA_LOADING) &&
-        !canGaiaGoBack && !isSaml;
+        POSSIBLE_FIRST_SIGNIN_STEPS.includes(uiStep) && !canGaiaGoBack &&
+        !isSaml;
   },
 
   onIsFirstSigninStepChanged(isFirstSigninStep) {
diff --git a/chrome/browser/resources/new_tab_page/modules/modules.html b/chrome/browser/resources/new_tab_page/modules/modules.html
index 8ee4b27..e03ac22 100644
--- a/chrome/browser/resources/new_tab_page/modules/modules.html
+++ b/chrome/browser/resources/new_tab_page/modules/modules.html
@@ -16,7 +16,7 @@
   <ntp-module-wrapper module="[[item]]"
       on-dismiss-module="onDismissModule_"
       on-disable-module="onDisableModule_"
-      hidden="[[moduleDisabled_(item.id,
+      hidden="[[moduleDisabled_(item.descriptor.id,
                                 dismissedModules_.*,
                                 disabledModules_)]]">
   </ntp-module-wrapper>
diff --git a/chrome/browser/resources/read_later/read_later_item.js b/chrome/browser/resources/read_later/read_later_item.js
index 2f1baf5..265ad52 100644
--- a/chrome/browser/resources/read_later/read_later_item.js
+++ b/chrome/browser/resources/read_later/read_later_item.js
@@ -10,18 +10,26 @@
 import './icons.js';
 import './read_later_shared_style.js';
 
-import {MouseHoverableElement} from 'chrome://resources/cr_elements/mouse_hoverable_mixin.js';
+import {MouseHoverableMixin, MouseHoverableMixinInterface} from 'chrome://resources/cr_elements/mouse_hoverable_mixin.js';
 import {assertNotReached} from 'chrome://resources/js/assert.m.js';
 import {getFaviconForPageURL} from 'chrome://resources/js/icon.m.js';
-import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {ReadLaterApiProxy, ReadLaterApiProxyImpl} from './read_later_api_proxy.js';
 
 /** @type {!Set<string>} */
 const navigationKeys = new Set([' ', 'Enter', 'ArrowRight', 'ArrowLeft']);
 
+/**
+ * @constructor
+ * @extends PolymerElement
+ * @implements {MouseHoverableMixinInterface}
+ * @appliesMixin MouseHoverableMixin
+ */
+const ReadLaterItemElementBase = MouseHoverableMixin(PolymerElement);
+
 /** @polymer */
-export class ReadLaterItemElement extends MouseHoverableElement {
+export class ReadLaterItemElement extends ReadLaterItemElementBase {
   static get is() {
     return 'read-later-item';
   }
diff --git a/chrome/browser/resources/tab_search/tab_search_item.js b/chrome/browser/resources/tab_search/tab_search_item.js
index e7fe30d..bdb93fd 100644
--- a/chrome/browser/resources/tab_search/tab_search_item.js
+++ b/chrome/browser/resources/tab_search/tab_search_item.js
@@ -9,17 +9,25 @@
 import 'chrome://resources/cr_elements/shared_vars_css.m.js';
 import './strings.m.js';
 
-import {MouseHoverableElement} from 'chrome://resources/cr_elements/mouse_hoverable_mixin.js';
+import {MouseHoverableMixin, MouseHoverableMixinInterface} from 'chrome://resources/cr_elements/mouse_hoverable_mixin.js';
 import {getFaviconForPageURL} from 'chrome://resources/js/icon.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {highlight} from 'chrome://resources/js/search_highlight_utils.js';
-import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {ariaLabel, TabData, TabItemType} from './tab_data.js';
 import {Tab} from './tab_search.mojom-webui.js';
 
+/**
+ * @constructor
+ * @extends PolymerElement
+ * @implements {MouseHoverableMixinInterface}
+ * @appliesMixin MouseHoverableMixin
+ */
+const TabSearchItemBase = MouseHoverableMixin(PolymerElement);
+
 /** @polymer */
-export class TabSearchItem extends MouseHoverableElement {
+export class TabSearchItem extends TabSearchItemBase {
   static get is() {
     return 'tab-search-item';
   }
diff --git a/chrome/browser/signin/chrome_signin_helper.cc b/chrome/browser/signin/chrome_signin_helper.cc
index 7329555..db327750 100644
--- a/chrome/browser/signin/chrome_signin_helper.cc
+++ b/chrome/browser/signin/chrome_signin_helper.cc
@@ -32,6 +32,7 @@
 #include "chrome/browser/signin/header_modification_delegate_impl.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/signin/process_dice_header_delegate_impl.h"
+#include "chrome/browser/signin/signin_features.h"
 #include "chrome/browser/tab_contents/tab_util.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
@@ -93,6 +94,11 @@
 const void* const kRequestDestructionObserverUserDataKey =
     &kRequestDestructionObserverUserDataKey;
 
+const char kGoogleRemoveLocalAccountResponseHeader[] =
+    "Google-Accounts-RemoveLocalAccount";
+
+const char kRemoveLocalAccountObfuscatedIDAttrName[] = "obfuscatedid";
+
 // TODO(droger): Remove this delay when the Dice implementation is finished on
 // the server side.
 int g_dice_account_reconcilor_blocked_delay_ms = 1000;
@@ -506,6 +512,59 @@
 }
 #endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
 
+std::string ParseGaiaIdFromRemoveLocalAccountResponseHeader(
+    const net::HttpResponseHeaders* response_headers) {
+  if (!response_headers)
+    return std::string();
+
+  std::string header_value;
+  if (!response_headers->GetNormalizedHeader(
+          kGoogleRemoveLocalAccountResponseHeader, &header_value)) {
+    return std::string();
+  }
+
+  const SigninHeaderHelper::ResponseHeaderDictionary header_dictionary =
+      SigninHeaderHelper::ParseAccountConsistencyResponseHeader(header_value);
+
+  std::string gaia_id;
+  const auto it =
+      header_dictionary.find(kRemoveLocalAccountObfuscatedIDAttrName);
+  if (it != header_dictionary.end()) {
+    // The Gaia ID is wrapped in quotes.
+    base::TrimString(it->second, "\"", &gaia_id);
+  }
+  return gaia_id;
+}
+
+void ProcessRemoveLocalAccountResponseHeaderIfExists(ResponseAdapter* response,
+                                                     bool is_off_the_record) {
+  CHECK(gaia::IsGaiaSignonRealm(response->GetOrigin()));
+
+  if (is_off_the_record)
+    return;
+
+  const std::string gaia_id =
+      ParseGaiaIdFromRemoveLocalAccountResponseHeader(response->GetHeaders());
+
+  if (gaia_id.empty())
+    return;
+
+  content::WebContents* web_contents = response->GetWebContentsGetter().Run();
+  // The tab could have just closed. Technically, it would be possible to
+  // refactor the code to pass around the profile by other means, but this
+  // should be rare enough to be worth supporting.
+  if (!web_contents)
+    return;
+
+  Profile* profile =
+      Profile::FromBrowserContext(web_contents->GetBrowserContext());
+  DCHECK(!profile->IsOffTheRecord());
+
+  IdentityManagerFactory::GetForProfile(profile)
+      ->GetAccountsCookieMutator()
+      ->RemoveLoggedOutAccountByGaiaId(gaia_id);
+}
+
 }  // namespace
 
 ChromeRequestAdapter::ChromeRequestAdapter(
@@ -604,6 +663,16 @@
   // refresh token, on sign-out just follow the sign-out URL.
   ProcessDiceResponseHeaderIfExists(response, is_off_the_record);
 #endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
+
+  if (base::FeatureList::IsEnabled(kProcessGaiaRemoveLocalAccountHeader)) {
+    ProcessRemoveLocalAccountResponseHeaderIfExists(response,
+                                                    is_off_the_record);
+  }
+}
+
+std::string ParseGaiaIdFromRemoveLocalAccountResponseHeaderForTesting(
+    const net::HttpResponseHeaders* response_headers) {
+  return ParseGaiaIdFromRemoveLocalAccountResponseHeader(response_headers);
 }
 
 }  // namespace signin
diff --git a/chrome/browser/signin/chrome_signin_helper.h b/chrome/browser/signin/chrome_signin_helper.h
index 057d795..8bfb852 100644
--- a/chrome/browser/signin/chrome_signin_helper.h
+++ b/chrome/browser/signin/chrome_signin_helper.h
@@ -114,6 +114,12 @@
                                               const GURL& redirect_url,
                                               bool is_off_the_record);
 
+// Parses and returns an account ID (Gaia ID) from HTTP response header
+// Google-Accounts-RemoveLocalAccount. Returns an empty string if parsing
+// failed. Exposed for testing purposes.
+std::string ParseGaiaIdFromRemoveLocalAccountResponseHeaderForTesting(
+    const net::HttpResponseHeaders* response_headers);
+
 }  // namespace signin
 
 #endif  // CHROME_BROWSER_SIGNIN_CHROME_SIGNIN_HELPER_H_
diff --git a/chrome/browser/signin/chrome_signin_helper_unittest.cc b/chrome/browser/signin/chrome_signin_helper_unittest.cc
index 33b95df5..14f379c 100644
--- a/chrome/browser/signin/chrome_signin_helper_unittest.cc
+++ b/chrome/browser/signin/chrome_signin_helper_unittest.cc
@@ -157,3 +157,25 @@
       signin::kManageAccountsHeaderReceivedUserDataKey));
 }
 #endif  // BUILDFLAG(ENABLE_MIRROR) || BUILDFLAG(IS_CHROMEOS_ASH)
+
+TEST_F(ChromeSigninHelperTest,
+       ParseGaiaIdFromRemoveLocalAccountResponseHeader) {
+  EXPECT_EQ("123456",
+            signin::ParseGaiaIdFromRemoveLocalAccountResponseHeaderForTesting(
+                TestResponseAdapter("Google-Accounts-RemoveLocalAccount",
+                                    "obfuscatedid=\"123456\"",
+                                    /*is_main_frame=*/false)
+                    .GetHeaders()));
+  EXPECT_EQ("123456",
+            signin::ParseGaiaIdFromRemoveLocalAccountResponseHeaderForTesting(
+                TestResponseAdapter("Google-Accounts-RemoveLocalAccount",
+                                    "obfuscatedid=\"123456\",foo=\"bar\"",
+                                    /*is_main_frame=*/false)
+                    .GetHeaders()));
+  EXPECT_EQ(
+      "",
+      signin::ParseGaiaIdFromRemoveLocalAccountResponseHeaderForTesting(
+          TestResponseAdapter("Google-Accounts-RemoveLocalAccount", "malformed",
+                              /*is_main_frame=*/false)
+              .GetHeaders()));
+}
diff --git a/chrome/browser/signin/signin_features.cc b/chrome/browser/signin/signin_features.cc
index 04c9c495..290d7f1 100644
--- a/chrome/browser/signin/signin_features.cc
+++ b/chrome/browser/signin/signin_features.cc
@@ -8,3 +8,8 @@
 const base::Feature kDiceWebSigninInterceptionFeature{
     "DiceWebSigninInterception", base::FEATURE_DISABLED_BY_DEFAULT};
 #endif  // ENABLE_DICE_SUPPORT
+
+// Enables the client-side processing of the HTTP response header
+// Google-Accounts-RemoveLocalAccount.
+const base::Feature kProcessGaiaRemoveLocalAccountHeader{
+    "ProcessGaiaRemoveLocalAccountHeader", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chrome/browser/signin/signin_features.h b/chrome/browser/signin/signin_features.h
index 6b258b77..9b200fcd 100644
--- a/chrome/browser/signin/signin_features.h
+++ b/chrome/browser/signin/signin_features.h
@@ -12,4 +12,6 @@
 extern const base::Feature kDiceWebSigninInterceptionFeature;
 #endif  // ENABLE_DICE_SUPPORT
 
+extern const base::Feature kProcessGaiaRemoveLocalAccountHeader;
+
 #endif  // CHROME_BROWSER_SIGNIN_SIGNIN_FEATURES_H_
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index bf13fec5..4433cc6 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -3501,11 +3501,11 @@
       "autofill/payments/save_upi_bubble_controller.h",
       "autofill/payments/save_upi_bubble_controller_impl.cc",
       "autofill/payments/save_upi_bubble_controller_impl.h",
-      "autofill/save_address_profile_bubble_controller.h",
-      "autofill/save_address_profile_bubble_controller_impl.cc",
-      "autofill/save_address_profile_bubble_controller_impl.h",
       "autofill/save_address_profile_icon_controller.cc",
       "autofill/save_address_profile_icon_controller.h",
+      "autofill/save_update_address_profile_bubble_controller.h",
+      "autofill/save_update_address_profile_bubble_controller_impl.cc",
+      "autofill/save_update_address_profile_bubble_controller_impl.h",
       "bubble_anchor_util.h",
       "manifest_web_app_browser_controller.cc",
       "manifest_web_app_browser_controller.h",
diff --git a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutType.java b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutType.java
index f4d4cd0..212219b8 100644
--- a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutType.java
+++ b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutType.java
@@ -10,14 +10,16 @@
 import java.lang.annotation.RetentionPolicy;
 
 /**
- * The type info of the Layout.
+ * The type info of the Layout. These types are bit flags, so they can be or-ed together to test for
+ * multiple.
  */
 @IntDef({LayoutType.BROWSING, LayoutType.TAB_SWITCHER, LayoutType.TOOLBAR_SWIPE,
         LayoutType.SIMPLE_ANIMATION})
 @Retention(RetentionPolicy.SOURCE)
 public @interface LayoutType {
-    int BROWSING = 0;
-    int TAB_SWITCHER = 1;
-    int TOOLBAR_SWIPE = 2;
-    int SIMPLE_ANIMATION = 3;
+    int BROWSING = 1;
+    int TAB_SWITCHER = 2;
+    int TOOLBAR_SWIPE = 4;
+    int SIMPLE_ANIMATION = 8;
+    // Next layout type should be 16.
 }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java
index 9170055a..a32c11f2 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java
@@ -14,7 +14,6 @@
 import org.chromium.chrome.browser.layouts.CompositorModelChangeProcessor;
 import org.chromium.chrome.browser.layouts.EventFilter;
 import org.chromium.chrome.browser.layouts.LayoutManager;
-import org.chromium.chrome.browser.layouts.LayoutType;
 import org.chromium.chrome.browser.layouts.SceneOverlay;
 import org.chromium.chrome.browser.layouts.components.VirtualView;
 import org.chromium.chrome.browser.layouts.scene_layer.SceneOverlayLayer;
@@ -46,8 +45,8 @@
             ObservableSupplier<Tab> tabSupplier,
             BrowserControlsStateProvider browserControlsStateProvider,
             Supplier<ResourceManager> resourceManagerSupplier,
-            TopUiThemeColorProvider topUiThemeColorProvider,
-            @LayoutType int layoutToShowOn, boolean isVisibilityManuallyControlled) {
+            TopUiThemeColorProvider topUiThemeColorProvider, int layoutsToShowOn,
+            boolean isVisibilityManuallyControlled) {
         mModel = new PropertyModel.Builder(TopToolbarOverlayProperties.ALL_KEYS)
                          .with(TopToolbarOverlayProperties.RESOURCE_ID, R.id.control_container)
                          .with(TopToolbarOverlayProperties.URL_BAR_RESOURCE_ID,
@@ -65,7 +64,7 @@
 
         mMediator = new TopToolbarOverlayMediator(mModel, context, layoutManager,
                 progressInfoCallback, tabSupplier, browserControlsStateProvider,
-                topUiThemeColorProvider, layoutToShowOn, isVisibilityManuallyControlled);
+                topUiThemeColorProvider, layoutsToShowOn, isVisibilityManuallyControlled);
     }
 
     /**
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java
index b7ecf0763..2d199ee 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java
@@ -75,8 +75,8 @@
             Callback<ClipDrawableProgressBar.DrawingInfo> progressInfoCallback,
             ObservableSupplier<Tab> tabSupplier,
             BrowserControlsStateProvider browserControlsStateProvider,
-            TopUiThemeColorProvider topUiThemeColorProvider,
-            @LayoutType int layoutToShowOn, boolean manualVisibilityControl) {
+            TopUiThemeColorProvider topUiThemeColorProvider, int layoutsToShowOn,
+            boolean manualVisibilityControl) {
         mContext = context;
         mLayoutStateProvider = layoutStateProvider;
         mProgressInfoCallback = progressInfoCallback;
@@ -88,7 +88,7 @@
         mSceneChangeObserver = new LayoutStateObserver() {
             @Override
             public void onStartedShowing(@LayoutType int layout, boolean showToolbar) {
-                mIsOnValidLayout = layout == layoutToShowOn;
+                mIsOnValidLayout = (layout & layoutsToShowOn) > 0;
                 updateVisibility();
             }
         };
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.h b/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.h
index 4ed5278..ae45fef 100644
--- a/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.h
+++ b/chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.h
@@ -27,6 +27,7 @@
 class HoldingSpaceItem;
 class HoldingSpaceTestApi;
 
+// TODO(crbug.com/1202947): Remove deprecated methods.
 // Base class for holding space browser tests. Subclasses
 // SystemWebAppBrowserTestBase for the ability to test with the Media App, which
 // is the default handler for files opened from the holding space.
@@ -46,15 +47,19 @@
   // Returns the currently active profile.
   Profile* GetProfile();
 
+  // DEPRECATED: Use `test_api().Show()`.
   // Shows holding space UI. This is a no-op if it's already showing.
   void Show();
 
+  // DEPRECATED: Use `test_api().Close()`.
   // Closes holding space UI. This is a no-op if it's already closed.
   void Close();
 
+  // DEPRECATED: Use `test_api().IsShowing()`.
   // Returns true if holding space UI is showing, false otherwise.
   bool IsShowing();
 
+  // DEPRECATED: Use `test_api().IsShowingInShelf()`.
   // Returns true if the holding space tray is showing in the shelf, false
   // otherwise.
   bool IsShowingInShelf();
@@ -89,35 +94,45 @@
   base::FilePath CreateFile(
       const base::Optional<std::string>& extension = base::nullopt);
 
+  // DEPRECATED: Use `test_api().GetDownloadChips()`.
   // Returns the collection of download chips in holding space UI.
   // If holding space UI is not visible, an empty collection is returned.
   std::vector<views::View*> GetDownloadChips();
 
+  // DEPRECATED: Use `test_api().GetPinnedFileChips()`.
   // Returns the collection of pinned file chips in holding space UI.
   // If holding space UI is not visible, an empty collection is returned.
   std::vector<views::View*> GetPinnedFileChips();
 
+  // DEPRECATED: Use `test_api().GetScreenCaptureViews()`.
   // Returns the collection of screen capture views in holding space UI.
   // If holding space UI is not visible, an empty collection is returned.
   std::vector<views::View*> GetScreenCaptureViews();
 
+  // DEPRECATED: Use `test_api().GetTray()`.
   // Returns the holding space tray in the shelf.
   views::View* GetTray();
 
+  // DEPRECATED: Use `test_api().GetTrayDropTargetOverlay()`.
   // Returns the view drawn on top of the holding space tray to indicate that
   // it is a drop target capable of handling the current drag payload.
   views::View* GetTrayDropTargetOverlay();
 
+  // DEPRECATED: Use `test_api().Get[Default|Previews]TrayIcon()`.
   // Getter for the holding space tray icons in the shelf.
   views::View* GetDefaultTrayIcon();
   views::View* GetPreviewsTrayIcon();
 
+  // DEPRECATED: Use `test_api().RecentFilesBubbleShown()`.
   // Returns whether the recent files bubble is shown.
   bool RecentFilesBubbleShown() const;
 
   // Requests lock screen, waiting to return until session state is locked.
   void RequestAndAwaitLockScreen();
 
+  // Returns the holding space test API.
+  HoldingSpaceTestApi& test_api() { return *test_api_; }
+
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
   std::unique_ptr<HoldingSpaceTestApi> test_api_;
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc b/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc
index 3fb5130..4974410a 100644
--- a/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc
+++ b/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/ash/holding_space/holding_space_browsertest_base.h"
 
+#include <set>
 #include <unordered_map>
 #include <vector>
 
@@ -1008,22 +1009,27 @@
   observer.Observe(HoldingSpaceController::Get()->model());
 
   {
+    // Cache `item_id` of the download item to be removed.
+    const std::string item_id =
+        test_api().GetHoldingSpaceItemId(download_chips.front());
+    EXPECT_EQ(test_api().GetHoldingSpaceItemView(download_chips, item_id),
+              download_chips.front());
+
     base::RunLoop run_loop;
     EXPECT_CALL(mock, OnHoldingSpaceItemsRemoved)
         .WillOnce([&](const std::vector<const HoldingSpaceItem*>& items) {
           ASSERT_EQ(items.size(), 1u);
+          EXPECT_EQ(items[0]->id(), item_id);
           run_loop.Quit();
         });
 
-    const size_t download_chips_size = download_chips.size();
-
     // Press `ENTER` to remove the selected download item.
     PressAndReleaseKey(ui::KeyboardCode::VKEY_RETURN);
     run_loop.Run();
 
-    // Verify a download chip has been removed.
+    // Verify the download chip has been removed.
     download_chips = GetDownloadChips();
-    ASSERT_EQ(download_chips.size(), download_chips_size - 1);
+    EXPECT_FALSE(test_api().GetHoldingSpaceItemView(download_chips, item_id));
   }
 
   std::vector<views::View*> screen_capture_views = GetScreenCaptureViews();
@@ -1038,55 +1044,90 @@
   ASSERT_TRUE(SelectMenuItemWithCommandId(HoldingSpaceCommandId::kRemoveItem));
 
   {
+    // Cache `item_id` of the screen capture item to be removed.
+    const std::string item_id =
+        test_api().GetHoldingSpaceItemId(screen_capture_views.front());
+    EXPECT_EQ(test_api().GetHoldingSpaceItemView(screen_capture_views, item_id),
+              screen_capture_views.front());
+
     base::RunLoop run_loop;
     EXPECT_CALL(mock, OnHoldingSpaceItemsRemoved)
         .WillOnce([&](const std::vector<const HoldingSpaceItem*>& items) {
           ASSERT_EQ(items.size(), 1u);
+          EXPECT_EQ(items[0]->id(), item_id);
           run_loop.Quit();
         });
 
-    const size_t screen_capture_views_size = screen_capture_views.size();
-
     // Press `ENTER` to remove the selected screen capture item.
     PressAndReleaseKey(ui::KeyboardCode::VKEY_RETURN);
     run_loop.Run();
 
-    // Verify a screen capture view has been removed.
+    // Verify the screen capture view has been removed.
     screen_capture_views = GetScreenCaptureViews();
-    ASSERT_EQ(screen_capture_views.size(), screen_capture_views_size - 1);
+    EXPECT_FALSE(
+        test_api().GetHoldingSpaceItemView(screen_capture_views, item_id));
   }
 
-  // Select all download items.
-  for (views::View* download_chip : download_chips)
-    Click(download_chip, ui::EF_SHIFT_DOWN);
+  // Remove all items in the recent files bubble. Note that not all download
+  // items or screen capture items that exist may be visible at the same time
+  // due to max visibility count restrictions.
+  while (!download_chips.empty() || !screen_capture_views.empty()) {
+    // Select all visible download items.
+    for (views::View* download_chip : download_chips)
+      Click(download_chip, ui::EF_CONTROL_DOWN);
 
-  // Select all screen capture items.
-  for (views::View* screen_capture_view : screen_capture_views)
-    Click(screen_capture_view, ui::EF_SHIFT_DOWN);
+    // Select all visible screen capture items.
+    for (views::View* screen_capture_view : screen_capture_views)
+      Click(screen_capture_view, ui::EF_CONTROL_DOWN);
 
-  // Show the context menu. There should be a `kRemoveItem` command.
-  RightClick(download_chips.front());
-  ASSERT_TRUE(views::MenuController::GetActiveInstance());
-  ASSERT_TRUE(SelectMenuItemWithCommandId(HoldingSpaceCommandId::kRemoveItem));
+    // Show the context menu. There should be a `kRemoveItem` command.
+    RightClick(download_chips.size() ? download_chips.front()
+                                     : screen_capture_views.front());
+    ASSERT_TRUE(views::MenuController::GetActiveInstance());
+    ASSERT_TRUE(
+        SelectMenuItemWithCommandId(HoldingSpaceCommandId::kRemoveItem));
 
-  {
-    const size_t recent_files_size =
-        download_chips.size() + screen_capture_views.size();
+    {
+      // Cache `item_ids` of download and screen capture items to be removed.
+      std::set<std::string> item_ids;
+      for (const views::View* download_chip : download_chips) {
+        auto it =
+            item_ids.insert(test_api().GetHoldingSpaceItemId(download_chip));
+        EXPECT_EQ(test_api().GetHoldingSpaceItemView(download_chips, *it.first),
+                  download_chip);
+      }
+      for (const views::View* screen_capture_view : screen_capture_views) {
+        auto it = item_ids.insert(
+            test_api().GetHoldingSpaceItemId(screen_capture_view));
+        EXPECT_EQ(
+            test_api().GetHoldingSpaceItemView(screen_capture_views, *it.first),
+            screen_capture_view);
+      }
 
-    base::RunLoop run_loop;
-    EXPECT_CALL(mock, OnHoldingSpaceItemsRemoved)
-        .WillOnce([&](const std::vector<const HoldingSpaceItem*>& items) {
-          ASSERT_EQ(items.size(), recent_files_size);
-          run_loop.Quit();
-        });
+      base::RunLoop run_loop;
+      EXPECT_CALL(mock, OnHoldingSpaceItemsRemoved)
+          .WillOnce([&](const std::vector<const HoldingSpaceItem*>& items) {
+            ASSERT_EQ(items.size(), item_ids.size());
+            for (const HoldingSpaceItem* item : items)
+              ASSERT_TRUE(base::Contains(item_ids, item->id()));
+            run_loop.Quit();
+          });
 
-    // Press `ENTER` to remove the selected items.
-    PressAndReleaseKey(ui::KeyboardCode::VKEY_RETURN);
-    run_loop.Run();
+      // Press `ENTER` to remove the selected items.
+      PressAndReleaseKey(ui::KeyboardCode::VKEY_RETURN);
+      run_loop.Run();
 
-    // Verify all download chips and screen capture views have been removed.
-    ASSERT_EQ(GetDownloadChips().size(), 0u);
-    ASSERT_EQ(GetScreenCaptureViews().size(), 0u);
+      // Verify all previously visible download chips and screen capture views
+      // have been removed.
+      download_chips = GetDownloadChips();
+      screen_capture_views = GetScreenCaptureViews();
+      for (const std::string& item_id : item_ids) {
+        EXPECT_FALSE(
+            test_api().GetHoldingSpaceItemView(download_chips, item_id));
+        EXPECT_FALSE(
+            test_api().GetHoldingSpaceItemView(screen_capture_views, item_id));
+      }
+    }
   }
 
   // The recent files bubble should be empty and therefore hidden.
diff --git a/chrome/browser/ui/autofill/autofill_bubble_handler.h b/chrome/browser/ui/autofill/autofill_bubble_handler.h
index 2a17ef16..52ab722 100644
--- a/chrome/browser/ui/autofill/autofill_bubble_handler.h
+++ b/chrome/browser/ui/autofill/autofill_bubble_handler.h
@@ -15,7 +15,7 @@
 class AutofillBubbleBase;
 class LocalCardMigrationBubbleController;
 class OfferNotificationBubbleController;
-class SaveAddressProfileBubbleController;
+class SaveUpdateAddressProfileBubbleController;
 class EditAddressProfileDialogController;
 class SaveCardBubbleController;
 class SaveUPIBubble;
@@ -49,12 +49,12 @@
 
   virtual AutofillBubbleBase* ShowSaveAddressProfileBubble(
       content::WebContents* web_contents,
-      SaveAddressProfileBubbleController* controller,
+      SaveUpdateAddressProfileBubbleController* controller,
       bool is_user_gesture) = 0;
 
   virtual AutofillBubbleBase* ShowUpdateAddressProfileBubble(
       content::WebContents* web_contents,
-      SaveAddressProfileBubbleController* controller,
+      SaveUpdateAddressProfileBubbleController* controller,
       bool is_user_gesture) = 0;
 
   virtual AutofillBubbleBase* ShowEditAddressProfileDialog(
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc
index ca206a19..588b3cc 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -33,7 +33,7 @@
 #include "chrome/browser/ui/autofill/autofill_popup_controller_impl.h"
 #include "chrome/browser/ui/autofill/payments/create_card_unmask_prompt_view.h"
 #include "chrome/browser/ui/autofill/payments/credit_card_scanner_controller.h"
-#include "chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl.h"
+#include "chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.h"
 #include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/ui/page_info/page_info_dialog.h"
 #include "chrome/browser/ui/passwords/manage_passwords_view_utils.h"
@@ -538,9 +538,11 @@
   save_address_profile_flow_manager_.OfferSave(web_contents(), profile,
                                                std::move(callback));
 #else
-  SaveAddressProfileBubbleControllerImpl::CreateForWebContents(web_contents());
-  SaveAddressProfileBubbleControllerImpl* controller =
-      SaveAddressProfileBubbleControllerImpl::FromWebContents(web_contents());
+  SaveUpdateAddressProfileBubbleControllerImpl::CreateForWebContents(
+      web_contents());
+  SaveUpdateAddressProfileBubbleControllerImpl* controller =
+      SaveUpdateAddressProfileBubbleControllerImpl::FromWebContents(
+          web_contents());
   controller->OfferSave(profile, original_profile, std::move(callback));
 #endif
 }
diff --git a/chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl_browsertest.cc b/chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl_browsertest.cc
index 9cb3037..9524daf 100644
--- a/chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl_browsertest.cc
+++ b/chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl_browsertest.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/autofill/save_address_profile_bubble_controller_impl.h"
+#include "chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.h"
 
 #include "base/callback_helpers.h"
 #include "chrome/browser/ui/autofill/chrome_autofill_client.h"
@@ -15,9 +15,10 @@
 
 namespace autofill {
 
-class SaveAddressProfileBubbleControllerImplTest : public DialogBrowserTest {
+class SaveUpdateAddressProfileBubbleControllerImplTest
+    : public DialogBrowserTest {
  public:
-  SaveAddressProfileBubbleControllerImplTest() {
+  SaveUpdateAddressProfileBubbleControllerImplTest() {
     feature_list_.InitAndEnableFeature(
         features::kAutofillAddressProfileSavePrompt);
   }
@@ -35,31 +36,33 @@
     autofill_client->ConfirmSaveAddressProfile(test::GetFullProfile(),
                                                /*original_profile=*/nullptr,
                                                base::DoNothing());
-    controller_ =
-        SaveAddressProfileBubbleControllerImpl::FromWebContents(web_contents);
+    controller_ = SaveUpdateAddressProfileBubbleControllerImpl::FromWebContents(
+        web_contents);
     DCHECK(controller_);
   }
 
-  SaveAddressProfileBubbleControllerImpl* controller() { return controller_; }
+  SaveUpdateAddressProfileBubbleControllerImpl* controller() {
+    return controller_;
+  }
 
  private:
-  SaveAddressProfileBubbleControllerImpl* controller_ = nullptr;
+  SaveUpdateAddressProfileBubbleControllerImpl* controller_ = nullptr;
   base::test::ScopedFeatureList feature_list_;
 };
 
-IN_PROC_BROWSER_TEST_F(SaveAddressProfileBubbleControllerImplTest,
+IN_PROC_BROWSER_TEST_F(SaveUpdateAddressProfileBubbleControllerImplTest,
                        InvokeUi_Save) {
   ShowAndVerifyUi();
 }
 
-IN_PROC_BROWSER_TEST_F(SaveAddressProfileBubbleControllerImplTest,
+IN_PROC_BROWSER_TEST_F(SaveUpdateAddressProfileBubbleControllerImplTest,
                        InvokeUi_SaveCloseThenReopen) {
   ShowAndVerifyUi();
   controller()->OnBubbleClosed();
   ShowAndVerifyUi();
 }
 
-IN_PROC_BROWSER_TEST_F(SaveAddressProfileBubbleControllerImplTest,
+IN_PROC_BROWSER_TEST_F(SaveUpdateAddressProfileBubbleControllerImplTest,
                        CloseTabWhileBubbleIsOpen) {
   ShowAndVerifyUi();
   content::WebContents* tab =
diff --git a/chrome/browser/ui/autofill/save_address_profile_icon_controller.cc b/chrome/browser/ui/autofill/save_address_profile_icon_controller.cc
index 4fe6c90..9387bf5 100644
--- a/chrome/browser/ui/autofill/save_address_profile_icon_controller.cc
+++ b/chrome/browser/ui/autofill/save_address_profile_icon_controller.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/ui/autofill/save_address_profile_icon_controller.h"
 
-#include "chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl.h"
+#include "chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.h"
 
 namespace autofill {
 
@@ -14,7 +14,8 @@
   if (!web_contents)
     return nullptr;
 
-  return SaveAddressProfileBubbleControllerImpl::FromWebContents(web_contents);
+  return SaveUpdateAddressProfileBubbleControllerImpl::FromWebContents(
+      web_contents);
 }
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/save_address_profile_bubble_controller.h b/chrome/browser/ui/autofill/save_update_address_profile_bubble_controller.h
similarity index 67%
rename from chrome/browser/ui/autofill/save_address_profile_bubble_controller.h
rename to chrome/browser/ui/autofill/save_update_address_profile_bubble_controller.h
index 88ecc1c..5bd4fb7a 100644
--- a/chrome/browser/ui/autofill/save_address_profile_bubble_controller.h
+++ b/chrome/browser/ui/autofill/save_update_address_profile_bubble_controller.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_AUTOFILL_SAVE_ADDRESS_PROFILE_BUBBLE_CONTROLLER_H_
-#define CHROME_BROWSER_UI_AUTOFILL_SAVE_ADDRESS_PROFILE_BUBBLE_CONTROLLER_H_
+#ifndef CHROME_BROWSER_UI_AUTOFILL_SAVE_UPDATE_ADDRESS_PROFILE_BUBBLE_CONTROLLER_H_
+#define CHROME_BROWSER_UI_AUTOFILL_SAVE_UPDATE_ADDRESS_PROFILE_BUBBLE_CONTROLLER_H_
 
 #include "components/autofill/core/browser/autofill_client.h"
 
@@ -11,9 +11,9 @@
 
 // Interface that exposes controller functionality to SaveAddressProfileView
 // bubble.
-class SaveAddressProfileBubbleController {
+class SaveUpdateAddressProfileBubbleController {
  public:
-  virtual ~SaveAddressProfileBubbleController() = default;
+  virtual ~SaveUpdateAddressProfileBubbleController() = default;
 
   virtual std::u16string GetWindowTitle() const = 0;
   virtual const AutofillProfile& GetProfileToSave() const = 0;
@@ -26,4 +26,4 @@
 
 }  // namespace autofill
 
-#endif  // CHROME_BROWSER_UI_AUTOFILL_SAVE_ADDRESS_PROFILE_BUBBLE_CONTROLLER_H_
+#endif  // CHROME_BROWSER_UI_AUTOFILL_SAVE_UPDATE_ADDRESS_PROFILE_BUBBLE_CONTROLLER_H_
diff --git a/chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl.cc b/chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.cc
similarity index 71%
rename from chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl.cc
rename to chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.cc
index 87280c6..b05b959a 100644
--- a/chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.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/autofill/save_address_profile_bubble_controller_impl.h"
+#include "chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.h"
 
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -15,17 +15,18 @@
 
 namespace autofill {
 
-SaveAddressProfileBubbleControllerImpl::SaveAddressProfileBubbleControllerImpl(
-    content::WebContents* web_contents)
+SaveUpdateAddressProfileBubbleControllerImpl::
+    SaveUpdateAddressProfileBubbleControllerImpl(
+        content::WebContents* web_contents)
     : AutofillBubbleControllerBase(web_contents) {
   DCHECK(base::FeatureList::IsEnabled(
       features::kAutofillAddressProfileSavePrompt));
 }
 
-SaveAddressProfileBubbleControllerImpl::
-    ~SaveAddressProfileBubbleControllerImpl() = default;
+SaveUpdateAddressProfileBubbleControllerImpl::
+    ~SaveUpdateAddressProfileBubbleControllerImpl() = default;
 
-void SaveAddressProfileBubbleControllerImpl::OfferSave(
+void SaveUpdateAddressProfileBubbleControllerImpl::OfferSave(
     const AutofillProfile& profile,
     const AutofillProfile* original_profile,
     AutofillClient::AddressProfileSavePromptCallback
@@ -41,23 +42,24 @@
   Show();
 }
 
-std::u16string SaveAddressProfileBubbleControllerImpl::GetWindowTitle() const {
+std::u16string SaveUpdateAddressProfileBubbleControllerImpl::GetWindowTitle()
+    const {
   // TODO(crbug.com/1167060): Use ineternationalized string upon having final
   // strings.
   return original_profile_ ? u"Update Address?" : u"Save Address?";
 }
 
 const AutofillProfile&
-SaveAddressProfileBubbleControllerImpl::GetProfileToSave() const {
+SaveUpdateAddressProfileBubbleControllerImpl::GetProfileToSave() const {
   return address_profile_;
 }
 
 const AutofillProfile*
-SaveAddressProfileBubbleControllerImpl::GetOriginalProfile() const {
+SaveUpdateAddressProfileBubbleControllerImpl::GetOriginalProfile() const {
   return base::OptionalOrNullptr(original_profile_);
 }
 
-void SaveAddressProfileBubbleControllerImpl::OnUserDecision(
+void SaveUpdateAddressProfileBubbleControllerImpl::OnUserDecision(
     AutofillClient::SaveAddressProfileOfferUserDecision decision) {
   set_bubble_view(nullptr);
 
@@ -65,7 +67,7 @@
       .Run(decision, address_profile_);
 }
 
-void SaveAddressProfileBubbleControllerImpl::OnEditButtonClicked() {
+void SaveUpdateAddressProfileBubbleControllerImpl::OnEditButtonClicked() {
   HideBubble();
   EditAddressProfileDialogControllerImpl::CreateForWebContents(web_contents());
   EditAddressProfileDialogControllerImpl* controller =
@@ -74,12 +76,12 @@
                         std::move(address_profile_save_prompt_callback_));
 }
 
-void SaveAddressProfileBubbleControllerImpl::OnBubbleClosed() {
+void SaveUpdateAddressProfileBubbleControllerImpl::OnBubbleClosed() {
   set_bubble_view(nullptr);
   UpdatePageActionIcon();
 }
 
-void SaveAddressProfileBubbleControllerImpl::OnPageActionIconClicked() {
+void SaveUpdateAddressProfileBubbleControllerImpl::OnPageActionIconClicked() {
   // Don't show the bubble if it's already visible.
   if (bubble_view())
     return;
@@ -87,23 +89,23 @@
   Show();
 }
 
-bool SaveAddressProfileBubbleControllerImpl::IsBubbleActive() const {
+bool SaveUpdateAddressProfileBubbleControllerImpl::IsBubbleActive() const {
   return !address_profile_save_prompt_callback_.is_null();
 }
 
-AutofillBubbleBase* SaveAddressProfileBubbleControllerImpl::GetSaveBubbleView()
-    const {
+AutofillBubbleBase*
+SaveUpdateAddressProfileBubbleControllerImpl::GetSaveBubbleView() const {
   return bubble_view();
 }
 
 PageActionIconType
-SaveAddressProfileBubbleControllerImpl::GetPageActionIconType() {
+SaveUpdateAddressProfileBubbleControllerImpl::GetPageActionIconType() {
   // TODO(crbug.com/1167060): Switch to PageActionIconType::kSaveAutofillAddress
   // once there are acceesible name for the page icon view.
   return PageActionIconType::kSaveCard;
 }
 
-void SaveAddressProfileBubbleControllerImpl::DoShowBubble() {
+void SaveUpdateAddressProfileBubbleControllerImpl::DoShowBubble() {
   DCHECK(!bubble_view());
   Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
   if (!original_profile_) {
@@ -122,6 +124,6 @@
   DCHECK(bubble_view());
 }
 
-WEB_CONTENTS_USER_DATA_KEY_IMPL(SaveAddressProfileBubbleControllerImpl)
+WEB_CONTENTS_USER_DATA_KEY_IMPL(SaveUpdateAddressProfileBubbleControllerImpl)
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl.h b/chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.h
similarity index 74%
rename from chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl.h
rename to chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.h
index 2073c0e4..ce1ab37c 100644
--- a/chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl.h
+++ b/chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_AUTOFILL_SAVE_ADDRESS_PROFILE_BUBBLE_CONTROLLER_IMPL_H_
-#define CHROME_BROWSER_UI_AUTOFILL_SAVE_ADDRESS_PROFILE_BUBBLE_CONTROLLER_IMPL_H_
+#ifndef CHROME_BROWSER_UI_AUTOFILL_SAVE_UPDATE_ADDRESS_PROFILE_BUBBLE_CONTROLLER_IMPL_H_
+#define CHROME_BROWSER_UI_AUTOFILL_SAVE_UPDATE_ADDRESS_PROFILE_BUBBLE_CONTROLLER_IMPL_H_
 
 #include <string>
 
 #include "chrome/browser/ui/autofill/autofill_bubble_controller_base.h"
-#include "chrome/browser/ui/autofill/save_address_profile_bubble_controller.h"
 #include "chrome/browser/ui/autofill/save_address_profile_icon_controller.h"
+#include "chrome/browser/ui/autofill/save_update_address_profile_bubble_controller.h"
 #include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "content/public/browser/web_contents_user_data.h"
@@ -19,18 +19,18 @@
 class AutofillBubbleBase;
 
 // The controller functionality for SaveAddressProfileView.
-class SaveAddressProfileBubbleControllerImpl
+class SaveUpdateAddressProfileBubbleControllerImpl
     : public AutofillBubbleControllerBase,
-      public SaveAddressProfileBubbleController,
+      public SaveUpdateAddressProfileBubbleController,
       public SaveAddressProfileIconController,
       public content::WebContentsUserData<
-          SaveAddressProfileBubbleControllerImpl> {
+          SaveUpdateAddressProfileBubbleControllerImpl> {
  public:
-  SaveAddressProfileBubbleControllerImpl(
-      const SaveAddressProfileBubbleControllerImpl&) = delete;
-  SaveAddressProfileBubbleControllerImpl& operator=(
-      const SaveAddressProfileBubbleControllerImpl&) = delete;
-  ~SaveAddressProfileBubbleControllerImpl() override;
+  SaveUpdateAddressProfileBubbleControllerImpl(
+      const SaveUpdateAddressProfileBubbleControllerImpl&) = delete;
+  SaveUpdateAddressProfileBubbleControllerImpl& operator=(
+      const SaveUpdateAddressProfileBubbleControllerImpl&) = delete;
+  ~SaveUpdateAddressProfileBubbleControllerImpl() override;
 
   // Sets up the controller and offers to save the `profile`. If
   // `original_profile` is not nullptr, it will be updated of the user accepts
@@ -41,7 +41,7 @@
                  AutofillClient::AddressProfileSavePromptCallback
                      address_profile_save_prompt_callback);
 
-  // SaveAddressProfileBubbleController:
+  // SaveUpdateAddressProfileBubbleController:
   std::u16string GetWindowTitle() const override;
   const AutofillProfile& GetProfileToSave() const override;
   const AutofillProfile* GetOriginalProfile() const override;
@@ -61,10 +61,10 @@
   void DoShowBubble() override;
 
  private:
-  explicit SaveAddressProfileBubbleControllerImpl(
+  explicit SaveUpdateAddressProfileBubbleControllerImpl(
       content::WebContents* web_contents);
   friend class content::WebContentsUserData<
-      SaveAddressProfileBubbleControllerImpl>;
+      SaveUpdateAddressProfileBubbleControllerImpl>;
 
   // Callback to run once the user makes a decision with respect to the saving
   // the address profile.
@@ -89,4 +89,4 @@
 
 }  // namespace autofill
 
-#endif  // CHROME_BROWSER_UI_AUTOFILL_SAVE_ADDRESS_PROFILE_BUBBLE_CONTROLLER_IMPL_H_
+#endif  // CHROME_BROWSER_UI_AUTOFILL_SAVE_UPDATE_ADDRESS_PROFILE_BUBBLE_CONTROLLER_IMPL_H_
diff --git a/chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl_unittest.cc b/chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl_unittest.cc
similarity index 78%
rename from chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl_unittest.cc
rename to chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl_unittest.cc
index 956d059..86047565 100644
--- a/chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl_unittest.cc
+++ b/chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl_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/autofill/save_address_profile_bubble_controller_impl.h"
+#include "chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.h"
 
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
@@ -13,10 +13,10 @@
 
 namespace autofill {
 
-class SaveAddressProfileBubbleControllerImplTest
+class SaveUpdateAddressProfileBubbleControllerImplTest
     : public BrowserWithTestWindowTest {
  public:
-  SaveAddressProfileBubbleControllerImplTest() = default;
+  SaveUpdateAddressProfileBubbleControllerImplTest() = default;
   void SetUp() override {
     base::test::ScopedFeatureList feature_list;
     feature_list.InitAndEnableFeature(
@@ -26,16 +26,17 @@
     AddTab(browser(), GURL("about:blank"));
     content::WebContents* web_contents =
         browser()->tab_strip_model()->GetActiveWebContents();
-    SaveAddressProfileBubbleControllerImpl::CreateForWebContents(web_contents);
+    SaveUpdateAddressProfileBubbleControllerImpl::CreateForWebContents(
+        web_contents);
   }
 
-  SaveAddressProfileBubbleControllerImpl* controller() {
-    return SaveAddressProfileBubbleControllerImpl::FromWebContents(
+  SaveUpdateAddressProfileBubbleControllerImpl* controller() {
+    return SaveUpdateAddressProfileBubbleControllerImpl::FromWebContents(
         browser()->tab_strip_model()->GetActiveWebContents());
   }
 };
 
-TEST_F(SaveAddressProfileBubbleControllerImplTest,
+TEST_F(SaveUpdateAddressProfileBubbleControllerImplTest,
        DialogAcceptedInvokesCallback) {
   AutofillProfile profile = test::GetFullProfile();
   base::MockCallback<AutofillClient::AddressProfileSavePromptCallback> callback;
@@ -50,7 +51,7 @@
       AutofillClient::SaveAddressProfileOfferUserDecision::kAccepted);
 }
 
-TEST_F(SaveAddressProfileBubbleControllerImplTest,
+TEST_F(SaveUpdateAddressProfileBubbleControllerImplTest,
        DialogCancelledInvokesCallback) {
   AutofillProfile profile = test::GetFullProfile();
   base::MockCallback<AutofillClient::AddressProfileSavePromptCallback> callback;
diff --git a/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.cc b/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.cc
index 751ffd1..d85ca40 100644
--- a/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.cc
+++ b/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.cc
@@ -47,7 +47,7 @@
 
 AutofillBubbleBase* TestAutofillBubbleHandler::ShowSaveAddressProfileBubble(
     content::WebContents* contents,
-    SaveAddressProfileBubbleController* controller,
+    SaveUpdateAddressProfileBubbleController* controller,
     bool is_user_gesture) {
   if (!save_address_profile_bubble_view_)
     save_address_profile_bubble_view_ = std::make_unique<TestAutofillBubble>();
@@ -56,7 +56,7 @@
 
 AutofillBubbleBase* TestAutofillBubbleHandler::ShowUpdateAddressProfileBubble(
     content::WebContents* contents,
-    SaveAddressProfileBubbleController* controller,
+    SaveUpdateAddressProfileBubbleController* controller,
     bool is_user_gesture) {
   if (!update_address_profile_bubble_view_) {
     update_address_profile_bubble_view_ =
diff --git a/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h b/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h
index 722a4f8..040bd0db 100644
--- a/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h
+++ b/chrome/browser/ui/autofill/test/test_autofill_bubble_handler.h
@@ -45,11 +45,11 @@
       SaveUPIBubbleController* controller) override;
   AutofillBubbleBase* ShowSaveAddressProfileBubble(
       content::WebContents* contents,
-      SaveAddressProfileBubbleController* controller,
+      SaveUpdateAddressProfileBubbleController* controller,
       bool is_user_gesture) override;
   AutofillBubbleBase* ShowUpdateAddressProfileBubble(
       content::WebContents* contents,
-      SaveAddressProfileBubbleController* controller,
+      SaveUpdateAddressProfileBubbleController* controller,
       bool is_user_gesture) override;
   AutofillBubbleBase* ShowEditAddressProfileDialog(
       content::WebContents* contents,
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index 16f42df..c6cf69f 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -40,7 +40,7 @@
 #include "chrome/browser/ui/autofill/payments/manage_migration_ui_controller.h"
 #include "chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.h"
 #include "chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h"
-#include "chrome/browser/ui/autofill/save_address_profile_bubble_controller_impl.h"
+#include "chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.h"
 #include "chrome/browser/ui/bookmarks/bookmark_stats.h"
 #include "chrome/browser/ui/bookmarks/bookmark_utils.h"
 #include "chrome/browser/ui/bookmarks/bookmark_utils_desktop.h"
@@ -1202,8 +1202,8 @@
 void SaveAutofillAddress(Browser* browser) {
   WebContents* web_contents =
       browser->tab_strip_model()->GetActiveWebContents();
-  autofill::SaveAddressProfileBubbleControllerImpl* controller =
-      autofill::SaveAddressProfileBubbleControllerImpl::FromWebContents(
+  autofill::SaveUpdateAddressProfileBubbleControllerImpl* controller =
+      autofill::SaveUpdateAddressProfileBubbleControllerImpl::FromWebContents(
           web_contents);
   controller->OnPageActionIconClicked();
 }
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.mm b/chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.mm
index bd34d90..1ee7d4c 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.mm
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_applescript_utils_test.mm
@@ -18,7 +18,7 @@
 
 @implementation FakeScriptCommand
 
-- (id)init {
+- (instancetype)init {
   if ((self = [super init])) {
     _originalMethod = class_getClassMethod([NSScriptCommand class],
                                            @selector(currentCommand));
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript_browsertest.mm b/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript_browsertest.mm
index 6035e125..6a0bae1 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript_browsertest.mm
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_folder_applescript_browsertest.mm
@@ -27,8 +27,8 @@
 
   EXPECT_EQ(2U, [bookmarkFolders count]);
 
-  BookmarkFolderAppleScript* f1 = [bookmarkFolders objectAtIndex:0];
-  BookmarkFolderAppleScript* f2 = [bookmarkFolders objectAtIndex:1];
+  BookmarkFolderAppleScript* f1 = bookmarkFolders[0];
+  BookmarkFolderAppleScript* f2 = bookmarkFolders[1];
   EXPECT_NSEQ(@"f1", [f1 title]);
   EXPECT_NSEQ(@"f2", [f2 title]);
   EXPECT_EQ(2, [[f1 index] intValue]);
@@ -53,8 +53,7 @@
   [bookmarkBar_.get() insertInBookmarkFolders:bookmarkFolder.get()];
 
   // Represents the bookmark folder after it's added.
-  BookmarkFolderAppleScript* bf =
-      [[bookmarkBar_.get() bookmarkFolders] objectAtIndex:2];
+  BookmarkFolderAppleScript* bf = [bookmarkBar_.get() bookmarkFolders][2];
   EXPECT_NSEQ(@"foo", [bf title]);
   EXPECT_EQ([bf container], bookmarkBar_.get());
   EXPECT_NSEQ(AppleScript::kBookmarkFoldersProperty,
@@ -75,8 +74,7 @@
   [bookmarkBar_.get() insertInBookmarkFolders:bookmarkFolder.get() atIndex:1];
 
   // Represents the bookmark folder after it's added.
-  BookmarkFolderAppleScript* bf =
-      [[bookmarkBar_.get() bookmarkFolders] objectAtIndex:1];
+  BookmarkFolderAppleScript* bf = [bookmarkBar_.get() bookmarkFolders][1];
   EXPECT_NSEQ(@"foo", [bf title]);
   EXPECT_EQ([bf container], bookmarkBar_.get());
   EXPECT_NSEQ(AppleScript::kBookmarkFoldersProperty, [bf containerProperty]);
@@ -99,9 +97,9 @@
 
   EXPECT_EQ(3U, [bookmarkItems count]);
 
-  BookmarkItemAppleScript* i1 = [bookmarkItems objectAtIndex:0];
-  BookmarkItemAppleScript* i2 = [bookmarkItems objectAtIndex:1];
-  BookmarkItemAppleScript* i3 = [bookmarkItems objectAtIndex:2];
+  BookmarkItemAppleScript* i1 = bookmarkItems[0];
+  BookmarkItemAppleScript* i2 = bookmarkItems[1];
+  BookmarkItemAppleScript* i3 = bookmarkItems[2];
   EXPECT_NSEQ(@"a", [i1 title]);
   EXPECT_NSEQ(@"d", [i2 title]);
   EXPECT_NSEQ(@"h", [i3 title]);
@@ -129,8 +127,7 @@
   [bookmarkBar_.get() insertInBookmarkItems:bookmarkItem.get()];
 
   // Represents the bookmark item after it's added.
-  BookmarkItemAppleScript* bi =
-      [[bookmarkBar_.get() bookmarkItems] objectAtIndex:3];
+  BookmarkItemAppleScript* bi = [bookmarkBar_.get() bookmarkItems][3];
   EXPECT_NSEQ(@"Google", [bi title]);
   EXPECT_EQ(GURL("http://google.com/"),
             GURL(base::SysNSStringToUTF8([bi URL])));
@@ -163,8 +160,7 @@
   [bookmarkBar_.get() insertInBookmarkItems:bookmarkItem.get() atIndex:1];
 
   // Represents the bookmark item after its added.
-  BookmarkItemAppleScript* bi =
-      [[bookmarkBar_.get() bookmarkItems] objectAtIndex:1];
+  BookmarkItemAppleScript* bi = [bookmarkBar_.get() bookmarkItems][1];
   EXPECT_NSEQ(@"XKCD", [bi title]);
   EXPECT_EQ(GURL("http://xkcd.org/"),
             GURL(base::SysNSStringToUTF8([bi URL])));
@@ -195,7 +191,7 @@
 // Set and get title.
 IN_PROC_BROWSER_TEST_F(BookmarkFolderAppleScriptTest, GetAndSetTitle) {
   NSArray* bookmarkFolders = [bookmarkBar_.get() bookmarkFolders];
-  BookmarkFolderAppleScript* folder1 = [bookmarkFolders objectAtIndex:0];
+  BookmarkFolderAppleScript* folder1 = bookmarkFolders[0];
   [folder1 setTitle:@"Foo"];
   EXPECT_NSEQ(@"Foo", [folder1 title]);
 }
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.mm b/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.mm
index 023515cc..8539eb6 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript.mm
@@ -23,7 +23,7 @@
 
 @synthesize tempURL = _tempURL;
 
-- (id)init {
+- (instancetype)init {
   if ((self = [super init])) {
     [self setTempURL:@""];
   }
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript_browsertest.mm b/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript_browsertest.mm
index cff02a8b..3d52f35c 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript_browsertest.mm
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_item_applescript_browsertest.mm
@@ -25,7 +25,7 @@
 // Set and get title.
 IN_PROC_BROWSER_TEST_F(BookmarkItemAppleScriptTest, GetAndSetTitle) {
   NSArray* bookmarkItems = [bookmarkBar_.get() bookmarkItems];
-  BookmarkItemAppleScript* item1 = [bookmarkItems objectAtIndex:0];
+  BookmarkItemAppleScript* item1 = bookmarkItems[0];
   [item1 setTitle:@"Foo"];
   EXPECT_NSEQ(@"Foo", [item1 title]);
 }
@@ -33,7 +33,7 @@
 // Set and get URL.
 IN_PROC_BROWSER_TEST_F(BookmarkItemAppleScriptTest, GetAndSetURL) {
   NSArray* bookmarkItems = [bookmarkBar_.get() bookmarkItems];
-  BookmarkItemAppleScript* item1 = [bookmarkItems objectAtIndex:0];
+  BookmarkItemAppleScript* item1 = bookmarkItems[0];
   [item1 setURL:@"http://foo-bar.org"];
   EXPECT_EQ(GURL("http://foo-bar.org"),
             GURL(base::SysNSStringToUTF8([item1 URL])));
@@ -52,7 +52,7 @@
   prefs->SetBoolean(prefs::kAllowJavascriptAppleEvents, false);
 
   NSArray* bookmarkItems = [bookmarkBar_.get() bookmarkItems];
-  BookmarkItemAppleScript* item1 = [bookmarkItems objectAtIndex:0];
+  BookmarkItemAppleScript* item1 = bookmarkItems[0];
 
   base::scoped_nsobject<FakeScriptCommand> fakeScriptCommand(
       [[FakeScriptCommand alloc] init]);
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.h b/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.h
index b8f3517..29aa3ab0 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.h
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.h
@@ -27,10 +27,11 @@
 
 // Does not actually create a folder/item but just sets its ID, the folder is
 // created in insertInBookmarksFolder: in the corresponding bookmarks folder.
-- (id)init;
+- (instancetype)init;
 
 // Does not make a folder/item but instead uses an existing one.
-- (id)initWithBookmarkNode:(const bookmarks::BookmarkNode*)aBookmarkNode;
+- (instancetype)initWithBookmarkNode:
+    (const bookmarks::BookmarkNode*)aBookmarkNode;
 
 // Assigns a node, sets its unique ID and also copies temporary values.
 - (void)setBookmarkNode:(const bookmarks::BookmarkNode*)aBookmarkNode;
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.mm b/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.mm
index efe3ba5f..64a0bc6 100644
--- a/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.mm
@@ -27,7 +27,7 @@
 
 @synthesize tempTitle = _tempTitle;
 
-- (id)init {
+- (instancetype)init {
   if ((self = [super init])) {
     BookmarkModel* model = [self bookmarkModel];
     if (!model) {
@@ -48,8 +48,7 @@
   [super dealloc];
 }
 
-
-- (id)initWithBookmarkNode:(const BookmarkNode*)aBookmarkNode {
+- (instancetype)initWithBookmarkNode:(const BookmarkNode*)aBookmarkNode {
   if (!aBookmarkNode) {
     [self release];
     return nil;
@@ -111,7 +110,7 @@
   const BookmarkNode* parent = _bookmarkNode->parent();
   int index = parent->GetIndexOf(_bookmarkNode);
   // NOTE: AppleScript is 1-Based.
-  return [NSNumber numberWithInt:index+1];
+  return @(index + 1);
 }
 
 - (BookmarkModel*)bookmarkModel {
diff --git a/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript.mm b/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript.mm
index 0661d15..ff1e7ce 100644
--- a/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript.mm
@@ -59,12 +59,11 @@
                property:AppleScript::kWindowsProperty];
   // Note: AppleScript is 1-based.
   index--;
-  [aWindow setOrderedIndex:[NSNumber numberWithInt:index]];
+  [aWindow setOrderedIndex:@(index)];
 }
 
 - (void)removeFromAppleScriptWindowsAtIndex:(int)index {
-  [[[self appleScriptWindows] objectAtIndex:index]
-      handlesCloseScriptCommand:nil];
+  [[self appleScriptWindows][index] handlesCloseScriptCommand:nil];
 }
 
 - (NSScriptObjectSpecifier*)objectSpecifier {
@@ -124,9 +123,7 @@
 - (NSArray*)bookmarkFolders {
   BookmarkFolderAppleScript* otherBookmarks = [self otherBookmarks];
   BookmarkFolderAppleScript* bookmarksBar = [self bookmarksBar];
-  NSArray* folderArray = [NSArray arrayWithObjects:otherBookmarks,
-                                                   bookmarksBar,
-                                                   nil];
+  NSArray* folderArray = @[ otherBookmarks, bookmarksBar ];
   return folderArray;
 }
 
diff --git a/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript_test.mm b/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript_test.mm
index 09e5c6bc..f055b7a1 100644
--- a/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript_test.mm
+++ b/chrome/browser/ui/cocoa/applescript/browsercrapplication+applescript_test.mm
@@ -53,15 +53,14 @@
   base::scoped_nsobject<WindowAppleScript> aWindow(
       [[WindowAppleScript alloc] init]);
   base::scoped_nsobject<NSNumber> var([[aWindow.get() uniqueID] copy]);
-  [aWindow.get() setValue:[NSNumber numberWithBool:YES] forKey:@"isVisible"];
+  [aWindow.get() setValue:@YES forKey:@"isVisible"];
 
   [NSApp insertInAppleScriptWindows:aWindow.get()];
   chrome::testing::NSRunLoopRunAllPending();
 
   // Represents the window after it is added.
-  WindowAppleScript* window = [[NSApp appleScriptWindows] objectAtIndex:0];
-  EXPECT_NSEQ([NSNumber numberWithBool:YES],
-              [aWindow.get() valueForKey:@"isVisible"]);
+  WindowAppleScript* window = [NSApp appleScriptWindows][0];
+  EXPECT_NSEQ(@YES, [aWindow.get() valueForKey:@"isVisible"]);
   EXPECT_EQ([window container], NSApp);
   EXPECT_NSEQ(AppleScript::kWindowsProperty,
               [window containerProperty]);
diff --git a/chrome/browser/ui/cocoa/applescript/tab_applescript.mm b/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
index 12b13b6..1bc4a58 100644
--- a/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
@@ -172,7 +172,7 @@
 
 - (NSNumber*)loading {
   BOOL loadingValue = _webContents->IsLoading() ? YES : NO;
-  return [NSNumber numberWithBool:loadingValue];
+  return @(loadingValue);
 }
 
 - (void)handlesUndoScriptCommand:(NSScriptCommand*)command {
@@ -246,7 +246,7 @@
   AppleScript::LogAppleScriptUMA(AppleScript::AppleScriptCommand::TAB_SAVE);
   NSDictionary* dictionary = [command evaluatedArguments];
 
-  NSURL* fileURL = [dictionary objectForKey:@"File"];
+  NSURL* fileURL = dictionary[@"File"];
   // Scripter has not specifed the location at which to save, so we prompt for
   // it.
   if (!fileURL) {
@@ -261,7 +261,7 @@
   base::FilePath directoryPath = mainFile.RemoveExtension();
   directoryPath = directoryPath.InsertBeforeExtension(std::string("_files/"));
 
-  NSString* saveType = [dictionary objectForKey:@"FileType"];
+  NSString* saveType = dictionary[@"FileType"];
 
   content::SavePageType savePageType = content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML;
   if (saveType) {
@@ -318,8 +318,8 @@
   content::RenderFrameHost::JavaScriptResultCallback callback =
       base::BindOnce(&ResumeAppleEventAndSendReply, suspensionID);
 
-  std::u16string script = base::SysNSStringToUTF16(
-      [[command evaluatedArguments] objectForKey:@"javascript"]);
+  std::u16string script =
+      base::SysNSStringToUTF16([command evaluatedArguments][@"javascript"]);
   frame->ExecuteJavaScriptInIsolatedWorld(script, std::move(callback),
                                           ISOLATED_WORLD_ID_APPLESCRIPT);
 
diff --git a/chrome/browser/ui/cocoa/applescript/window_applescript.h b/chrome/browser/ui/cocoa/applescript/window_applescript.h
index 674b0bb0..e6b74ec73 100644
--- a/chrome/browser/ui/cocoa/applescript/window_applescript.h
+++ b/chrome/browser/ui/cocoa/applescript/window_applescript.h
@@ -20,13 +20,13 @@
 }
 
 // Creates a new window, returns nil if there is an error.
-- (id)init;
+- (instancetype)init;
 
 // Creates a new window with a particular profile.
-- (id)initWithProfile:(Profile*)aProfile;
+- (instancetype)initWithProfile:(Profile*)aProfile;
 
 // Does not create a new window but uses an existing one.
-- (id)initWithBrowser:(Browser*)aBrowser;
+- (instancetype)initWithBrowser:(Browser*)aBrowser;
 
 // Sets and gets the index of the currently selected tab.
 - (NSNumber*)activeTabIndex;
diff --git a/chrome/browser/ui/cocoa/applescript/window_applescript.mm b/chrome/browser/ui/cocoa/applescript/window_applescript.mm
index 7425cf2..bee2a45 100644
--- a/chrome/browser/ui/cocoa/applescript/window_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/window_applescript.mm
@@ -38,11 +38,10 @@
 
 @implementation WindowAppleScript
 
-- (id)init {
+- (instancetype)init {
   // Check which mode to open a new window.
   NSScriptCommand* command = [NSScriptCommand currentCommand];
-  NSString* mode = [[[command evaluatedArguments]
-      objectForKey:@"KeyDictionary"] objectForKey:@"mode"];
+  NSString* mode = [command evaluatedArguments][@"KeyDictionary"][@"mode"];
   AppController* appDelegate =
       base::mac::ObjCCastStrict<AppController>([NSApp delegate]);
 
@@ -65,12 +64,11 @@
     return nil;
   }
   // Set the mode to nil, to ensure that it is not set once more.
-  [[[command evaluatedArguments] objectForKey:@"KeyDictionary"]
-      setValue:nil forKey:@"mode"];
+  [[command evaluatedArguments][@"KeyDictionary"] setValue:nil forKey:@"mode"];
   return [self initWithProfile:profile];
 }
 
-- (id)initWithProfile:(Profile*)aProfile {
+- (instancetype)initWithProfile:(Profile*)aProfile {
   if (!aProfile) {
     [self release];
     return nil;
@@ -95,7 +93,7 @@
   return self;
 }
 
-- (id)initWithBrowser:(Browser*)aBrowser {
+- (instancetype)initWithBrowser:(Browser*)aBrowser {
   if (!aBrowser) {
     [self release];
     return nil;
@@ -126,7 +124,7 @@
   if (!activeTabIndex) {
     return nil;
   }
-  return [NSNumber numberWithInt:activeTabIndex];
+  return @(activeTabIndex);
 }
 
 - (void)setActiveTabIndex:(NSNumber*)anActiveTabIndex {
diff --git a/chrome/browser/ui/cocoa/applescript/window_applescript_test.mm b/chrome/browser/ui/cocoa/applescript/window_applescript_test.mm
index 75d12d6..48e3a91 100644
--- a/chrome/browser/ui/cocoa/applescript/window_applescript_test.mm
+++ b/chrome/browser/ui/cocoa/applescript/window_applescript_test.mm
@@ -72,7 +72,7 @@
       [[WindowAppleScript alloc] initWithBrowser:browser()]);
   NSArray* tabs = [aWindow.get() tabs];
   EXPECT_EQ(1U, [tabs count]);
-  TabAppleScript* tab1 = [tabs objectAtIndex:0];
+  TabAppleScript* tab1 = tabs[0];
   EXPECT_EQ([tab1 container], aWindow.get());
   EXPECT_NSEQ(AppleScript::kTabsProperty,
               [tab1 containerProperty]);
@@ -91,7 +91,7 @@
   [aWindow.get() insertInTabs:aTab.get()];
 
   // Represents the tab after it is inserted.
-  TabAppleScript* tab = [[aWindow.get() tabs] objectAtIndex:1];
+  TabAppleScript* tab = [aWindow.get() tabs][1];
   EXPECT_EQ(GURL("http://google.com"),
             GURL(base::SysNSStringToUTF8([tab URL])));
   EXPECT_EQ([tab container], aWindow.get());
@@ -113,7 +113,7 @@
   [aWindow.get() insertInTabs:aTab.get() atIndex:0];
 
   // Represents the tab after it is inserted.
-  TabAppleScript* tab = [[aWindow.get() tabs] objectAtIndex:0];
+  TabAppleScript* tab = [aWindow.get() tabs][0];
   EXPECT_EQ(GURL("http://google.com"),
             GURL(base::SysNSStringToUTF8([tab URL])));
   EXPECT_EQ([tab container], aWindow.get());
@@ -150,11 +150,9 @@
 IN_PROC_BROWSER_TEST_F(WindowAppleScriptTest, NSWindowTest) {
   base::scoped_nsobject<WindowAppleScript> aWindow(
       [[WindowAppleScript alloc] initWithBrowser:browser()]);
-  [aWindow.get() setValue:[NSNumber numberWithBool:YES]
-                   forKey:@"isMiniaturized"];
+  [aWindow.get() setValue:@YES forKey:@"isMiniaturized"];
   EXPECT_TRUE([[aWindow.get() valueForKey:@"isMiniaturized"] boolValue]);
-  [aWindow.get() setValue:[NSNumber numberWithBool:NO]
-                   forKey:@"isMiniaturized"];
+  [aWindow.get() setValue:@NO forKey:@"isMiniaturized"];
   EXPECT_FALSE([[aWindow.get() valueForKey:@"isMiniaturized"] boolValue]);
 }
 
@@ -164,9 +162,9 @@
       [[WindowAppleScript alloc] initWithBrowser:browser()]);
   base::scoped_nsobject<TabAppleScript> aTab([[TabAppleScript alloc] init]);
   [aWindow.get() insertInTabs:aTab.get()];
-  [aWindow.get() setActiveTabIndex:[NSNumber numberWithInt:2]];
+  [aWindow.get() setActiveTabIndex:@2];
   EXPECT_EQ(2, [[aWindow.get() activeTabIndex] intValue]);
-  TabAppleScript* tab2 = [[aWindow.get() tabs] objectAtIndex:1];
+  TabAppleScript* tab2 = [aWindow.get() tabs][1];
   EXPECT_NSEQ([[aWindow.get() activeTab] uniqueID],
               [tab2 uniqueID]);
 }
diff --git a/chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.cc b/chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.cc
index e121139..60c1ae3 100644
--- a/chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.cc
+++ b/chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.cc
@@ -20,11 +20,7 @@
 }
 
 // static
-bool QRCodeGeneratorBubbleController::IsGeneratorAvailable(const GURL& url,
-                                                           bool in_incognito) {
-  if (in_incognito)
-    return false;
-
+bool QRCodeGeneratorBubbleController::IsGeneratorAvailable(const GURL& url) {
   if (!base::FeatureList::IsEnabled(kSharingQRCodeGenerator))
     return false;
 
diff --git a/chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.h b/chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.h
index 8802395..d79d788d 100644
--- a/chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.h
+++ b/chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.h
@@ -25,9 +25,8 @@
  public:
   ~QRCodeGeneratorBubbleController() override;
 
-  // Returns whether the generator is available for a given page and
-  // state (incognito etc.).
-  static bool IsGeneratorAvailable(const GURL& url, bool in_incognito);
+  // Returns whether the generator is available for a given page.
+  static bool IsGeneratorAvailable(const GURL& url);
 
   static QRCodeGeneratorBubbleController* Get(
       content::WebContents* web_contents);
diff --git a/chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller_unittest.cc b/chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller_unittest.cc
index 130a7ea..bfc9872 100644
--- a/chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller_unittest.cc
+++ b/chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller_unittest.cc
@@ -30,33 +30,24 @@
 
   // Allow valid http/https URLs.
   ASSERT_TRUE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-      GURL("http://www.example.com"), false));
+      GURL("http://www.example.com")));
   ASSERT_TRUE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-      GURL("https://www.example.com"), false));
+      GURL("https://www.example.com")));
   ASSERT_TRUE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-      GURL("https://www.example.com/path?q=abc"), false));
-
-  // Disallow those URLs in incognito.
-  ASSERT_FALSE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-      GURL("http://www.example.com"), true));
-  ASSERT_FALSE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-      GURL("https://www.example.com"), true));
-  ASSERT_FALSE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-      GURL("https://www.example.com/path?q=abc"), true));
+      GURL("https://www.example.com/path?q=abc")));
 
   // Disallow browser-ui URLs.
   ASSERT_FALSE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-      GURL("about:blank"), false));
+      GURL("about:blank")));
   ASSERT_FALSE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-      GURL("chrome://newtab"), false));
+      GURL("chrome://newtab")));
   ASSERT_FALSE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-      GURL("chrome://settings"), false));
+      GURL("chrome://settings")));
 
   // Disallow invalid URLs.
+  ASSERT_FALSE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(GURL("")));
   ASSERT_FALSE(
-      QRCodeGeneratorBubbleController::IsGeneratorAvailable(GURL(""), false));
-  ASSERT_FALSE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-      GURL("NotAURL"), false));
+      QRCodeGeneratorBubbleController::IsGeneratorAvailable(GURL("NotAURL")));
 }
 
 TEST_F(QRCodeGeneratorBubbleControllerTest, UnavailableWithFeatureOff) {
@@ -64,11 +55,11 @@
 
   // Normally-available URLs should not be allowed when the feature is off.
   ASSERT_FALSE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-      GURL("http://www.example.com"), false));
+      GURL("http://www.example.com")));
   ASSERT_FALSE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-      GURL("https://www.example.com"), false));
+      GURL("https://www.example.com")));
   ASSERT_FALSE(QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-      GURL("https://www.example.com/path?q=abc"), false));
+      GURL("https://www.example.com/path?q=abc")));
 }
 
 }  // namespace qrcode_generator
diff --git a/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.cc b/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.cc
index 13a4042..a66bf708 100644
--- a/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.cc
+++ b/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.cc
@@ -159,7 +159,7 @@
 
 AutofillBubbleBase* AutofillBubbleHandlerImpl::ShowSaveAddressProfileBubble(
     content::WebContents* web_contents,
-    SaveAddressProfileBubbleController* controller,
+    SaveUpdateAddressProfileBubbleController* controller,
     bool is_user_gesture) {
   views::View* anchor_view = toolbar_button_provider_->GetAnchorView(
       PageActionIconType::kSaveAutofillAddress);
@@ -179,7 +179,7 @@
 
 AutofillBubbleBase* AutofillBubbleHandlerImpl::ShowUpdateAddressProfileBubble(
     content::WebContents* web_contents,
-    SaveAddressProfileBubbleController* controller,
+    SaveUpdateAddressProfileBubbleController* controller,
     bool is_user_gesture) {
   views::View* anchor_view = toolbar_button_provider_->GetAnchorView(
       PageActionIconType::kSaveAutofillAddress);
diff --git a/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.h b/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.h
index 9308140..aaca7846 100644
--- a/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.h
+++ b/chrome/browser/ui/views/autofill/autofill_bubble_handler_impl.h
@@ -51,11 +51,11 @@
       SaveUPIBubbleController* controller) override;
   AutofillBubbleBase* ShowSaveAddressProfileBubble(
       content::WebContents* web_contents,
-      SaveAddressProfileBubbleController* controller,
+      SaveUpdateAddressProfileBubbleController* controller,
       bool is_user_gesture) override;
   AutofillBubbleBase* ShowUpdateAddressProfileBubble(
       content::WebContents* web_contents,
-      SaveAddressProfileBubbleController* controller,
+      SaveUpdateAddressProfileBubbleController* controller,
       bool is_user_gesture) override;
   AutofillBubbleBase* ShowEditAddressProfileDialog(
       content::WebContents* web_contents,
diff --git a/chrome/browser/ui/views/autofill/save_address_profile_view.cc b/chrome/browser/ui/views/autofill/save_address_profile_view.cc
index a423f665..fcf06df 100644
--- a/chrome/browser/ui/views/autofill/save_address_profile_view.cc
+++ b/chrome/browser/ui/views/autofill/save_address_profile_view.cc
@@ -7,7 +7,7 @@
 #include "base/strings/string_util.h"
 #include "chrome/app/vector_icons/vector_icons.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/ui/autofill/save_address_profile_bubble_controller.h"
+#include "chrome/browser/ui/autofill/save_update_address_profile_bubble_controller.h"
 #include "chrome/browser/ui/views/accessibility/theme_tracking_non_accessible_image_view.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/grit/theme_resources.h"
@@ -184,7 +184,7 @@
 SaveAddressProfileView::SaveAddressProfileView(
     views::View* anchor_view,
     content::WebContents* web_contents,
-    SaveAddressProfileBubbleController* controller)
+    SaveUpdateAddressProfileBubbleController* controller)
     : LocationBarBubbleDelegateView(anchor_view, web_contents),
       controller_(controller) {
   DCHECK(base::FeatureList::IsEnabled(
@@ -192,11 +192,11 @@
   // TODO(crbug.com/1167060): Accept action should consider the selected
   // nickname when saving the address.
   SetAcceptCallback(base::BindOnce(
-      &SaveAddressProfileBubbleController::OnUserDecision,
+      &SaveUpdateAddressProfileBubbleController::OnUserDecision,
       base::Unretained(controller_),
       AutofillClient::SaveAddressProfileOfferUserDecision::kAccepted));
   SetCancelCallback(base::BindOnce(
-      &SaveAddressProfileBubbleController::OnUserDecision,
+      &SaveUpdateAddressProfileBubbleController::OnUserDecision,
       base::Unretained(controller_),
       AutofillClient::SaveAddressProfileOfferUserDecision::kDeclined));
 
@@ -218,7 +218,7 @@
   std::unique_ptr<views::ImageButton> edit_button =
       views::CreateVectorImageButtonWithNativeTheme(
           base::BindRepeating(
-              &SaveAddressProfileBubbleController::OnEditButtonClicked,
+              &SaveUpdateAddressProfileBubbleController::OnEditButtonClicked,
               base::Unretained(controller_)),
           vector_icons::kEditIcon, gfx::kFaviconSize);
   // TODO(crbug.com/1167060): Use internationalized string.
diff --git a/chrome/browser/ui/views/autofill/save_address_profile_view.h b/chrome/browser/ui/views/autofill/save_address_profile_view.h
index d02bb4c..1244445 100644
--- a/chrome/browser/ui/views/autofill/save_address_profile_view.h
+++ b/chrome/browser/ui/views/autofill/save_address_profile_view.h
@@ -17,7 +17,7 @@
 }  // namespace views
 
 namespace autofill {
-class SaveAddressProfileBubbleController;
+class SaveUpdateAddressProfileBubbleController;
 
 // This is the bubble views that is part of the flow for when the user submits a
 // form with an address profile that Autofill has not previously saved.
@@ -26,7 +26,7 @@
  public:
   SaveAddressProfileView(views::View* anchor_view,
                          content::WebContents* web_contents,
-                         SaveAddressProfileBubbleController* controller);
+                         SaveUpdateAddressProfileBubbleController* controller);
 
   SaveAddressProfileView(const SaveAddressProfileView&) = delete;
   SaveAddressProfileView& operator=(const SaveAddressProfileView&) = delete;
@@ -45,7 +45,7 @@
   void AddedToWidget() override;
 
  private:
-  SaveAddressProfileBubbleController* controller_;
+  SaveUpdateAddressProfileBubbleController* controller_;
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/save_address_profile_view_unittest.cc b/chrome/browser/ui/views/autofill/save_address_profile_view_unittest.cc
index 2f090db..26c268ec 100644
--- a/chrome/browser/ui/views/autofill/save_address_profile_view_unittest.cc
+++ b/chrome/browser/ui/views/autofill/save_address_profile_view_unittest.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/ui/views/autofill/save_address_profile_view.h"
 
 #include "base/test/scoped_feature_list.h"
-#include "chrome/browser/ui/autofill/save_address_profile_bubble_controller.h"
+#include "chrome/browser/ui/autofill/save_update_address_profile_bubble_controller.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/views/chrome_views_test_base.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
@@ -18,8 +18,8 @@
 
 namespace autofill {
 
-class MockSaveAddressProfileBubbleController
-    : public SaveAddressProfileBubbleController {
+class MockSaveUpdateAddressProfileBubbleController
+    : public SaveUpdateAddressProfileBubbleController {
  public:
   MOCK_METHOD(std::u16string, GetWindowTitle, (), (const, override));
   MOCK_METHOD(const AutofillProfile&, GetProfileToSave, (), (const, override));
@@ -64,7 +64,7 @@
     return address_profile_to_save_;
   }
   SaveAddressProfileView* view() { return view_; }
-  MockSaveAddressProfileBubbleController* mock_controller() {
+  MockSaveUpdateAddressProfileBubbleController* mock_controller() {
     return &mock_controller_;
   }
 
@@ -77,7 +77,8 @@
   std::unique_ptr<content::WebContents> test_web_contents_;
   std::unique_ptr<views::Widget> anchor_widget_;
   SaveAddressProfileView* view_;
-  testing::NiceMock<MockSaveAddressProfileBubbleController> mock_controller_;
+  testing::NiceMock<MockSaveUpdateAddressProfileBubbleController>
+      mock_controller_;
 };
 
 void SaveAddressProfileViewTest::CreateViewAndShow() {
diff --git a/chrome/browser/ui/views/autofill/update_address_profile_view.cc b/chrome/browser/ui/views/autofill/update_address_profile_view.cc
index 90ba7116..cfa386b 100644
--- a/chrome/browser/ui/views/autofill/update_address_profile_view.cc
+++ b/chrome/browser/ui/views/autofill/update_address_profile_view.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/ui/views/autofill/update_address_profile_view.h"
 
-#include "chrome/browser/ui/autofill/save_address_profile_bubble_controller.h"
+#include "chrome/browser/ui/autofill/save_update_address_profile_bubble_controller.h"
 #include "chrome/browser/ui/views/accessibility/theme_tracking_non_accessible_image_view.h"
 #include "chrome/grit/theme_resources.h"
 #include "components/autofill/core/common/autofill_features.h"
@@ -14,17 +14,17 @@
 UpdateAddressProfileView::UpdateAddressProfileView(
     views::View* anchor_view,
     content::WebContents* web_contents,
-    SaveAddressProfileBubbleController* controller)
+    SaveUpdateAddressProfileBubbleController* controller)
     : LocationBarBubbleDelegateView(anchor_view, web_contents),
       controller_(controller) {
   DCHECK(base::FeatureList::IsEnabled(
       features::kAutofillAddressProfileSavePrompt));
   SetAcceptCallback(base::BindOnce(
-      &SaveAddressProfileBubbleController::OnUserDecision,
+      &SaveUpdateAddressProfileBubbleController::OnUserDecision,
       base::Unretained(controller_),
       AutofillClient::SaveAddressProfileOfferUserDecision::kAccepted));
   SetCancelCallback(base::BindOnce(
-      &SaveAddressProfileBubbleController::OnUserDecision,
+      &SaveUpdateAddressProfileBubbleController::OnUserDecision,
       base::Unretained(controller_),
       AutofillClient::SaveAddressProfileOfferUserDecision::kDeclined));
 }
diff --git a/chrome/browser/ui/views/autofill/update_address_profile_view.h b/chrome/browser/ui/views/autofill/update_address_profile_view.h
index 711f5f8..0badda3 100644
--- a/chrome/browser/ui/views/autofill/update_address_profile_view.h
+++ b/chrome/browser/ui/views/autofill/update_address_profile_view.h
@@ -17,16 +17,17 @@
 }
 
 namespace autofill {
-class SaveAddressProfileBubbleController;
+class SaveUpdateAddressProfileBubbleController;
 
 // Shown after a user submits a form with an address profile that's slightly
 // different from an address profile previously saved.
 class UpdateAddressProfileView : public AutofillBubbleBase,
                                  public LocationBarBubbleDelegateView {
  public:
-  UpdateAddressProfileView(views::View* anchor_view,
-                           content::WebContents* web_contents,
-                           SaveAddressProfileBubbleController* controller);
+  UpdateAddressProfileView(
+      views::View* anchor_view,
+      content::WebContents* web_contents,
+      SaveUpdateAddressProfileBubbleController* controller);
 
   UpdateAddressProfileView(const UpdateAddressProfileView&) = delete;
   UpdateAddressProfileView& operator=(const UpdateAddressProfileView&) = delete;
@@ -45,7 +46,7 @@
   void AddedToWidget() override;
 
  private:
-  SaveAddressProfileBubbleController* controller_;
+  SaveUpdateAddressProfileBubbleController* controller_;
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/update_address_profile_view_unittest.cc b/chrome/browser/ui/views/autofill/update_address_profile_view_unittest.cc
index f2d3b0a..c12b097f 100644
--- a/chrome/browser/ui/views/autofill/update_address_profile_view_unittest.cc
+++ b/chrome/browser/ui/views/autofill/update_address_profile_view_unittest.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/ui/views/autofill/update_address_profile_view.h"
 
 #include "base/test/scoped_feature_list.h"
-#include "chrome/browser/ui/autofill/save_address_profile_bubble_controller.h"
+#include "chrome/browser/ui/autofill/save_update_address_profile_bubble_controller.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/views/chrome_views_test_base.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
@@ -18,8 +18,8 @@
 
 namespace autofill {
 
-class MockSaveAddressProfileBubbleController
-    : public SaveAddressProfileBubbleController {
+class MockSaveUpdateAddressProfileBubbleController
+    : public SaveUpdateAddressProfileBubbleController {
  public:
   MOCK_METHOD(std::u16string, GetWindowTitle, (), (const, override));
   MOCK_METHOD(const AutofillProfile&, GetProfileToSave, (), (const, override));
@@ -64,7 +64,7 @@
     return address_profile_to_save_;
   }
   UpdateAddressProfileView* view() { return view_; }
-  MockSaveAddressProfileBubbleController* mock_controller() {
+  MockSaveUpdateAddressProfileBubbleController* mock_controller() {
     return &mock_controller_;
   }
 
@@ -77,7 +77,8 @@
   std::unique_ptr<content::WebContents> test_web_contents_;
   std::unique_ptr<views::Widget> anchor_widget_;
   UpdateAddressProfileView* view_;
-  testing::NiceMock<MockSaveAddressProfileBubbleController> mock_controller_;
+  testing::NiceMock<MockSaveUpdateAddressProfileBubbleController>
+      mock_controller_;
 };
 
 void UpdateAddressProfileViewTest::CreateViewAndShow() {
diff --git a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_icon_view.cc b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_icon_view.cc
index cc3dbfb..4f6ec563 100644
--- a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_icon_view.cc
+++ b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_icon_view.cc
@@ -58,8 +58,7 @@
 
   bool feature_available =
       QRCodeGeneratorBubbleController::IsGeneratorAvailable(
-          web_contents->GetLastCommittedURL(),
-          web_contents->GetBrowserContext()->IsOffTheRecord());
+          web_contents->GetLastCommittedURL());
 
   bool visible = GetBubble() != nullptr ||
                  (feature_available && omnibox_view->model()->has_focus() &&
diff --git a/chrome/browser/ui/views/tabs/tab_icon.cc b/chrome/browser/ui/views/tabs/tab_icon.cc
index 974c8831..8829e1b 100644
--- a/chrome/browser/ui/views/tabs/tab_icon.cc
+++ b/chrome/browser/ui/views/tabs/tab_icon.cc
@@ -46,9 +46,7 @@
          url.host_piece() != chrome::kChromeUIAppLauncherPageHost &&
          url.host_piece() != chrome::kChromeUIHelpHost &&
          url.host_piece() != chrome::kChromeUIVersionHost &&
-         url.host_piece() != chrome::kChromeUINetExportHost &&
-         // Covers all default NTPs, including in incognito.
-         url.host_piece() != chrome::kChromeUINewTabHost;
+         url.host_piece() != chrome::kChromeUINetExportHost;
 }
 
 bool NetworkStateIsAnimated(TabNetworkState network_state) {
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_view.cc b/chrome/browser/ui/views/toolbar/toolbar_action_view.cc
index 9a26d61..b236789 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_action_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_action_view.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/ui/view_ids.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/extensions/extension_context_menu_controller.h"
+#include "chrome/browser/ui/views/toolbar/toolbar_button.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_ink_drop_util.h"
 #include "components/sessions/content/session_tab_helper.h"
 #include "content/public/browser/notification_source.h"
@@ -88,6 +89,12 @@
   return bounds;
 }
 
+void ToolbarActionView::OnThemeChanged() {
+  MenuButton::OnThemeChanged();
+
+  ToolbarButton::UpdateFocusRingColor(this, focus_ring());
+}
+
 std::unique_ptr<LabelButtonBorder> ToolbarActionView::CreateDefaultBorder()
     const {
   std::unique_ptr<LabelButtonBorder> border =
@@ -216,6 +223,8 @@
 void ToolbarActionView::AddedToWidget() {
   MenuButton::AddedToWidget();
 
+  ToolbarButton::UpdateFocusRingColor(this, focus_ring());
+
   // This cannot happen until there's a focus controller, which lives on the
   // widget.
   view_controller_->RegisterCommand();
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_view.h b/chrome/browser/ui/views/toolbar/toolbar_action_view.h
index 0ce959e..9eefcb7 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_action_view.h
+++ b/chrome/browser/ui/views/toolbar/toolbar_action_view.h
@@ -47,7 +47,7 @@
     virtual gfx::Size GetToolbarActionSize() = 0;
 
    protected:
-    ~Delegate() override {}
+    ~Delegate() override = default;
   };
 
   ToolbarActionView(ToolbarActionViewController* view_controller,
@@ -58,6 +58,7 @@
 
   // views::MenuButton:
   gfx::Rect GetAnchorBoundsInScreen() const override;
+  void OnThemeChanged() override;
   std::unique_ptr<views::LabelButtonBorder> CreateDefaultBorder()
       const override;
   bool IsTriggerableEvent(const ui::Event& event) override;
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
index 7b736f7b..583574c5 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -42,6 +42,7 @@
 #include "chrome/browser/ash/login/saml/saml_metric_utils.h"
 #include "chrome/browser/ash/login/screens/network_error.h"
 #include "chrome/browser/ash/login/screens/signin_fatal_error_screen.h"
+#include "chrome/browser/ash/login/session/user_session_manager.h"
 #include "chrome/browser/ash/login/signin_partition_manager.h"
 #include "chrome/browser/ash/login/ui/login_display_host.h"
 #include "chrome/browser/ash/login/ui/login_display_host_webui.h"
@@ -769,6 +770,17 @@
     return;
   }
 
+  // Record amount of time from the moment screen was shown till
+  // completeAuthentication signal come. Only for no SAML flow and only during
+  // first run in OOBE.
+  if (elapsed_timer_ && !using_saml &&
+      session_manager::SessionManager::Get()->session_state() ==
+          session_manager::SessionState::OOBE) {
+    base::UmaHistogramMediumTimes("OOBE.GaiaLoginTime",
+                                  elapsed_timer_->Elapsed());
+    elapsed_timer_.reset();
+  }
+
   const std::string sanitized_email = gaia::SanitizeEmail(email);
   LoginDisplayHost::default_host()->SetDisplayEmail(sanitized_email);
 
@@ -1112,6 +1124,7 @@
 
 void GaiaScreenHandler::Show() {
   ShowScreen(GaiaView::kScreenId);
+  elapsed_timer_ = std::make_unique<base::ElapsedTimer>();
   hidden_ = false;
 }
 
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
index 3931f6b6..f5174d10 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
@@ -28,6 +28,7 @@
 
 namespace base {
 class DictionaryValue;
+class ElapsedTimer;
 }  // namespace base
 
 namespace network {
@@ -399,6 +400,9 @@
 
   bool hidden_ = true;
 
+  // Used to record amount of time user needed for successful online login.
+  std::unique_ptr<base::ElapsedTimer> elapsed_timer_;
+
   std::string signin_partition_name_;
 
   // Handler for `samlChallengeMachineKey` request.
diff --git a/chrome/browser/ui/webui/management/management_ui_handler.cc b/chrome/browser/ui/webui/management/management_ui_handler.cc
index f54e5a11..efde47f 100644
--- a/chrome/browser/ui/webui/management/management_ui_handler.cc
+++ b/chrome/browser/ui/webui/management/management_ui_handler.cc
@@ -815,11 +815,16 @@
 base::Value ManagementUIHandler::GetManagedWebsitesInfo(
     Profile* profile) const {
   base::Value managed_websites(base::Value::Type::LIST);
-  for (const auto& entry :
-       ManagedConfigurationAPIFactory::GetForProfile(profile)
-           ->GetManagedOrigins()) {
+  auto* managed_configuration =
+      ManagedConfigurationAPIFactory::GetForProfile(profile);
+
+  if (!managed_configuration)
+    return managed_websites;
+
+  for (const auto& entry : managed_configuration->GetManagedOrigins()) {
     managed_websites.Append(entry.Serialize());
   }
+
   return managed_websites;
 }
 
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
index b4ebe83..00acc8a 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -508,5 +508,5 @@
     ui::ScaleFactor scale_factor) {
   return static_cast<base::RefCountedMemory*>(
       ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytesForScale(
-          IDR_PRODUCT_LOGO_16, scale_factor));
+          IDR_NTP_FAVICON, scale_factor));
 }
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index b2b62cc1..97bddf9c 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-master-1619524394-48033df19b0f37e24e0b0da6507e9b3956233bd0.profdata
+chrome-mac-master-1619546379-20f90ebeb75ecf41e96b23dab18358a4953a8c02.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 299f857f5..004edb94 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-master-1619524394-f046af2c1d0f74d493605f08cafed80e68639533.profdata
+chrome-win32-master-1619535568-f9f3d0e78e8e9d18be7f93808c31850e4c6dfdec.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 456cd4d9..1c6a7e2 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-master-1619524394-b127d25ce2bf50d36f6be1c0d07e9eb022985f6a.profdata
+chrome-win64-master-1619535568-e1590f0dc714ab34c1f50650a262ae1f1fca57d5.profdata
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 3fef855..3acc14a 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2457,7 +2457,10 @@
     # Browser tests for functionality that is only intended to be present in
     # ash-chrome, not lacros-chrome.
     if (is_chromeos_ash && !is_chromeos_lacros) {
-      sources += [ "../browser/ash/crosapi/screen_manager_ash_browsertest.cc" ]
+      sources += [
+        "../browser/ash/crosapi/browser_data_migrator_browsertest.cc",
+        "../browser/ash/crosapi/screen_manager_ash_browsertest.cc",
+      ]
     }
 
     # NOTE: This is the main "browser_tests" section for |is_chromeos_ash|.
@@ -4957,7 +4960,7 @@
       "../browser/ui/autofill/payments/local_card_migration_bubble_controller_impl_unittest.cc",
       "../browser/ui/autofill/payments/offer_notification_bubble_controller_impl_unittest.cc",
       "../browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc",
-      "../browser/ui/autofill/save_address_profile_bubble_controller_impl_unittest.cc",
+      "../browser/ui/autofill/save_update_address_profile_bubble_controller_impl_unittest.cc",
       "../browser/ui/bluetooth/bluetooth_chooser_controller_unittest.cc",
       "../browser/ui/bluetooth/bluetooth_scanning_prompt_controller_unittest.cc",
       "../browser/ui/media_router/cast_modes_with_media_sources_unittest.cc",
diff --git a/chrome/test/android/browsertests_apk/android_browsertests_jni_onload.cc b/chrome/test/android/browsertests_apk/android_browsertests_jni_onload.cc
index a70e3753..302c558 100644
--- a/chrome/test/android/browsertests_apk/android_browsertests_jni_onload.cc
+++ b/chrome/test/android/browsertests_apk/android_browsertests_jni_onload.cc
@@ -5,7 +5,6 @@
 #include <memory>
 
 #include "base/android/jni_android.h"
-#include "base/android/library_loader/library_loader_hooks.h"
 #include "chrome/app/android/chrome_jni_onload.h"
 #include "chrome/test/base/chrome_test_launcher.h"
 #include "content/public/app/content_jni_onload.h"
@@ -22,10 +21,6 @@
   if (!content::android::OnJNIOnLoadInit())
     return -1;
 
-  // Tests do not have a version so they expect the version number to be "" in
-  // java.
-  base::android::SetVersionNumber("");
-
   // This needs to be done before base::TestSuite::Initialize() is called,
   // as it also tries to set MessagePumpForUIFactory.
   base::MessagePump::OverrideMessagePumpForUIFactory(
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/OmniboxTestUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/OmniboxTestUtils.java
index beb4982..8ec6f4b 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/OmniboxTestUtils.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/OmniboxTestUtils.java
@@ -77,7 +77,7 @@
          * do not attempt to log selection.
          */
         @Override
-        public void onSuggestionSelected(int selectedIndex, int disposition, int hashCode, int type,
+        public void onSuggestionSelected(int selectedIndex, int disposition, int type,
                 String currentPageUrl, int pageClassification, long elapsedTimeSinceModified,
                 int completedLength, WebContents webContents) {}
 
@@ -102,7 +102,7 @@
             Pair<String, AutocompleteResult> autocompleteSet =
                     mAutocompleteResults.get(autocompleteText);
             if (autocompleteSet == null) return false;
-            onSuggestionsReceived(autocompleteSet.second, autocompleteSet.first, 0);
+            onSuggestionsReceived(autocompleteSet.second, autocompleteSet.first);
             return true;
         }
     }
diff --git a/chrome/test/chromedriver/BUILD.gn b/chrome/test/chromedriver/BUILD.gn
index dd6c4b66..31237143 100644
--- a/chrome/test/chromedriver/BUILD.gn
+++ b/chrome/test/chromedriver/BUILD.gn
@@ -4,6 +4,7 @@
 
 import("//build/config/python.gni")
 import("//build/config/ui.gni")
+import("//build/linux/strip_binary.gni")
 import("//build/util/lastchange.gni")
 import("//testing/test.gni")
 import("//third_party/ffmpeg/ffmpeg_options.gni")
@@ -305,7 +306,13 @@
   }
 }
 
-executable("chromedriver") {
+if (is_linux) {
+  chromedriver_output = "chromedriver.unstripped"
+} else {
+  chromedriver_output = "chromedriver"
+}
+
+executable("$chromedriver_output") {
   testonly = true
   sources = [ "server/chromedriver_server.cc" ]
 
@@ -328,6 +335,16 @@
   }
 }
 
+if (is_linux) {
+  strip_binary("chromedriver") {
+    testonly = true
+    binary_input = "$root_out_dir/$chromedriver_output"
+    symbol_output = "$root_out_dir/chromedriver.debug"
+    stripped_binary_output = "$root_out_dir/chromedriver"
+    deps = [ ":$chromedriver_output" ]
+  }
+}
+
 python_library("chromedriver_py_tests") {
   testonly = true
   deps = [
diff --git a/chrome/test/data/webui/chromeos/scanning/scan_done_section_test.js b/chrome/test/data/webui/chromeos/scanning/scan_done_section_test.js
index 91d01d3..0a8ee33 100644
--- a/chrome/test/data/webui/chromeos/scanning/scan_done_section_test.js
+++ b/chrome/test/data/webui/chromeos/scanning/scan_done_section_test.js
@@ -133,6 +133,22 @@
     assertTrue(doneEventFired);
   });
 
+  // Verify clicking the Show in folder button invokes showFileInLocation().
+  test('showInFolderButtonClick', () => {
+    const scannedFilePaths =
+        [{'path': '/test/path/scan1.jpg'}, {'path': '/test/path/scan2.jpg'}];
+    scanningBrowserProxy.setPathToFile(scannedFilePaths[1].path);
+    scanDoneSection.scannedFilePaths = scannedFilePaths;
+
+    return flushTasks().then(() => {
+      scanDoneSection.$$('#showInFolderButton').click();
+      return flushTasks().then(() => {
+        assertEquals(
+            1, scanningBrowserProxy.getCallCount('showFileInLocation'));
+      });
+    });
+  });
+
   // Verify clicking the edit button attempts to open the Media app with the
   // correct file paths.
   test('editButtonClick', () => {
diff --git a/chrome/test/data/webui/new_tab_page/modules/modules_test.js b/chrome/test/data/webui/new_tab_page/modules/modules_test.js
index 4c477ca..f55acbe3 100644
--- a/chrome/test/data/webui/new_tab_page/modules/modules_test.js
+++ b/chrome/test/data/webui/new_tab_page/modules/modules_test.js
@@ -4,10 +4,10 @@
 
 import {$$, Module, ModuleRegistry, ModulesElement, NewTabPageProxy} from 'chrome://new-tab-page/new_tab_page.js';
 
-import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
+import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {TestBrowserProxy} from '../../test_browser_proxy.m.js';
 import {fakeMetricsPrivate, MetricsTracker} from '../metrics_test_support.js';
-import {createMock} from '../test_support.js';
+import {assertNotStyle, assertStyle, createMock} from '../test_support.js';
 
 /** @return {!TestBrowserProxy} */
 function installMockHandler() {
@@ -79,6 +79,12 @@
       const moduleWrappers =
           modulesElement.shadowRoot.querySelectorAll('ntp-module-wrapper');
       assertEquals(2, moduleWrappers.length);
+      if (visible) {
+        assertNotStyle(moduleWrappers[0], 'display', 'none');
+      } else {
+        assertStyle(moduleWrappers[0], 'display', 'none');
+      }
+      assertStyle(moduleWrappers[1], 'display', 'none');
       const histogram = 'NewTabPage.Modules.EnabledOnNTPLoad';
       assertEquals(1, metrics.count(`${histogram}.foo`, visible));
       assertEquals(1, metrics.count(`${histogram}.bar`, false));
@@ -100,11 +106,14 @@
         element: document.createElement('div'),
       },
     ]);
+    callbackRouterRemote.setDisabledModules(false, []);
+    await callbackRouterRemote.$.flushForTesting();
 
     // Assert.
     const moduleWrappers =
         modulesElement.shadowRoot.querySelectorAll('ntp-module-wrapper');
     assertEquals(1, moduleWrappers.length);
+    assertNotStyle(moduleWrappers[0], 'display', 'none');
     assertFalse($$(modulesElement, '#removeModuleToast').open);
 
     // Act.
@@ -120,6 +129,7 @@
     }));
 
     // Assert.
+    assertStyle(moduleWrappers[0], 'display', 'none');
     assertTrue($$(modulesElement, '#removeModuleToast').open);
     assertEquals(
         'Foo',
@@ -132,6 +142,7 @@
     $$(modulesElement, '#undoRemoveModuleButton').click();
 
     // Assert.
+    assertNotStyle(moduleWrappers[0], 'display', 'none');
     assertFalse($$(modulesElement, '#removeModuleToast').open);
     assertTrue(restoreCalled);
     assertEquals('foo', handler.getArgs('onRestoreModule')[0]);
@@ -149,11 +160,14 @@
       },
       element: document.createElement('div'),
     }]);
+    callbackRouterRemote.setDisabledModules(false, []);
+    await callbackRouterRemote.$.flushForTesting();
 
     // Assert.
     const moduleWrappers =
         modulesElement.shadowRoot.querySelectorAll('ntp-module-wrapper');
     assertEquals(1, moduleWrappers.length);
+    assertNotStyle(moduleWrappers[0], 'display', 'none');
     assertFalse($$(modulesElement, '#removeModuleToast').open);
 
     // Act.
@@ -169,6 +183,14 @@
     }));
 
     // Assert.
+    assertDeepEquals(['foo', true], handler.getArgs('setModuleDisabled')[0]);
+
+    // Act.
+    callbackRouterRemote.setDisabledModules(false, ['foo']);
+    await callbackRouterRemote.$.flushForTesting();
+
+    // Assert.
+    assertStyle(moduleWrappers[0], 'display', 'none');
     assertTrue($$(modulesElement, '#removeModuleToast').open);
     assertEquals(
         'Foo',
@@ -182,6 +204,14 @@
     $$(modulesElement, '#undoRemoveModuleButton').click();
 
     // Assert.
+    assertDeepEquals(['foo', false], handler.getArgs('setModuleDisabled')[1]);
+
+    // Act.
+    callbackRouterRemote.setDisabledModules(false, []);
+    await callbackRouterRemote.$.flushForTesting();
+
+    // Assert.
+    assertNotStyle(moduleWrappers[0], 'display', 'none');
     assertFalse($$(modulesElement, '#removeModuleToast').open);
     assertTrue(restoreCalled);
     assertEquals(1, metrics.count('NewTabPage.Modules.Enabled', 'foo'));
diff --git a/chrome/test/data/webui/new_tab_page/test_support.js b/chrome/test/data/webui/new_tab_page/test_support.js
index 64b6161..9f332cc 100644
--- a/chrome/test/data/webui/new_tab_page/test_support.js
+++ b/chrome/test/data/webui/new_tab_page/test_support.js
@@ -20,7 +20,7 @@
 
 /**
  * Asserts the computed style value for an element.
- * @param {!HTMLElement} element The element.
+ * @param {!Element} element The element.
  * @param {string} name The name of the style to assert.
  * @param {string} expected The expected style value.
  */
@@ -31,7 +31,7 @@
 
 /**
  * Asserts the computed style for an element is not value.
- * @param {!HTMLElement} element The element.
+ * @param {!Element} element The element.
  * @param {string} name The name of the style to assert.
  * @param {string} not The value the style should not be.
  */
diff --git a/chromecast/public/reboot_shlib.h b/chromecast/public/reboot_shlib.h
index 1fd01e03..73fee78 100644
--- a/chromecast/public/reboot_shlib.h
+++ b/chromecast/public/reboot_shlib.h
@@ -94,6 +94,15 @@
     // bugs. In that case, business logic can't proceed and busy references
     // can't be trusted, so a dirty reboot will be executed.
     MULTI_SERVICE_BUG = 17,
+
+    // Intentional shutdown by power manager of battery powered devices.
+    POWER_MANAGER_SHUTDOWN = 18,
+
+    // Restart of the Cast component to apply changes due to an experiment flag
+    // value change. This is only used to handle flag changes that would be more
+    // risky to attempt without a full process restart. Very few experiments
+    // trigger this path.
+    EXPERIMENT_CHANGE = 19,
   };
 
   // Initializes any platform-specific reboot systems.
diff --git a/chromecast/system/reboot/reboot_util_core.cc b/chromecast/system/reboot/reboot_util_core.cc
index da32813..4abcfe0 100644
--- a/chromecast/system/reboot/reboot_util_core.cc
+++ b/chromecast/system/reboot/reboot_util_core.cc
@@ -46,6 +46,8 @@
     case RebootShlib::RebootSource::GRACEFUL_RESTART:
     case RebootShlib::RebootSource::UNGRACEFUL_RESTART:
     case RebootShlib::RebootSource::MULTI_SERVICE_BUG:
+    case RebootShlib::RebootSource::POWER_MANAGER_SHUTDOWN:
+    case RebootShlib::RebootSource::EXPERIMENT_CHANGE:
       return true;
     default:
       return false;
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index 0806ed81..2da5e8f 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -659,6 +659,9 @@
         =1 {Edit file}
         other {Edit files}}
       </message>
+      <message name="IDS_SCANNING_APP_SHOW_IN_FOLDER_BUTTON_LABEL" desc="The label for the button that opens the files app in the location of the saved scan.">
+        Show in folder
+      </message>
 
       <!-- Diagnostics App -->
       <message name="IDS_DIAGNOSTICS_TITLE" desc="The title of the diagnostics app.">
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SHOW_IN_FOLDER_BUTTON_LABEL.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SHOW_IN_FOLDER_BUTTON_LABEL.png.sha1
new file mode 100644
index 0000000..0275c7a8
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_SHOW_IN_FOLDER_BUTTON_LABEL.png.sha1
@@ -0,0 +1 @@
+5abb7f7216fd5f56406ae9350ef342e6a4c4ef53
\ No newline at end of file
diff --git a/chromeos/dbus/rmad/OWNERS b/chromeos/dbus/rmad/OWNERS
new file mode 100644
index 0000000..4822e6f6
--- /dev/null
+++ b/chromeos/dbus/rmad/OWNERS
@@ -0,0 +1,3 @@
+# Primary Owners
+joonbug@chromium.org
+zentaro@chromium.org
diff --git a/chromeos/dbus/rmad/fake_rmad_client.cc b/chromeos/dbus/rmad/fake_rmad_client.cc
index 5bb2d69..5f8f6a1 100644
--- a/chromeos/dbus/rmad/fake_rmad_client.cc
+++ b/chromeos/dbus/rmad/fake_rmad_client.cc
@@ -10,7 +10,7 @@
 FakeRmadClient::~FakeRmadClient() = default;
 
 void FakeRmadClient::GetCurrentState(
-    DBusMethodCallback<rmad::GetCurrentStateReply> callback) {
+    DBusMethodCallback<rmad::GetStateReply> callback) {
   // TODO(gavindodd): Implement fake state.
   std::move(callback).Run(base::nullopt);
 }
diff --git a/chromeos/dbus/rmad/fake_rmad_client.h b/chromeos/dbus/rmad/fake_rmad_client.h
index 927f39c..0c63a71 100644
--- a/chromeos/dbus/rmad/fake_rmad_client.h
+++ b/chromeos/dbus/rmad/fake_rmad_client.h
@@ -6,7 +6,6 @@
 #define CHROMEOS_DBUS_RMAD_FAKE_RMAD_CLIENT_H_
 
 #include "base/component_export.h"
-#include "chromeos/dbus/rmad/rmad.pb.h"
 #include "chromeos/dbus/rmad/rmad_client.h"
 
 namespace chromeos {
@@ -19,7 +18,7 @@
   ~FakeRmadClient() override;
 
   void GetCurrentState(
-      DBusMethodCallback<rmad::GetCurrentStateReply> callback) override;
+      DBusMethodCallback<rmad::GetStateReply> callback) override;
 };
 
 }  // namespace chromeos
diff --git a/chromeos/dbus/rmad/rmad_client.cc b/chromeos/dbus/rmad/rmad_client.cc
index 7ac0e7e..96bc6dec 100644
--- a/chromeos/dbus/rmad/rmad_client.cc
+++ b/chromeos/dbus/rmad/rmad_client.cc
@@ -22,7 +22,7 @@
  public:
   void Init(dbus::Bus* bus);
   void GetCurrentState(
-      DBusMethodCallback<rmad::GetCurrentStateReply> callback) override;
+      DBusMethodCallback<rmad::GetStateReply> callback) override;
 
   RmadClientImpl() = default;
   RmadClientImpl(const RmadClientImpl&) = delete;
@@ -30,9 +30,8 @@
   ~RmadClientImpl() override = default;
 
  private:
-  void OnGetCurrentStateMethod(
-      DBusMethodCallback<rmad::GetCurrentStateReply> callback,
-      dbus::Response* response);
+  void OnGetCurrentStateMethod(DBusMethodCallback<rmad::GetStateReply> callback,
+                               dbus::Response* response);
 
   dbus::ObjectProxy* rmad_proxy_ = nullptr;
 
@@ -47,18 +46,10 @@
 }
 
 void RmadClientImpl::GetCurrentState(
-    DBusMethodCallback<rmad::GetCurrentStateReply> callback) {
+    DBusMethodCallback<rmad::GetStateReply> callback) {
   dbus::MethodCall method_call(rmad::kRmadInterfaceName,
                                rmad::kGetCurrentStateMethod);
   dbus::MessageWriter writer(&method_call);
-  // Create the empty request proto.
-  rmad::GetCurrentStateRequest protobuf_request;
-  if (!writer.AppendProtoAsArrayOfBytes(protobuf_request)) {
-    LOG(ERROR) << "Error constructing message for "
-               << rmad::kGetCurrentStateMethod;
-    std::move(callback).Run(base::nullopt);
-    return;
-  }
   rmad_proxy_->CallMethod(
       &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
       base::BindOnce(&RmadClientImpl::OnGetCurrentStateMethod,
@@ -66,7 +57,7 @@
 }
 
 void RmadClientImpl::OnGetCurrentStateMethod(
-    DBusMethodCallback<rmad::GetCurrentStateReply> callback,
+    DBusMethodCallback<rmad::GetStateReply> callback,
     dbus::Response* response) {
   if (!response) {
     LOG(ERROR) << "Error calling " << rmad::kGetCurrentStateMethod;
@@ -75,13 +66,8 @@
   }
 
   dbus::MessageReader reader(response);
-  rmad::GetCurrentStateReply response_proto;
-  if (!reader.PopArrayOfBytesAsProto(&response_proto)) {
-    LOG(ERROR) << "Unable to decode " << rmad::kGetCurrentStateMethod
-               << " response";
-    std::move(callback).Run(base::nullopt);
-    return;
-  }
+  rmad::GetStateReply response_proto;
+  // TODO(gavindodd): pop the proto.
 
   std::move(callback).Run(response_proto);
 }
diff --git a/chromeos/dbus/rmad/rmad_client.h b/chromeos/dbus/rmad/rmad_client.h
index 1a4db79e..e1b09d3 100644
--- a/chromeos/dbus/rmad/rmad_client.h
+++ b/chromeos/dbus/rmad/rmad_client.h
@@ -7,12 +7,20 @@
 
 #include "base/component_export.h"
 #include "chromeos/dbus/dbus_method_call_status.h"
-#include "chromeos/dbus/rmad/rmad.pb.h"
 
 namespace dbus {
 class Bus;
 }
 
+// Temporary to allow code to compile while prototype rmad.proto is replaced.
+namespace rmad {
+class GetStateReply {
+ public:
+  int state() { return 0; }
+};
+
+}  // namespace rmad
+
 namespace chromeos {
 
 // RmadClient is responsible for receiving D-bus signals from the RmaDaemon
@@ -37,7 +45,7 @@
   // Asynchronously gets the current RMA state.
   // The state contains an error code and the current state of the RMA process.
   virtual void GetCurrentState(
-      DBusMethodCallback<rmad::GetCurrentStateReply> callback) = 0;
+      DBusMethodCallback<rmad::GetStateReply> callback) = 0;
 
  protected:
   // Initialize/Shutdown should be used instead.
diff --git a/components/browser_ui/contacts_picker/android/contacts_picker_feature_list.cc b/components/browser_ui/contacts_picker/android/contacts_picker_feature_list.cc
index 95195ed3..2d0d737a 100644
--- a/components/browser_ui/contacts_picker/android/contacts_picker_feature_list.cc
+++ b/components/browser_ui/contacts_picker/android/contacts_picker_feature_list.cc
@@ -5,8 +5,6 @@
 #include "base/android/jni_string.h"
 #include "base/feature_list.h"
 #include "base/notreached.h"
-#include "base/stl_util.h"
-
 #include "components/browser_ui/contacts_picker/android/contacts_picker_jni_headers/ContactsPickerFeatureList_jni.h"
 #include "components/browser_ui/contacts_picker/android/features.h"
 
@@ -20,15 +18,15 @@
 // Array of features exposed through the Java ContentFeatureList API. Entries in
 // this array may either refer to features defined in the header of this file or
 // in other locations in the code base (e.g. content_features.h).
-const base::Feature* kFeaturesExposedToJava[] = {
+const base::Feature* const kFeaturesExposedToJava[] = {
     &kContactsPickerSelectAll,
 };
 
 // TODO(crbug.com/1060097): Remove this once a generalized FeatureList exists.
 const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
-  for (size_t i = 0; i < base::size(kFeaturesExposedToJava); ++i) {
-    if (kFeaturesExposedToJava[i]->name == feature_name)
-      return kFeaturesExposedToJava[i];
+  for (const base::Feature* feature : kFeaturesExposedToJava) {
+    if (feature->name == feature_name)
+      return feature;
   }
   NOTREACHED() << "Queried feature not found in ContactsPickerFeatureList: "
                << feature_name;
diff --git a/components/browser_ui/site_settings/android/site_settings_feature_list.cc b/components/browser_ui/site_settings/android/site_settings_feature_list.cc
index 71f5492..8670bc96 100644
--- a/components/browser_ui/site_settings/android/site_settings_feature_list.cc
+++ b/components/browser_ui/site_settings/android/site_settings_feature_list.cc
@@ -5,8 +5,6 @@
 #include "base/android/jni_string.h"
 #include "base/feature_list.h"
 #include "base/notreached.h"
-#include "base/stl_util.h"
-
 #include "components/browser_ui/site_settings/android/features.h"
 #include "components/browser_ui/site_settings/android/site_settings_jni_headers/SiteSettingsFeatureList_jni.h"
 
@@ -20,16 +18,16 @@
 // Array of features exposed through the Java ContentFeatureList API. Entries in
 // this array may either refer to features defined in the header of this file or
 // in other locations in the code base (e.g. content_features.h).
-const base::Feature* kFeaturesExposedToJava[] = {
+const base::Feature* const kFeaturesExposedToJava[] = {
     &kAppNotificationStatusMessaging,
     &kActionableContentSettings,
 };
 
 // TODO(crbug.com/1060097): Remove this once a generalized FeatureList exists.
 const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
-  for (size_t i = 0; i < base::size(kFeaturesExposedToJava); ++i) {
-    if (kFeaturesExposedToJava[i]->name == feature_name)
-      return kFeaturesExposedToJava[i];
+  for (const base::Feature* feature : kFeaturesExposedToJava) {
+    if (feature->name == feature_name)
+      return feature;
   }
   NOTREACHED() << "Queried feature not found in SiteSettingsFeatureList: "
                << feature_name;
diff --git a/components/browsing_data/content/BUILD.gn b/components/browsing_data/content/BUILD.gn
index 2d0ff22..74eebd4 100644
--- a/components/browsing_data/content/BUILD.gn
+++ b/components/browsing_data/content/BUILD.gn
@@ -41,6 +41,7 @@
     "//components/content_settings/core/common",
     "//components/no_state_prefetch/browser",
     "//components/prefs",
+    "//components/services/storage/public/cpp",
     "//components/site_isolation",
     "//content/public/browser",
     "//net",
@@ -97,6 +98,7 @@
   deps = [
     ":content",
     "//base",
+    "//components/services/storage/public/cpp",
     "//content/public/browser",
     "//testing/gtest",
     "//url",
diff --git a/components/browsing_data/content/local_shared_objects_container.cc b/components/browsing_data/content/local_shared_objects_container.cc
index f6c6b871..5233e8d 100644
--- a/components/browsing_data/content/local_shared_objects_container.cc
+++ b/components/browsing_data/content/local_shared_objects_container.cc
@@ -196,7 +196,7 @@
     hosts.insert(origin.host());
 
   for (const auto& info : shared_workers()->GetSharedWorkerInfo())
-    hosts.insert(info.constructor_origin.host());
+    hosts.insert(info.storage_key.origin().host());
 
   for (const auto& origin : cache_storages()->GetOrigins())
     hosts.insert(origin.host());
diff --git a/components/browsing_data/content/mock_shared_worker_helper.cc b/components/browsing_data/content/mock_shared_worker_helper.cc
index ddbb001..bad017d7 100644
--- a/components/browsing_data/content/mock_shared_worker_helper.cc
+++ b/components/browsing_data/content/mock_shared_worker_helper.cc
@@ -6,6 +6,7 @@
 
 #include "base/callback.h"
 #include "base/containers/contains.h"
+#include "components/services/storage/public/cpp/storage_key.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/storage_partition.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -28,8 +29,8 @@
 void MockSharedWorkerHelper::DeleteSharedWorker(
     const GURL& worker,
     const std::string& name,
-    const url::Origin& constructor_origin) {
-  SharedWorkerInfo key(worker, name, constructor_origin);
+    const storage::StorageKey& storage_key) {
+  SharedWorkerInfo key(worker, name, storage_key);
   ASSERT_TRUE(base::Contains(workers_, key));
   workers_[key] = false;
 }
@@ -37,15 +38,15 @@
 void MockSharedWorkerHelper::AddSharedWorkerSamples() {
   GURL worker1("https://sharedworkerhost1:1/app/worker.js");
   std::string name1("my worker");
-  url::Origin constructor_origin1 = url::Origin::Create(worker1);
+  storage::StorageKey storage_key1(url::Origin::Create(worker1));
   GURL worker2("https://sharedworkerhost2:2/worker.js");
   std::string name2("another worker");
-  url::Origin constructor_origin2 = url::Origin::Create(worker2);
+  storage::StorageKey storage_key2(url::Origin::Create(worker2));
 
-  response_.push_back({worker1, name1, constructor_origin1});
-  response_.push_back({worker2, name2, constructor_origin2});
-  workers_[{worker1, name1, constructor_origin1}] = true;
-  workers_[{worker2, name2, constructor_origin2}] = true;
+  response_.emplace_back(worker1, name1, storage_key1);
+  response_.emplace_back(worker2, name2, storage_key2);
+  workers_[{worker1, name1, storage_key1}] = true;
+  workers_[{worker2, name2, storage_key2}] = true;
 }
 
 void MockSharedWorkerHelper::Notify() {
diff --git a/components/browsing_data/content/mock_shared_worker_helper.h b/components/browsing_data/content/mock_shared_worker_helper.h
index f6a01e4..464f124 100644
--- a/components/browsing_data/content/mock_shared_worker_helper.h
+++ b/components/browsing_data/content/mock_shared_worker_helper.h
@@ -14,6 +14,10 @@
 class BrowserContext;
 }
 
+namespace storage {
+class StorageKey;
+}  // namespace storage
+
 namespace browsing_data {
 
 class MockSharedWorkerHelper : public SharedWorkerHelper {
@@ -37,7 +41,7 @@
   void StartFetching(FetchCallback callback) override;
   void DeleteSharedWorker(const GURL& worker,
                           const std::string& name,
-                          const url::Origin& constructor_origin) override;
+                          const storage::StorageKey& storage_key) override;
 
  private:
   ~MockSharedWorkerHelper() override;
diff --git a/components/browsing_data/content/shared_worker_helper.cc b/components/browsing_data/content/shared_worker_helper.cc
index 4c838c4..d9c10ae 100644
--- a/components/browsing_data/content/shared_worker_helper.cc
+++ b/components/browsing_data/content/shared_worker_helper.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/location.h"
 #include "components/browsing_data/content/browsing_data_helper.h"
+#include "components/services/storage/public/cpp/storage_key.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/shared_worker_service.h"
@@ -20,8 +21,8 @@
 SharedWorkerHelper::SharedWorkerInfo::SharedWorkerInfo(
     const GURL& worker,
     const std::string& name,
-    const url::Origin& constructor_origin)
-    : worker(worker), name(name), constructor_origin(constructor_origin) {}
+    const storage::StorageKey& storage_key)
+    : worker(worker), name(name), storage_key(storage_key) {}
 
 SharedWorkerHelper::SharedWorkerInfo::SharedWorkerInfo(
     const SharedWorkerInfo& other) = default;
@@ -30,8 +31,8 @@
 
 bool SharedWorkerHelper::SharedWorkerInfo::operator<(
     const SharedWorkerInfo& other) const {
-  return std::tie(worker, name, constructor_origin) <
-         std::tie(other.worker, other.name, other.constructor_origin);
+  return std::tie(worker, name, storage_key) <
+         std::tie(other.worker, other.name, other.storage_key);
 }
 
 SharedWorkerHelper::SharedWorkerHelper(
@@ -53,10 +54,10 @@
 void SharedWorkerHelper::DeleteSharedWorker(
     const GURL& worker,
     const std::string& name,
-    const url::Origin& constructor_origin) {
+    const storage::StorageKey& storage_key) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  storage_partition_->GetSharedWorkerService()->TerminateWorker(
-      worker, name, constructor_origin);
+  storage_partition_->GetSharedWorkerService()->TerminateWorker(worker, name,
+                                                                storage_key);
 }
 
 CannedSharedWorkerHelper::CannedSharedWorkerHelper(
@@ -68,12 +69,12 @@
 void CannedSharedWorkerHelper::AddSharedWorker(
     const GURL& worker,
     const std::string& name,
-    const url::Origin& constructor_origin) {
+    const storage::StorageKey& storage_key) {
   if (!HasWebScheme(worker))
     return;  // Non-websafe state is not considered browsing data.
 
   pending_shared_worker_info_.insert(
-      SharedWorkerInfo(worker, name, constructor_origin));
+      SharedWorkerInfo(worker, name, storage_key));
 }
 
 void CannedSharedWorkerHelper::Reset() {
@@ -107,13 +108,13 @@
 void CannedSharedWorkerHelper::DeleteSharedWorker(
     const GURL& worker,
     const std::string& name,
-    const url::Origin& constructor_origin) {
+    const storage::StorageKey& storage_key) {
   for (auto it = pending_shared_worker_info_.begin();
        it != pending_shared_worker_info_.end();) {
     if (it->worker == worker && it->name == name &&
-        it->constructor_origin == constructor_origin) {
+        it->storage_key == storage_key) {
       SharedWorkerHelper::DeleteSharedWorker(it->worker, it->name,
-                                             it->constructor_origin);
+                                             it->storage_key);
       it = pending_shared_worker_info_.erase(it);
     } else {
       ++it;
diff --git a/components/browsing_data/content/shared_worker_helper.h b/components/browsing_data/content/shared_worker_helper.h
index ff00b0f0..916a186a 100644
--- a/components/browsing_data/content/shared_worker_helper.h
+++ b/components/browsing_data/content/shared_worker_helper.h
@@ -14,6 +14,7 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "components/services/storage/public/cpp/storage_key.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 
@@ -33,7 +34,7 @@
   struct SharedWorkerInfo {
     SharedWorkerInfo(const GURL& worker,
                      const std::string& name,
-                     const url::Origin& constructor_origin);
+                     const storage::StorageKey& storage_key);
     SharedWorkerInfo(const SharedWorkerInfo& other);
     ~SharedWorkerInfo();
 
@@ -41,7 +42,7 @@
 
     GURL worker;
     std::string name;
-    url::Origin constructor_origin;
+    storage::StorageKey storage_key;
   };
 
   using FetchCallback =
@@ -57,7 +58,7 @@
   // Requests the given Shared Worker to be deleted.
   virtual void DeleteSharedWorker(const GURL& worker,
                                   const std::string& name,
-                                  const url::Origin& constructor_origin);
+                                  const storage::StorageKey& storage_key);
 
  protected:
   virtual ~SharedWorkerHelper();
@@ -82,7 +83,7 @@
   // this helper.
   void AddSharedWorker(const GURL& worker,
                        const std::string& name,
-                       const url::Origin& constructor_origin);
+                       const storage::StorageKey& storage_key);
 
   // Clears the list of canned Shared Workers.
   void Reset();
@@ -101,7 +102,7 @@
   void StartFetching(FetchCallback callback) override;
   void DeleteSharedWorker(const GURL& worker,
                           const std::string& name,
-                          const url::Origin& constructor_origin) override;
+                          const storage::StorageKey& storage_key) override;
 
  private:
   ~CannedSharedWorkerHelper() override;
diff --git a/components/browsing_data/content/shared_worker_helper_unittest.cc b/components/browsing_data/content/shared_worker_helper_unittest.cc
index edb167d..bd2649e 100644
--- a/components/browsing_data/content/shared_worker_helper_unittest.cc
+++ b/components/browsing_data/content/shared_worker_helper_unittest.cc
@@ -27,13 +27,14 @@
 TEST_F(CannedSharedWorkerHelperTest, Empty) {
   const GURL worker("https://host1:1/worker.js");
   std::string name("test");
-  const url::Origin constructor_origin = url::Origin::Create(worker);
+  const storage::StorageKey storage_key =
+      storage::StorageKey(url::Origin::Create(worker));
 
   auto helper = base::MakeRefCounted<CannedSharedWorkerHelper>(
       content::BrowserContext::GetDefaultStoragePartition(browser_context()));
 
   EXPECT_TRUE(helper->empty());
-  helper->AddSharedWorker(worker, name, constructor_origin);
+  helper->AddSharedWorker(worker, name, storage_key);
   EXPECT_FALSE(helper->empty());
   helper->Reset();
   EXPECT_TRUE(helper->empty());
@@ -42,19 +43,19 @@
 TEST_F(CannedSharedWorkerHelperTest, Delete) {
   const GURL worker1("http://host1:9000/worker.js");
   std::string name1("name");
-  const url::Origin constructor_origin1 = url::Origin::Create(worker1);
+  const storage::StorageKey storage_key1(url::Origin::Create(worker1));
   const GURL worker2("https://example.com/worker.js");
   std::string name2("name");
-  const url::Origin constructor_origin2 = url::Origin::Create(worker2);
+  const storage::StorageKey storage_key2(url::Origin::Create(worker2));
 
   auto helper = base::MakeRefCounted<CannedSharedWorkerHelper>(
       content::BrowserContext::GetDefaultStoragePartition(browser_context()));
 
   EXPECT_TRUE(helper->empty());
-  helper->AddSharedWorker(worker1, name1, constructor_origin1);
-  helper->AddSharedWorker(worker2, name2, constructor_origin2);
+  helper->AddSharedWorker(worker1, name1, storage_key1);
+  helper->AddSharedWorker(worker2, name2, storage_key2);
   EXPECT_EQ(2u, helper->GetSharedWorkerCount());
-  helper->DeleteSharedWorker(worker2, name2, constructor_origin2);
+  helper->DeleteSharedWorker(worker2, name2, storage_key2);
   EXPECT_EQ(1u, helper->GetSharedWorkerCount());
 }
 
@@ -62,16 +63,16 @@
   const GURL worker1("chrome-extension://abcdefghijklmnopqrstuvwxyz/worker.js");
   const GURL worker2("devtools://abcdefghijklmnopqrstuvwxyz/worker.js");
   std::string name("name");
-  const url::Origin constructor_origin1 = url::Origin::Create(worker1);
-  const url::Origin constructor_origin2 = url::Origin::Create(worker2);
+  const storage::StorageKey storage_key1(url::Origin::Create(worker1));
+  const storage::StorageKey storage_key2(url::Origin::Create(worker2));
 
   auto helper = base::MakeRefCounted<CannedSharedWorkerHelper>(
       content::BrowserContext::GetDefaultStoragePartition(browser_context()));
 
   EXPECT_TRUE(helper->empty());
-  helper->AddSharedWorker(worker1, name, constructor_origin1);
+  helper->AddSharedWorker(worker1, name, storage_key1);
   EXPECT_TRUE(helper->empty());
-  helper->AddSharedWorker(worker2, name, constructor_origin2);
+  helper->AddSharedWorker(worker2, name, storage_key2);
   EXPECT_TRUE(helper->empty());
 }
 
diff --git a/components/content_creation/notes/android/BUILD.gn b/components/content_creation/notes/android/BUILD.gn
index e6678045..e45e09b0 100644
--- a/components/content_creation/notes/android/BUILD.gn
+++ b/components/content_creation/notes/android/BUILD.gn
@@ -9,6 +9,7 @@
   sources = [
     "java/src/org/chromium/components/content_creation/notes/NoteService.java",
     "java/src/org/chromium/components/content_creation/notes/bridges/NoteServiceBridge.java",
+    "java/src/org/chromium/components/content_creation/notes/bridges/NoteTemplateConversionBridge.java",
     "java/src/org/chromium/components/content_creation/notes/models/NoteTemplate.java",
   ]
 
@@ -19,13 +20,18 @@
 }
 
 generate_jni("jni_headers") {
-  sources = [ "java/src/org/chromium/components/content_creation/notes/bridges/NoteServiceBridge.java" ]
+  sources = [
+    "java/src/org/chromium/components/content_creation/notes/bridges/NoteServiceBridge.java",
+    "java/src/org/chromium/components/content_creation/notes/bridges/NoteTemplateConversionBridge.java",
+  ]
 }
 
 source_set("android") {
   sources = [
     "note_service_bridge.cc",
     "note_service_bridge.h",
+    "note_template_conversion_bridge.cc",
+    "note_template_conversion_bridge.h",
   ]
 
   deps = [
diff --git a/components/content_creation/notes/android/java/src/org/chromium/components/content_creation/notes/bridges/NoteTemplateConversionBridge.java b/components/content_creation/notes/android/java/src/org/chromium/components/content_creation/notes/bridges/NoteTemplateConversionBridge.java
new file mode 100644
index 0000000..b8c26b9c
--- /dev/null
+++ b/components/content_creation/notes/android/java/src/org/chromium/components/content_creation/notes/bridges/NoteTemplateConversionBridge.java
@@ -0,0 +1,45 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// 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_creation.notes.bridges;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.components.content_creation.notes.models.NoteTemplate;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Bridge class in charge of creating Java NoteTemplate instances based on their
+ * native struct counterpart.
+ */
+@JNINamespace("content_creation")
+public class NoteTemplateConversionBridge {
+    /**
+     * Creates an empty Java List instance to be used in native.
+     * @return a reference to an empty Java List.
+     */
+    @CalledByNative
+    private static List<NoteTemplate> createTemplateList() {
+        return new ArrayList<>();
+    }
+
+    /**
+     * Creates a {@link NoteTemplate} instance based on the given parameters,
+     * and then attempts to add it to the given list.
+     * @return the {@link NoteTemplate} instance.
+     */
+    @CalledByNative
+    private static NoteTemplate createTemplateAndMaybeAddToList(
+            @Nullable List<NoteTemplate> list, String localizedName) {
+        NoteTemplate template = new NoteTemplate(localizedName);
+
+        if (list != null) {
+            list.add(template);
+        }
+
+        return template;
+    }
+}
\ No newline at end of file
diff --git a/components/content_creation/notes/android/note_service_bridge.cc b/components/content_creation/notes/android/note_service_bridge.cc
index b62509da..f0e6840 100644
--- a/components/content_creation/notes/android/note_service_bridge.cc
+++ b/components/content_creation/notes/android/note_service_bridge.cc
@@ -8,6 +8,8 @@
 #include "base/android/jni_array.h"
 #include "base/bind.h"
 #include "components/content_creation/notes/android/jni_headers/NoteServiceBridge_jni.h"
+#include "components/content_creation/notes/android/jni_headers/NoteTemplateConversionBridge_jni.h"
+#include "components/content_creation/notes/android/note_template_conversion_bridge.h"
 #include "components/content_creation/notes/core/notes_types.h"
 
 using base::android::AttachCurrentThread;
@@ -18,7 +20,10 @@
 
 void RunGetTemplatesCallback(const JavaRef<jobject>& j_callback,
                              std::vector<NoteTemplate> templates) {
-  // TODO(crbug.com/1194168): Invoke callback with templates as Java objects.
+  JNIEnv* env = AttachCurrentThread();
+  RunObjectCallbackAndroid(
+      j_callback,
+      NoteTemplateConversionBridge::CreateJavaNoteTemplates(env, templates));
 }
 
 }  // namespace
diff --git a/components/content_creation/notes/android/note_template_conversion_bridge.cc b/components/content_creation/notes/android/note_template_conversion_bridge.cc
new file mode 100644
index 0000000..442edc9
--- /dev/null
+++ b/components/content_creation/notes/android/note_template_conversion_bridge.cc
@@ -0,0 +1,42 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/content_creation/notes/android/note_template_conversion_bridge.h"
+
+#include "base/android/jni_string.h"
+#include "components/content_creation/notes/android/jni_headers/NoteTemplateConversionBridge_jni.h"
+
+namespace content_creation {
+
+using base::android::ConvertUTF8ToJavaString;
+using base::android::ScopedJavaLocalRef;
+
+namespace {
+
+ScopedJavaLocalRef<jobject> CreateJavaTemplateAndMaybeAddToList(
+    JNIEnv* env,
+    ScopedJavaLocalRef<jobject> jlist,
+    const NoteTemplate& template) {
+  return Java_NoteTemplateConversionBridge_createTemplateAndMaybeAddToList(
+      env, jlist, ConvertUTF8ToJavaString(template.localized_name));
+}
+
+}  // namespace
+
+// static
+ScopedJavaLocalRef<jobject>
+NoteTemplateConversionBridge::CreateJavaNoteTemplates(
+    JNIEnv* env,
+    const std::vector<NoteTemplate>& templates) {
+  ScopedJavaLocalRef<jobject> jlist =
+      Java_NoteTemplateConversionBridge_createTemplateList(env);
+
+  for (const auto& template : templates) {
+    CreateJavaTemplateAndMaybeAddToList(env, jlist, templates);
+  }
+
+  return jlist;
+}
+
+}  // namespace content_creation
diff --git a/components/content_creation/notes/android/note_template_conversion_bridge.h b/components/content_creation/notes/android/note_template_conversion_bridge.h
new file mode 100644
index 0000000..d62c0d7
--- /dev/null
+++ b/components/content_creation/notes/android/note_template_conversion_bridge.h
@@ -0,0 +1,24 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_CONTENT_CREATION_NOTES_ANDROID_NOTE_TEMPLATE_CONVERSION_BRIDGE_H_
+#define COMPONENTS_CONTENT_CREATION_NOTES_ANDROID_NOTE_TEMPLATE_CONVERSION_BRIDGE_H_
+
+#include "base/android/jni_android.h"
+#include "components/content_creation/notes/notes_types.h"
+
+using base::android::ScopedJavaLocalRef;
+
+namespace content_creation {
+
+class NoteTemplateConversionBridge {
+ public:
+  static ScopedJavaLocalRef<jobject> CreateJavaNoteTemplates(
+      JNIEnv* env,
+      const std::vector<NoteTemplate>& templates);
+};
+
+}  // namespace content_creation
+
+#endif  // COMPONENTS_CONTENT_CREATION_NOTES_ANDROID_NOTE_TEMPLATE_CONVERSION_BRIDGE_H_
diff --git a/components/content_settings/browser/BUILD.gn b/components/content_settings/browser/BUILD.gn
index 8f8045a..4a1cc00 100644
--- a/components/content_settings/browser/BUILD.gn
+++ b/components/content_settings/browser/BUILD.gn
@@ -46,6 +46,7 @@
     "//base",
     "//components/content_settings/core/browser",
     "//components/security_state/core",
+    "//components/services/storage/public/cpp",
     "//components/sync_preferences:test_support",
     "//content/test:test_support",
     "//net",
diff --git a/components/content_settings/browser/DEPS b/components/content_settings/browser/DEPS
index cb87cc1c..464bc8a 100644
--- a/components/content_settings/browser/DEPS
+++ b/components/content_settings/browser/DEPS
@@ -2,6 +2,7 @@
   "+components/browsing_data/content",
   "+components/page_load_metrics/browser",
   "+components/security_state/core",
+  "+components/services/storage/public/cpp",
   "+components/sync_preferences",
   "+components/url_formatter",
   "+content/public/browser",
diff --git a/components/content_settings/browser/page_specific_content_settings.cc b/components/content_settings/browser/page_specific_content_settings.cc
index c397f72..49d1a941 100644
--- a/components/content_settings/browser/page_specific_content_settings.cc
+++ b/components/content_settings/browser/page_specific_content_settings.cc
@@ -425,13 +425,13 @@
     int render_frame_id,
     const GURL& worker_url,
     const std::string& name,
-    const url::Origin& constructor_origin,
+    const storage::StorageKey& storage_key,
     bool blocked_by_policy) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   PageSpecificContentSettings* settings =
       GetForFrame(render_process_id, render_frame_id);
   if (settings)
-    settings->OnSharedWorkerAccessed(worker_url, name, constructor_origin,
+    settings->OnSharedWorkerAccessed(worker_url, name, storage_key,
                                      blocked_by_policy);
 }
 
@@ -649,16 +649,16 @@
 void PageSpecificContentSettings::OnSharedWorkerAccessed(
     const GURL& worker_url,
     const std::string& name,
-    const url::Origin& constructor_origin,
+    const storage::StorageKey& storage_key,
     bool blocked_by_policy) {
   DCHECK(worker_url.is_valid());
   if (blocked_by_policy) {
     blocked_local_shared_objects_.shared_workers()->AddSharedWorker(
-        worker_url, name, constructor_origin);
+        worker_url, name, storage_key);
     OnContentBlocked(ContentSettingsType::COOKIES);
   } else {
     allowed_local_shared_objects_.shared_workers()->AddSharedWorker(
-        worker_url, name, constructor_origin);
+        worker_url, name, storage_key);
     OnContentAllowed(ContentSettingsType::COOKIES);
   }
 }
diff --git a/components/content_settings/browser/page_specific_content_settings.h b/components/content_settings/browser/page_specific_content_settings.h
index eab1e84..1fd75bd7 100644
--- a/components/content_settings/browser/page_specific_content_settings.h
+++ b/components/content_settings/browser/page_specific_content_settings.h
@@ -35,6 +35,10 @@
 class NavigationHandle;
 }
 
+namespace storage {
+class StorageKey;
+}  // namespace storage
+
 namespace url {
 class Origin;
 }  // namespace url
@@ -248,7 +252,7 @@
                                    int render_frame_id,
                                    const GURL& worker_url,
                                    const std::string& name,
-                                   const url::Origin& constructor_origin,
+                                   const storage::StorageKey& storage_key,
                                    bool blocked_by_policy);
 
   static content::WebContentsObserver* GetWebContentsObserverForTest(
@@ -351,7 +355,7 @@
   void OnCacheStorageAccessed(const GURL& url, bool blocked_by_policy);
   void OnSharedWorkerAccessed(const GURL& worker_url,
                               const std::string& name,
-                              const url::Origin& constructor_origin,
+                              const storage::StorageKey& storage_key,
                               bool blocked_by_policy);
   void OnWebDatabaseAccessed(const GURL& url, bool blocked_by_policy);
 #if defined(OS_ANDROID) || BUILDFLAG(IS_CHROMEOS_ASH) || defined(OS_WIN)
diff --git a/components/content_settings/browser/page_specific_content_settings_unittest.cc b/components/content_settings/browser/page_specific_content_settings_unittest.cc
index e36561c..4547300 100644
--- a/components/content_settings/browser/page_specific_content_settings_unittest.cc
+++ b/components/content_settings/browser/page_specific_content_settings_unittest.cc
@@ -14,6 +14,7 @@
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
 #include "components/security_state/core/security_state.h"
+#include "components/services/storage/public/cpp/storage_key.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/test/mock_navigation_handle.h"
@@ -343,7 +344,8 @@
                                           blocked_by_policy);
   content_settings->OnSharedWorkerAccessed(
       GURL("http://youtube.com/worker.js"), "worker",
-      url::Origin::Create(GURL("https://youtube.com")), blocked_by_policy);
+      storage::StorageKey(url::Origin::Create(GURL("https://youtube.com"))),
+      blocked_by_policy);
 
   const auto& objects = content_settings->allowed_local_shared_objects();
   EXPECT_EQ(6u, objects.GetObjectCount());
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java
index c6458f9f..4f9b7a5 100644
--- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java
+++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java
@@ -190,6 +190,11 @@
         mNativeMatch = nativeMatch;
     }
 
+    /** Returns a reference to Native AutocompleteMatch object. */
+    long getNativeObjectRef() {
+        return mNativeMatch;
+    }
+
     /**
      * Update the suggestion with content retrieved from clilpboard.
      *
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteResult.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteResult.java
index 6525ff776..35e57d7 100644
--- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteResult.java
+++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteResult.java
@@ -90,6 +90,11 @@
         mSuggestions = Arrays.asList(suggestions);
     }
 
+    @CalledByNative
+    private void destroy() {
+        mNativeAutocompleteResult = 0;
+    }
+
     /**
      * @return List of Omnibox Suggestions.
      */
@@ -106,6 +111,28 @@
         return mGroupsDetails;
     }
 
+    /**
+     * Verifies coherency of this AutocompleteResult object with its C++ counterpart.
+     * Records histogram data reflecting the outcome.
+     * @return Whether Java and C++ AutocompleteResult objects are in sync.
+     */
+    public boolean verifyCoherency() {
+        // May happen with either test data, or AutocompleteResult built from the ZeroSuggestCache.
+        // This is a valid case, despite not meeting coherency criteria. Do not record.
+        if (mNativeAutocompleteResult == 0) return false;
+        long nativeMatches[] = new long[mSuggestions.size()];
+        for (int index = 0; index < mSuggestions.size(); index++) {
+            nativeMatches[index] = mSuggestions.get(index).getNativeObjectRef();
+        }
+        return AutocompleteResultJni.get().verifyCoherency(
+                mNativeAutocompleteResult, nativeMatches);
+    }
+
+    /** Returns a reference to Native AutocompleteResult object. */
+    public long getNativeObjectRef() {
+        return mNativeAutocompleteResult;
+    }
+
     @Override
     public boolean equals(Object otherObj) {
         if (otherObj == this) return true;
@@ -146,8 +173,12 @@
      */
     public void groupSuggestionsBySearchVsURL(int firstIndex, int lastIndex) {
         if (mNativeAutocompleteResult != 0) {
+            assert verifyCoherency() : "Pre-group verification failed";
             AutocompleteResultJni.get().groupSuggestionsBySearchVsURL(
                     mNativeAutocompleteResult, firstIndex, lastIndex);
+            // Verify that the Native AutocompleteResult update has been properly
+            // reflected on the Java part.
+            assert verifyCoherency() : "Post-group verification failed";
         }
     }
 
@@ -155,5 +186,6 @@
     interface Natives {
         void groupSuggestionsBySearchVsURL(
                 long nativeAutocompleteResult, int firstIndex, int lastIndex);
+        boolean verifyCoherency(long nativeAutocompleteResult, long[] matches);
     }
 }
diff --git a/components/omnibox/browser/autocomplete_match_android.cc b/components/omnibox/browser/autocomplete_match_android.cc
index 93bd73c..98f0896 100644
--- a/components/omnibox/browser/autocomplete_match_android.cc
+++ b/components/omnibox/browser/autocomplete_match_android.cc
@@ -89,9 +89,8 @@
   java_match_ = std::make_unique<ScopedJavaGlobalRef<jobject>>(
       Java_AutocompleteMatch_build(
           env, reinterpret_cast<intptr_t>(this), type,
-          ToJavaIntArray(env, temp_subtypes),
-          AutocompleteMatch::IsSearchType(type), relevance, transition,
-          ConvertUTF16ToJavaString(env, contents),
+          ToJavaIntArray(env, temp_subtypes), IsSearchType(type), relevance,
+          transition, ConvertUTF16ToJavaString(env, contents),
           ToJavaIntArray(env, contents_class_offsets),
           ToJavaIntArray(env, contents_class_styles),
           ConvertUTF16ToJavaString(env, description),
diff --git a/components/omnibox/browser/autocomplete_result.h b/components/omnibox/browser/autocomplete_result.h
index 9f5e7a4a..f7287b73 100644
--- a/components/omnibox/browser/autocomplete_result.h
+++ b/components/omnibox/browser/autocomplete_result.h
@@ -56,6 +56,10 @@
   base::android::ScopedJavaLocalRef<jobject> GetOrCreateJavaObject(
       JNIEnv* env) const;
 
+  // Notify the Java object that its native counterpart is about to be
+  // destroyed.
+  void DestroyJavaObject() const;
+
   // Construct an array of AutocompleteMatch objects arranged in the exact same
   // order as |matches_|.
   base::android::ScopedJavaLocalRef<jobjectArray> BuildJavaMatches(
@@ -68,6 +72,12 @@
   void GroupSuggestionsBySearchVsURL(JNIEnv* env,
                                      int firstIndex,
                                      int lastIndex);
+
+  // Compares the set of AutocompleteMatch references held by Java with the
+  // AutocompleteMatch objects held by this instance of the AutocompleteResult
+  // and returns true if the two sets are same.
+  bool VerifyCoherency(JNIEnv* env,
+                       const base::android::JavaParamRef<jlongArray>& matches);
 #endif
 
   // Moves matches from |old_matches| to provide a consistent result set.
diff --git a/components/omnibox/browser/autocomplete_result_android.cc b/components/omnibox/browser/autocomplete_result_android.cc
index 530c2e1c..e4f648f 100644
--- a/components/omnibox/browser/autocomplete_result_android.cc
+++ b/components/omnibox/browser/autocomplete_result_android.cc
@@ -11,16 +11,29 @@
 #include "base/android/jni_android.h"
 #include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
+#include "base/metrics/histogram_macros.h"
 #include "components/omnibox/browser/jni_headers/AutocompleteResult_jni.h"
 #include "components/omnibox/browser/search_suggestion_parser.h"
 #include "components/query_tiles/android/tile_conversion_bridge.h"
 #include "url/android/gurl_android.h"
 
+using base::android::JavaParamRef;
 using base::android::ScopedJavaLocalRef;
 using base::android::ToJavaArrayOfStrings;
 using base::android::ToJavaBooleanArray;
 using base::android::ToJavaIntArray;
 
+namespace {
+// Used for histograms, append only.
+enum class MatchVerificationResult {
+  VALID_MATCH = 0,
+  WRONG_MATCH = 1,
+  BAD_RESULT_SIZE = 2,
+  // Keep as the last entry:
+  COUNT
+};
+}  // namespace
+
 ScopedJavaLocalRef<jobject> AutocompleteResult::GetOrCreateJavaObject(
     JNIEnv* env) const {
   // Short circuit if we already built the java object.
@@ -55,6 +68,15 @@
   return ScopedJavaLocalRef<jobject>(java_result_);
 }
 
+void AutocompleteResult::DestroyJavaObject() const {
+  if (!java_result_)
+    return;
+
+  JNIEnv* env = base::android::AttachCurrentThread();
+  Java_AutocompleteResult_destroy(env, java_result_);
+  java_result_.Reset();
+}
+
 ScopedJavaLocalRef<jobjectArray> AutocompleteResult::BuildJavaMatches(
     JNIEnv* env) const {
   jclass clazz = AutocompleteMatch::GetClazz(env);
@@ -86,3 +108,52 @@
   Java_AutocompleteResult_updateMatches(env, java_result_,
                                         BuildJavaMatches(env));
 }
+
+bool AutocompleteResult::VerifyCoherency(
+    JNIEnv* env,
+    const JavaParamRef<jlongArray>& j_matches_array) {
+  DCHECK(j_matches_array);
+
+  std::vector<jlong> j_matches;
+  base::android::JavaLongArrayToLongVector(env, j_matches_array, &j_matches);
+
+  if (j_matches.size() != size()) {
+    UMA_HISTOGRAM_ENUMERATION("Android.Omnibox.InvalidMatch",
+                              MatchVerificationResult::BAD_RESULT_SIZE,
+                              MatchVerificationResult::COUNT);
+    NOTREACHED() << "AutocompletResult objects are of different size: "
+                 << j_matches.size() << " (Java) vs " << size() << " (Native)";
+    return false;
+  }
+
+  for (auto index = 0u; index < size(); index++) {
+    if (reinterpret_cast<intptr_t>(match_at(index)) != j_matches[index]) {
+      UMA_HISTOGRAM_ENUMERATION("Android.Omnibox.InvalidMatch",
+                                MatchVerificationResult::WRONG_MATCH,
+                                MatchVerificationResult::COUNT);
+      // Note: the NDEBUG is defined for release / debug-disabled builds.
+#ifndef NDEBUG
+      // Print the list of matches at every position on each side.
+      // Used for debugging purposes.
+      for (auto i = 0u; i < size(); i++) {
+        auto* this_match = match_at(i);
+        auto* other_match = reinterpret_cast<AutocompleteMatch*>(j_matches[i]);
+        DLOG(WARNING) << "Suggestion at index " << i << ": "
+                      << "(Native): " << this_match->fill_into_edit
+                      << "(Java): "
+                      << (other_match ? other_match->fill_into_edit
+                                      : u"<null>");
+      }
+#endif
+      NOTREACHED()
+          << "AutocompleteMatch mismatch with native-sourced suggestions at "
+          << index;
+      return false;
+    }
+  }
+
+  UMA_HISTOGRAM_ENUMERATION("Android.Omnibox.InvalidMatch",
+                            MatchVerificationResult::VALID_MATCH,
+                            MatchVerificationResult::COUNT);
+  return true;
+}
diff --git a/components/password_manager/core/browser/leak_detection/leak_detection_request.cc b/components/password_manager/core/browser/leak_detection/leak_detection_request.cc
index 750e35f5..ce3a50e 100644
--- a/components/password_manager/core/browser/leak_detection/leak_detection_request.cc
+++ b/components/password_manager/core/browser/leak_detection/leak_detection_request.cc
@@ -150,9 +150,6 @@
 
     int net_error = simple_url_loader_->NetError();
     DLOG(ERROR) << "Net Error: " << net::ErrorToString(net_error);
-    // Network error codes are negative. See: src/net/base/net_error_list.h.
-    base::UmaHistogramSparse("PasswordManager.LeakDetection.NetErrorCode",
-                             -net_error);
 
     std::move(callback).Run(nullptr, error);
     return;
diff --git a/components/password_manager/core/browser/leak_detection/leak_detection_request_unittest.cc b/components/password_manager/core/browser/leak_detection/leak_detection_request_unittest.cc
index ff6c5710..7c4a4a3 100644
--- a/components/password_manager/core/browser/leak_detection/leak_detection_request_unittest.cc
+++ b/components/password_manager/core/browser/leak_detection/leak_detection_request_unittest.cc
@@ -60,9 +60,6 @@
   histogram_tester().ExpectUniqueSample(
       "PasswordManager.LeakDetection.HttpResponseCode",
       net::HTTP_INTERNAL_SERVER_ERROR, 1);
-  histogram_tester().ExpectUniqueSample(
-      "PasswordManager.LeakDetection.NetErrorCode",
-      -net::ERR_HTTP_RESPONSE_CODE_FAILURE, 1);
 }
 
 TEST_F(LeakDetectionRequestTest, QuotaLimit) {
@@ -83,9 +80,6 @@
   histogram_tester().ExpectUniqueSample(
       "PasswordManager.LeakDetection.HttpResponseCode",
       net::HTTP_TOO_MANY_REQUESTS, 1);
-  histogram_tester().ExpectUniqueSample(
-      "PasswordManager.LeakDetection.NetErrorCode",
-      -net::ERR_HTTP_RESPONSE_CODE_FAILURE, 1);
 }
 
 TEST_F(LeakDetectionRequestTest, MalformedServerResponse) {
diff --git a/components/password_manager/core/browser/leak_detection_delegate.cc b/components/password_manager/core/browser/leak_detection_delegate.cc
index fbcf5f8..6e866ac 100644
--- a/components/password_manager/core/browser/leak_detection_delegate.cc
+++ b/components/password_manager/core/browser/leak_detection_delegate.cc
@@ -127,8 +127,6 @@
                             IsPasswordSaved(leak_type));
   base::UmaHistogramBoolean("PasswordManager.LeakDetection.IsPasswordReused",
                             IsPasswordUsedOnOtherSites(leak_type));
-  base::UmaHistogramBoolean("PasswordManager.LeakDetection.IsSyncing",
-                            IsSyncingPasswordsNormally(leak_type));
   client_->NotifyUserCredentialsWereLeaked(leak_type, url, username);
 }
 
diff --git a/components/password_manager/core/browser/store_metrics_reporter.cc b/components/password_manager/core/browser/store_metrics_reporter.cc
index 6a39adf..29b7f08 100644
--- a/components/password_manager/core/browser/store_metrics_reporter.cc
+++ b/components/password_manager/core/browser/store_metrics_reporter.cc
@@ -197,10 +197,6 @@
   base::UmaHistogramBoolean(
       "PasswordManager.Enabled",
       prefs->GetBoolean(password_manager::prefs::kCredentialsEnableService));
-  base::UmaHistogramBoolean(
-      "PasswordManager.LeakDetection.Enabled",
-      prefs->GetBoolean(
-          password_manager::prefs::kPasswordLeakDetectionEnabled));
 
   // If both stores exist, kick off the MultiStoreMetricsReporter.
   PasswordStore* profile_store = client->GetProfilePasswordStore();
diff --git a/components/password_manager/core/browser/store_metrics_reporter_unittest.cc b/components/password_manager/core/browser/store_metrics_reporter_unittest.cc
index 3444f6c1..a6d8dc5 100644
--- a/components/password_manager/core/browser/store_metrics_reporter_unittest.cc
+++ b/components/password_manager/core/browser/store_metrics_reporter_unittest.cc
@@ -49,8 +49,6 @@
   StoreMetricsReporterTest() {
     prefs_.registry()->RegisterBooleanPref(prefs::kCredentialsEnableService,
                                            false);
-    prefs_.registry()->RegisterBooleanPref(prefs::kPasswordLeakDetectionEnabled,
-                                           false);
     prefs_.registry()->RegisterBooleanPref(
         password_manager::prefs::kWasAutoSignInFirstRunExperienceShown, false);
   }
@@ -74,12 +72,9 @@
 // Test that store-independent metrics are reported correctly.
 TEST_P(StoreMetricsReporterTestWithParams, StoreIndependentMetrics) {
   const bool password_manager_enabled = std::get<0>(GetParam());
-  const bool leak_detection_enabled = std::get<1>(GetParam());
 
   prefs_.SetBoolean(password_manager::prefs::kCredentialsEnableService,
                     password_manager_enabled);
-  prefs_.SetBoolean(password_manager::prefs::kPasswordLeakDetectionEnabled,
-                    leak_detection_enabled);
   base::HistogramTester histogram_tester;
   EXPECT_CALL(client_, GetProfilePasswordStore())
       .WillRepeatedly(Return(nullptr));
@@ -88,8 +83,6 @@
 
   histogram_tester.ExpectUniqueSample("PasswordManager.Enabled",
                                       password_manager_enabled, 1);
-  histogram_tester.ExpectUniqueSample("PasswordManager.LeakDetection.Enabled",
-                                      leak_detection_enabled, 1);
 }
 
 // Test that sync username and syncing state are passed correctly to the
diff --git a/components/performance_manager/BUILD.gn b/components/performance_manager/BUILD.gn
index eb38d69..a13b9c75 100644
--- a/components/performance_manager/BUILD.gn
+++ b/components/performance_manager/BUILD.gn
@@ -301,6 +301,7 @@
     "test_support:test_support_common",
     "//base/test:test_support",
     "//base/util/memory_pressure:test_support",
+    "//components/services/storage/public/cpp",
     "//content/test:test_support",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/components/performance_manager/DEPS b/components/performance_manager/DEPS
index 47eb04de4..f5027315 100644
--- a/components/performance_manager/DEPS
+++ b/components/performance_manager/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+components/services/storage/public/cpp",
   "+content/public/common",
   "+content/public/browser",
   "+content/public/test",
diff --git a/components/performance_manager/worker_watcher_unittest.cc b/components/performance_manager/worker_watcher_unittest.cc
index 9fe8323..1fa3bca 100644
--- a/components/performance_manager/worker_watcher_unittest.cc
+++ b/components/performance_manager/worker_watcher_unittest.cc
@@ -25,6 +25,7 @@
 #include "components/performance_manager/performance_manager_impl.h"
 #include "components/performance_manager/process_node_source.h"
 #include "components/performance_manager/public/features.h"
+#include "components/services/storage/public/cpp/storage_key.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/shared_worker_service.h"
 #include "content/public/test/browser_task_environment.h"
@@ -161,7 +162,7 @@
   void EnumerateSharedWorkers(Observer* observer) override;
   bool TerminateWorker(const GURL& url,
                        const std::string& name,
-                       const url::Origin& constructor_origin) override;
+                       const storage::StorageKey& storage_key) override;
   void Shutdown() override;
 
   // Creates a new shared worker and returns its token.
@@ -209,7 +210,7 @@
 bool TestSharedWorkerService::TerminateWorker(
     const GURL& url,
     const std::string& name,
-    const url::Origin& constructor_origin) {
+    const storage::StorageKey& storage_key) {
   // Not implemented.
   ADD_FAILURE();
   return false;
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto
index dbffa1c..df14be9 100644
--- a/components/policy/proto/device_management_backend.proto
+++ b/components/policy/proto/device_management_backend.proto
@@ -844,6 +844,17 @@
   // Email address of the active user. Present only if the user type is managed
   // and affiliated.
   optional string user_email = 3;
+
+  enum SessionType {
+    SESSION_UNKNOWN = 0;
+    SESSION_AFFILIATED_USER = 1;
+    SESSION_MANAGED_GUEST = 2;
+    SESSION_KIOSK = 3;
+    SESSION_ARC_KIOSK = 4;
+    SESSION_WEB_KIOSK = 5;
+  }
+
+  optional SessionType session_type = 4;
 }
 
 // Details about a network interface.
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index c85c2fe..86f7409 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -7137,7 +7137,7 @@
       'owners': [ 'yusuyoutube@google.com', 'benwgold@google.com', 'wylieb@chromium.org', 'fgorski@chromium.org', 'lens-chrome@google.com'],
       'type': 'main',
       'schema': { 'type': 'boolean' },
-      'future_on': ['android'],
+      'supported_on': ['android:91-'],
       'features': {
         'dynamic_refresh': False,
         'per_profile': False,
diff --git a/components/signin/core/browser/signin_header_helper.h b/components/signin/core/browser/signin_header_helper.h
index dd2eed0..ee388594 100644
--- a/components/signin/core/browser/signin_header_helper.h
+++ b/components/signin/core/browser/signin_header_helper.h
@@ -204,10 +204,6 @@
       const GURL& url,
       const content_settings::CookieSettings* cookie_settings) = 0;
 
- protected:
-  SigninHeaderHelper();
-  virtual ~SigninHeaderHelper();
-
   // Dictionary of fields in a account consistency response header.
   using ResponseHeaderDictionary = std::multimap<std::string, std::string>;
 
@@ -216,6 +212,10 @@
   static ResponseHeaderDictionary ParseAccountConsistencyResponseHeader(
       const std::string& header_value);
 
+ protected:
+  SigninHeaderHelper();
+  virtual ~SigninHeaderHelper();
+
   // Returns whether the url is eligible for the request header.
   virtual bool IsUrlEligibleForRequestHeader(const GURL& url) = 0;
 
diff --git a/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.cc b/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.cc
index d03c005f..8ce9809a 100644
--- a/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.cc
+++ b/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.cc
@@ -116,4 +116,13 @@
       source, std::move(completion_callback));
 }
 
+void AccountsCookieMutatorImpl::RemoveLoggedOutAccountByGaiaId(
+    const std::string& gaia_id) {
+  // Note that RemoveLoggedOutAccountByGaiaId() does NOT internally trigger a
+  // ListAccounts fetch. It could make sense to force a request here, e.g. via
+  // ForceOnCookieChangeProcessing(), but this isn't considered important enough
+  // to justify the risk for overloading the server.
+  gaia_cookie_manager_service_->RemoveLoggedOutAccountByGaiaId(gaia_id);
+}
+
 }  // namespace signin
diff --git a/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.h b/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.h
index cf8dc8e..d98f0afc 100644
--- a/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.h
+++ b/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.h
@@ -69,6 +69,8 @@
       gaia::GaiaSource source,
       LogOutFromCookieCompletedCallback completion_callback) override;
 
+  void RemoveLoggedOutAccountByGaiaId(const std::string& gaia_id) override;
+
  private:
   class MultiloginHelperWrapper : public SetAccountsInCookieTask {
    public:
diff --git a/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc b/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc
index 773aa606..e0069af0 100644
--- a/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc
+++ b/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc
@@ -663,6 +663,33 @@
   }
 }
 
+void GaiaCookieManagerService::RemoveLoggedOutAccountByGaiaId(
+    const std::string& gaia_id) {
+  // TODO(crbug.com/1078762): Add UMA for the various codepaths in this
+  // function.
+  VLOG(1) << "GaiaCookieManagerService::RemoveLoggedOutAccountByGaiaId";
+
+  if (list_accounts_stale_) {
+    return;
+  }
+
+  const bool accounts_updated =
+      base::EraseIf(signed_out_accounts_,
+                    [&gaia_id](const gaia::ListedAccount& account) {
+                      return account.gaia_id == gaia_id;
+                    }) != 0;
+
+  if (!accounts_updated) {
+    return;
+  }
+
+  if (gaia_accounts_updated_in_cookie_callback_) {
+    gaia_accounts_updated_in_cookie_callback_.Run(
+        listed_accounts_, signed_out_accounts_,
+        GoogleServiceAuthError(GoogleServiceAuthError::NONE));
+  }
+}
+
 void GaiaCookieManagerService::CancelAll() {
   VLOG(1) << "GaiaCookieManagerService::CancelAll";
   gaia_auth_fetcher_.reset();
diff --git a/components/signin/internal/identity_manager/gaia_cookie_manager_service.h b/components/signin/internal/identity_manager/gaia_cookie_manager_service.h
index b1c73919..6bb2ae9b 100644
--- a/components/signin/internal/identity_manager/gaia_cookie_manager_service.h
+++ b/components/signin/internal/identity_manager/gaia_cookie_manager_service.h
@@ -271,6 +271,11 @@
   void LogOutAllAccounts(gaia::GaiaSource source,
                          LogOutFromCookieCompletedCallback callback);
 
+  // Indicates that an account previously listed via ListAccounts should now
+  // be removed. Does not trigger a ListAccounts request and does not change the
+  // staleness of the account information.
+  void RemoveLoggedOutAccountByGaiaId(const std::string& gaia_id);
+
   // Call observers when setting accounts in cookie completes.
   void SignalSetAccountsComplete(signin::SetAccountsInCookieResult result);
 
diff --git a/components/signin/internal/identity_manager/gaia_cookie_manager_service_unittest.cc b/components/signin/internal/identity_manager/gaia_cookie_manager_service_unittest.cc
index c123e3d..4e1dbca 100644
--- a/components/signin/internal/identity_manager/gaia_cookie_manager_service_unittest.cc
+++ b/components/signin/internal/identity_manager/gaia_cookie_manager_service_unittest.cc
@@ -16,6 +16,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/strings/stringprintf.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/mock_callback.h"
 #include "base/test/task_environment.h"
@@ -97,6 +98,11 @@
   return AreAccountListsEqual(expected, arg);
 }
 
+// Custom matcher for ListedAccount.
+MATCHER_P(ListedAccountMatchesGaiaId, gaia_id, "") {
+  return arg.gaia_id == std::string(gaia_id);
+}
+
 class InstrumentedGaiaCookieManagerService : public GaiaCookieManagerService {
  public:
   InstrumentedGaiaCookieManagerService(ProfileOAuth2TokenService* token_service,
@@ -247,6 +253,7 @@
 }  // namespace
 
 using ::testing::_;
+using ::testing::ElementsAre;
 
 TEST_F(GaiaCookieManagerServiceTest, Success) {
   InstrumentedGaiaCookieManagerService helper(token_service(), signin_client());
@@ -1096,3 +1103,130 @@
   EXPECT_CALL(helper, StartFetchingMergeSession());
   SimulateUbertokenSuccess(&helper, "token3");
 }
+
+TEST_F(GaiaCookieManagerServiceTest, RemoveLoggedOutAccountByGaiaId) {
+  const std::string kTestGaiaId1 = "8";
+  const std::string kTestGaiaId2 = "9";
+
+  ::testing::NiceMock<InstrumentedGaiaCookieManagerService> helper(
+      token_service(), signin_client());
+  ::testing::NiceMock<MockObserver> observer(&helper);
+
+  std::vector<gaia::ListedAccount> signed_in_accounts;
+  std::vector<gaia::ListedAccount> signed_out_accounts;
+  ASSERT_FALSE(helper.ListAccounts(&signed_in_accounts, &signed_out_accounts));
+
+  // Simulate two signed out accounts being listed.
+  SimulateListAccountsSuccess(
+      &helper,
+      base::StringPrintf(
+          "[\"f\","
+          "[[\"a\", 0, \"n\", \"a@d.com\", \"p\", 0, 0, 0, 0, 1, \"%s\","
+          "null,null,null,1],"
+          "[\"b\", 0, \"n\", \"b@d.com\", \"p\", 0, 0, 0, 0, 1, \"%s\","
+          "null,null,null,1]]]",
+          kTestGaiaId1.c_str(), kTestGaiaId2.c_str()));
+
+  ASSERT_TRUE(helper.ListAccounts(&signed_in_accounts, &signed_out_accounts));
+  ASSERT_THAT(signed_out_accounts,
+              ElementsAre(ListedAccountMatchesGaiaId(kTestGaiaId1),
+                          ListedAccountMatchesGaiaId(kTestGaiaId2)));
+
+  // The removal should notify observers, with one account removed.
+  EXPECT_CALL(observer,
+              OnGaiaAccountsInCookieUpdated(
+                  _, /*signed_out_accounts=*/
+                  ElementsAre(ListedAccountMatchesGaiaId(kTestGaiaId2)), _));
+  EXPECT_CALL(helper, StartFetchingListAccounts()).Times(0);
+  helper.RemoveLoggedOutAccountByGaiaId(kTestGaiaId1);
+
+  // Verify that ListAccounts wasn't triggered.
+  EXPECT_FALSE(helper.is_running());
+  EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(&helper));
+
+  ASSERT_TRUE(helper.ListAccounts(&signed_in_accounts, &signed_out_accounts));
+  EXPECT_THAT(signed_out_accounts,
+              ElementsAre(ListedAccountMatchesGaiaId(kTestGaiaId2)));
+}
+
+TEST_F(GaiaCookieManagerServiceTest,
+       RemoveLoggedOutAccountByGaiaIdWhileAccountsStale) {
+  const std::string kTestGaiaId1 = "8";
+
+  ::testing::NiceMock<InstrumentedGaiaCookieManagerService> helper(
+      token_service(), signin_client());
+  ::testing::NiceMock<MockObserver> observer(&helper);
+
+  std::vector<gaia::ListedAccount> signed_in_accounts;
+  std::vector<gaia::ListedAccount> signed_out_accounts;
+  ASSERT_FALSE(helper.ListAccounts(&signed_in_accounts, &signed_out_accounts));
+
+  // Simulate one signed out account being listed.
+  SimulateListAccountsSuccess(
+      &helper,
+      base::StringPrintf(
+          "[\"f\","
+          "[[\"a\", 0, \"n\", \"a@d.com\", \"p\", 0, 0, 0, 0, 1, \"%s\","
+          "null,null,null,1]]]",
+          kTestGaiaId1.c_str()));
+
+  // Change list account state to be stale, which will trigger list accounts
+  // request.
+  helper.ForceOnCookieChangeProcessing();
+
+  ASSERT_FALSE(helper.ListAccounts(&signed_in_accounts, &signed_out_accounts));
+  ASSERT_THAT(signed_out_accounts,
+              ElementsAre(ListedAccountMatchesGaiaId(kTestGaiaId1)));
+
+  // The removal should be ignored because the account list is stale.
+  EXPECT_CALL(observer, OnGaiaAccountsInCookieUpdated(_, _, _)).Times(0);
+  EXPECT_CALL(helper, StartFetchingListAccounts()).Times(0);
+  helper.RemoveLoggedOutAccountByGaiaId(kTestGaiaId1);
+
+  // Verify that ListAccounts wasn't triggered again.
+  EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(&helper));
+
+  ASSERT_FALSE(helper.ListAccounts(&signed_in_accounts, &signed_out_accounts));
+  EXPECT_THAT(signed_out_accounts,
+              ElementsAre(ListedAccountMatchesGaiaId(kTestGaiaId1)));
+}
+
+TEST_F(GaiaCookieManagerServiceTest,
+       RemoveLoggedOutAccountByGaiaIdForUnknownAccount) {
+  const std::string kTestGaiaId1 = "8";
+  const std::string kNonListedAccount = "9";
+
+  ::testing::NiceMock<InstrumentedGaiaCookieManagerService> helper(
+      token_service(), signin_client());
+  ::testing::NiceMock<MockObserver> observer(&helper);
+
+  std::vector<gaia::ListedAccount> signed_in_accounts;
+  std::vector<gaia::ListedAccount> signed_out_accounts;
+  ASSERT_FALSE(helper.ListAccounts(&signed_in_accounts, &signed_out_accounts));
+
+  // Simulate one signed out account being listed.
+  SimulateListAccountsSuccess(
+      &helper,
+      base::StringPrintf(
+          "[\"f\","
+          "[[\"a\", 0, \"n\", \"a@d.com\", \"p\", 0, 0, 0, 0, 1, \"%s\","
+          "null,null,null,1]]]",
+          kTestGaiaId1.c_str()));
+
+  ASSERT_TRUE(helper.ListAccounts(&signed_in_accounts, &signed_out_accounts));
+  ASSERT_THAT(signed_out_accounts,
+              ElementsAre(ListedAccountMatchesGaiaId(kTestGaiaId1)));
+
+  // The removal should be ignored because the Gaia ID is not listed/known.
+  EXPECT_CALL(observer, OnGaiaAccountsInCookieUpdated(_, _, _)).Times(0);
+  EXPECT_CALL(helper, StartFetchingListAccounts()).Times(0);
+  helper.RemoveLoggedOutAccountByGaiaId(kNonListedAccount);
+
+  // Verify that ListAccounts wasn't triggered.
+  EXPECT_FALSE(helper.is_running());
+  EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(&helper));
+
+  ASSERT_TRUE(helper.ListAccounts(&signed_in_accounts, &signed_out_accounts));
+  EXPECT_THAT(signed_out_accounts,
+              ElementsAre(ListedAccountMatchesGaiaId(kTestGaiaId1)));
+}
diff --git a/components/signin/public/identity_manager/accounts_cookie_mutator.h b/components/signin/public/identity_manager/accounts_cookie_mutator.h
index 200fd2a..81df07c 100644
--- a/components/signin/public/identity_manager/accounts_cookie_mutator.h
+++ b/components/signin/public/identity_manager/accounts_cookie_mutator.h
@@ -132,6 +132,10 @@
       gaia::GaiaSource source,
       LogOutFromCookieCompletedCallback completion_callback) = 0;
 
+  // Indicates that an account previously listed via ListAccounts should now
+  // be removed.
+  virtual void RemoveLoggedOutAccountByGaiaId(const std::string& gaia_id) = 0;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(AccountsCookieMutator);
 };
diff --git a/components/subresource_filter/android/subresource_filter_feature_list.cc b/components/subresource_filter/android/subresource_filter_feature_list.cc
index e9ecae93..320eb7f9 100644
--- a/components/subresource_filter/android/subresource_filter_feature_list.cc
+++ b/components/subresource_filter/android/subresource_filter_feature_list.cc
@@ -4,7 +4,7 @@
 
 #include "base/android/jni_string.h"
 #include "base/feature_list.h"
-#include "base/stl_util.h"
+#include "base/notreached.h"
 #include "components/subresource_filter/android/subresource_filter_jni_headers/SubresourceFilterFeatureList_jni.h"
 #include "components/subresource_filter/core/browser/subresource_filter_features.h"
 
@@ -18,15 +18,15 @@
 // Array of features exposed through the Java ContentFeatureList API. Entries in
 // this array may either refer to features defined in the header of this file or
 // in other locations in the code base (e.g. content_features.h).
-const base::Feature* kFeaturesExposedToJava[] = {
+const base::Feature* const kFeaturesExposedToJava[] = {
     &kSafeBrowsingSubresourceFilter,
 };
 
 // TODO(crbug.com/1060097): Removethis once a generalized FeatureList exists.
 const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
-  for (size_t i = 0; i < base::size(kFeaturesExposedToJava); ++i) {
-    if (kFeaturesExposedToJava[i]->name == feature_name)
-      return kFeaturesExposedToJava[i];
+  for (const base::Feature* feature : kFeaturesExposedToJava) {
+    if (feature->name == feature_name)
+      return feature;
   }
   NOTREACHED() << "Queried feature not found in SubresourceFilterFeatureList: "
                << feature_name;
diff --git a/components/translate/content/android/translate_feature_list.cc b/components/translate/content/android/translate_feature_list.cc
index cb8e2e6..a58ed41a 100644
--- a/components/translate/content/android/translate_feature_list.cc
+++ b/components/translate/content/android/translate_feature_list.cc
@@ -17,7 +17,7 @@
 // Array of translate features exposed through the Java TranslateFeatureList
 // API. Entries in this array refer to features defined in
 // components/language/core/common/language_experiments.h.
-const base::Feature* kFeaturesExposedToJava[] = {
+const base::Feature* const kFeaturesExposedToJava[] = {
     &language::kContentLanguagesInLanguagePicker,
     &language::kDetectedSourceLanguageOption,
 };
@@ -25,9 +25,9 @@
 // TODO(crbug.com/1060097): Remove/update this once a generalized FeatureList
 // exists.
 const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
-  for (size_t i = 0; i < base::size(kFeaturesExposedToJava); ++i) {
-    if (kFeaturesExposedToJava[i]->name == feature_name)
-      return kFeaturesExposedToJava[i];
+  for (const base::Feature* feature : kFeaturesExposedToJava) {
+    if (feature->name == feature_name)
+      return feature;
   }
   NOTREACHED() << "Queried feature cannot be found in TranslateFeatureList: "
                << feature_name;
diff --git a/components/viz/service/display/delegated_ink_trail_data.cc b/components/viz/service/display/delegated_ink_trail_data.cc
index 51ecdff..0d2bf360 100644
--- a/components/viz/service/display/delegated_ink_trail_data.cc
+++ b/components/viz/service/display/delegated_ink_trail_data.cc
@@ -26,7 +26,7 @@
   for (int i = 0; i < kNumberOfPredictionConfigs; ++i) {
     prediction_handlers_[i].metrics_handler =
         std::make_unique<ui::PredictionMetricsHandler>(
-            (full_name + base::NumberToString(i)).c_str());
+            base::StrCat({full_name, base::NumberToString(i)}));
     prediction_handlers_[i].predictor =
         std::make_unique<ui::KalmanPredictor>(predictor_options);
   }
@@ -106,12 +106,7 @@
           // produce a prediction if the predicted point would go in to the
           // opposite direction of most recently stored points. If this happens,
           // don't continue trying to generate more predicted points.
-          handler.metrics_handler->EvaluatePrediction();
-          base::UmaHistogramTimes(
-              base::StrCat(
-                  {histogram_base_name, base::NumberToString(experiment)}),
-              latency_improvement_with_prediction);
-          continue;
+          break;
         }
       }
     }
diff --git a/components/viz/service/display/surface_aggregator_unittest.cc b/components/viz/service/display/surface_aggregator_unittest.cc
index b7a2d9f..e8e56e5 100644
--- a/components/viz/service/display/surface_aggregator_unittest.cc
+++ b/components/viz/service/display/surface_aggregator_unittest.cc
@@ -14,6 +14,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/format_macros.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/stl_util.h"
diff --git a/components/viz/test/test_context_provider.cc b/components/viz/test/test_context_provider.cc
index 659f7f1c..34b6426e 100644
--- a/components/viz/test/test_context_provider.cc
+++ b/components/viz/test/test_context_provider.cc
@@ -155,6 +155,7 @@
 gpu::Mailbox TestSharedImageInterface::CreateSharedImage(
     gfx::GpuMemoryBuffer* gpu_memory_buffer,
     gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
+    gfx::BufferPlane plane,
     const gfx::ColorSpace& color_space,
     GrSurfaceOrigin surface_origin,
     SkAlphaType alpha_type,
diff --git a/components/viz/test/test_context_provider.h b/components/viz/test/test_context_provider.h
index 662ee6c..97b360c 100644
--- a/components/viz/test/test_context_provider.h
+++ b/components/viz/test/test_context_provider.h
@@ -61,6 +61,7 @@
   gpu::Mailbox CreateSharedImage(
       gfx::GpuMemoryBuffer* gpu_memory_buffer,
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
+      gfx::BufferPlane plane,
       const gfx::ColorSpace& color_space,
       GrSurfaceOrigin surface_origin,
       SkAlphaType alpha_type,
diff --git a/content/browser/accessibility/browser_accessibility_state_impl_android.cc b/content/browser/accessibility/browser_accessibility_state_impl_android.cc
index 038cf693..ccbcf87b 100644
--- a/content/browser/accessibility/browser_accessibility_state_impl_android.cc
+++ b/content/browser/accessibility/browser_accessibility_state_impl_android.cc
@@ -74,7 +74,7 @@
   UMA_FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 42,
   UMA_FLAG_RETRIEVE_INTERACTIVE_WINDOWS = 43,
   UMA_SERVICE_TYPE_UNKNOWN = 44,
-  UMA_SERVICE_TYPE_PASSWORD_MANAGER = 45,
+  UMA_SERVICE_TYPE_PASSWORD_MANAGER = 45,  // unused
   UMA_SERVICE_TYPE_ASSISTIVE_TECH = 46,
 
   UMA_CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES = 47,
@@ -285,7 +285,6 @@
       Java_BrowserAccessibilityState_getAccessibilityServiceIds(env);
   jsize len = env->GetArrayLength(service_ids.obj());
   bool has_assistive_tech = false;
-  bool has_password_manager = false;
   bool has_unknown = false;
 
   const uint32_t kAssistiveTechPackageHashes[] = {
@@ -295,10 +294,6 @@
       0xb38ef877,  // Voice Access
       0xbc2897b4,  // BrailleBack
   };
-  const uint32_t kPasswordPackageHashes[] = {
-      0x013b76f2, 0x31cd47e3, 0x353cf6c5, 0x48723526, 0x4a8cfa8a,
-      0x7e0ad835, 0x7e3515d0, 0x8e4c009f, 0x920ad3bd, 0xca841f39,
-  };
   // TODO(crbug.com/1197608): Consider adding further categories.
   for (jsize i = 0; i < len; ++i) {
     auto* id = env->GetObjectArrayElement(service_ids.obj(), i);
@@ -309,15 +304,12 @@
 
     if (base::Contains(kAssistiveTechPackageHashes, service_hash)) {
       has_assistive_tech = true;
-    } else if (base::Contains(kPasswordPackageHashes, service_hash)) {
-      has_password_manager = true;
     } else {
       has_unknown = true;
     }
   }
 
   SERVICE_TYPE_HISTOGRAM(has_assistive_tech, ASSISTIVE_TECH);
-  SERVICE_TYPE_HISTOGRAM(has_password_manager, PASSWORD_MANAGER);
   SERVICE_TYPE_HISTOGRAM(has_unknown, UNKNOWN);
 }
 
diff --git a/content/browser/android/content_feature_list.cc b/content/browser/android/content_feature_list.cc
index 9358847d..4299769 100644
--- a/content/browser/android/content_feature_list.cc
+++ b/content/browser/android/content_feature_list.cc
@@ -5,7 +5,6 @@
 #include "base/android/jni_string.h"
 #include "base/feature_list.h"
 #include "base/notreached.h"
-#include "base/stl_util.h"
 #include "content/public/android/content_jni_headers/ContentFeatureListImpl_jni.h"
 #include "content/public/common/content_features.h"
 
@@ -20,7 +19,7 @@
 // Array of features exposed through the Java ContentFeatureList API. Entries in
 // this array may either refer to features defined in the header of this file or
 // in other locations in the code base (e.g. content_features.h).
-const base::Feature* kFeaturesExposedToJava[] = {
+const base::Feature* const kFeaturesExposedToJava[] = {
     &features::kBackgroundMediaRendererHasModerateBinding,
     &features::kBindingManagementWaiveCpu,
     &features::kExperimentalAccessibilityLabels,
@@ -31,9 +30,9 @@
 };
 
 const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
-  for (size_t i = 0; i < base::size(kFeaturesExposedToJava); ++i) {
-    if (kFeaturesExposedToJava[i]->name == feature_name)
-      return kFeaturesExposedToJava[i];
+  for (const base::Feature* feature : kFeaturesExposedToJava) {
+    if (feature->name == feature_name)
+      return feature;
   }
   NOTREACHED() << "Queried feature cannot be found in ContentFeatureList: "
                << feature_name;
diff --git a/content/browser/conversions/conversion_registration_browsertest.cc b/content/browser/conversions/conversion_registration_browsertest.cc
index fab544ff..8b93861 100644
--- a/content/browser/conversions/conversion_registration_browsertest.cc
+++ b/content/browser/conversions/conversion_registration_browsertest.cc
@@ -49,6 +49,7 @@
 
   void RegisterConversion(blink::mojom::ConversionPtr conversion) override {
     last_conversion_data_ = conversion->conversion_data;
+    last_event_source_trigger_data_ = conversion->event_source_trigger_data;
     num_conversions_++;
 
     // Don't quit the run loop if we have not seen the expected number of
@@ -68,10 +69,15 @@
     return last_conversion_data_;
   }
 
+  uint64_t last_event_source_trigger_data() const {
+    return last_event_source_trigger_data_;
+  }
+
   size_t num_conversions() { return num_conversions_; }
 
  private:
   uint64_t last_conversion_data_ = 0;
+  uint64_t last_event_source_trigger_data_ = 0;
   size_t num_conversions_ = 0;
   size_t expected_num_conversions_ = 0;
   base::RunLoop conversion_waiter_;
@@ -162,6 +168,20 @@
 
   EXPECT_TRUE(ExecJs(web_contents(), "registerConversion(123)"));
   EXPECT_EQ(123UL, host->WaitForNumConversions(1));
+  EXPECT_EQ(0UL, host->last_event_source_trigger_data());
+}
+
+IN_PROC_BROWSER_TEST_F(ConversionRegistrationBrowserTest,
+                       ConversionRegistered_EventSourceTriggerDataReceived) {
+  EXPECT_TRUE(NavigateToURL(
+      shell(),
+      embedded_test_server()->GetURL("/page_with_conversion_redirect.html")));
+  std::unique_ptr<TestConversionHost> host =
+      TestConversionHost::ReplaceAndGetConversionHost(web_contents());
+
+  EXPECT_TRUE(ExecJs(web_contents(), "registerConversion(123, 456)"));
+  EXPECT_EQ(123UL, host->WaitForNumConversions(1));
+  EXPECT_EQ(456UL, host->last_event_source_trigger_data());
 }
 
 IN_PROC_BROWSER_TEST_F(ConversionRegistrationBrowserTest,
@@ -261,6 +281,7 @@
   EXPECT_TRUE(ExecJs(web_contents(),
                      JsReplace("createTrackingPixel($1);", registration_url)));
   EXPECT_EQ(200UL, host->WaitForNumConversions(1));
+  EXPECT_EQ(0UL, host->last_event_source_trigger_data());
 }
 
 IN_PROC_BROWSER_TEST_F(ConversionRegistrationBrowserTest,
@@ -286,8 +307,9 @@
   EXPECT_TRUE(ExecJs(web_contents(), "createTrackingPixel(\"server-redirect?" +
                                          kWellKnownUrl + "\");"));
 
-  // Conversion data should be defaulted to 0.
+  // Conversion data and event source trigger data should be defaulted to 0.
   EXPECT_EQ(0UL, host->WaitForNumConversions(1));
+  EXPECT_EQ(0UL, host->last_event_source_trigger_data());
 }
 
 IN_PROC_BROWSER_TEST_F(ConversionRegistrationBrowserTest,
@@ -304,6 +326,7 @@
   EXPECT_TRUE(ExecJs(ChildFrameAt(web_contents()->GetMainFrame(), 0),
                      JsReplace("createTrackingPixel($1);", redirect_url)));
   EXPECT_EQ(200u, host->WaitForNumConversions(1));
+  EXPECT_EQ(0u, host->last_event_source_trigger_data());
 
   EXPECT_TRUE(NavigateToURL(shell(), GURL("about:blank")));
   EXPECT_EQ(1u, host->num_conversions());
@@ -358,6 +381,7 @@
   EXPECT_TRUE(ExecJs(ChildFrameAt(web_contents()->GetMainFrame(), 0),
                      JsReplace("createTrackingPixel($1);", redirect_url)));
   EXPECT_EQ(200u, host->WaitForNumConversions(1));
+  EXPECT_EQ(0u, host->last_event_source_trigger_data());
 
   EXPECT_TRUE(NavigateToURL(shell(), GURL("about:blank")));
   EXPECT_EQ(1u, host->num_conversions());
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc
index 33907f5..117e009 100644
--- a/content/browser/devtools/protocol/network_handler.cc
+++ b/content/browser/devtools/protocol/network_handler.cc
@@ -1869,7 +1869,7 @@
     return;
 
   net::HttpRequestHeaders headers;
-  headers.AddHeadersFromString(nav_request.begin_params()->headers);
+  headers.AddHeadersFromString(nav_request.begin_params().headers);
   std::unique_ptr<DictionaryValue> headers_dict(DictionaryValue::create());
   for (net::HttpRequestHeaders::Iterator it(headers); it.GetNext();)
     headers_dict->setString(it.name(), it.value());
@@ -1919,7 +1919,7 @@
 
   std::unique_ptr<Network::Initiator> initiator;
   const base::Optional<base::Value>& initiator_optional =
-      nav_request.begin_params()->devtools_initiator;
+      nav_request.begin_params().devtools_initiator;
   if (initiator_optional.has_value()) {
     initiator = protocol::ValueTypeConverter<Network::Initiator>::FromValue(
         *toProtocolValue(&initiator_optional.value(), 1000));
@@ -1935,10 +1935,10 @@
   std::string frame_token =
       nav_request.frame_tree_node()->devtools_frame_token().ToString();
 
-  const mojom::BeginNavigationParams* begin_params = nav_request.begin_params();
-  if (begin_params->trust_token_params) {
+  const mojom::BeginNavigationParams& begin_params = nav_request.begin_params();
+  if (begin_params.trust_token_params) {
     request->SetTrustTokenParams(
-        BuildTrustTokenParams(*begin_params->trust_token_params));
+        BuildTrustTokenParams(*begin_params.trust_token_params));
   }
 
   frontend_->RequestWillBeSent(
diff --git a/content/browser/devtools/shared_worker_devtools_agent_host.cc b/content/browser/devtools/shared_worker_devtools_agent_host.cc
index a9c94c6..85faa461 100644
--- a/content/browser/devtools/shared_worker_devtools_agent_host.cc
+++ b/content/browser/devtools/shared_worker_devtools_agent_host.cc
@@ -66,8 +66,8 @@
   return instance_.url();
 }
 
-url::Origin SharedWorkerDevToolsAgentHost::GetConstructorOrigin() {
-  return instance_.constructor_origin();
+storage::StorageKey SharedWorkerDevToolsAgentHost::GetStorageKey() const {
+  return instance_.storage_key();
 }
 
 bool SharedWorkerDevToolsAgentHost::Activate() {
@@ -109,7 +109,7 @@
 bool SharedWorkerDevToolsAgentHost::Matches(SharedWorkerHost* worker_host) {
   return instance_.Matches(worker_host->instance().url(),
                            worker_host->instance().name(),
-                           worker_host->instance().constructor_origin());
+                           worker_host->instance().storage_key());
 }
 
 void SharedWorkerDevToolsAgentHost::WorkerReadyForInspection(
@@ -148,7 +148,7 @@
 DevToolsAgentHostImpl::NetworkLoaderFactoryParamsAndInfo
 SharedWorkerDevToolsAgentHost::CreateNetworkFactoryParamsForDevTools() {
   DCHECK(worker_host_);
-  return {GetConstructorOrigin(), net::SiteForCookies::FromUrl(GetURL()),
+  return {GetStorageKey().origin(), net::SiteForCookies::FromUrl(GetURL()),
           worker_host_->CreateNetworkFactoryParamsForSubresources()};
 }
 
diff --git a/content/browser/devtools/shared_worker_devtools_agent_host.h b/content/browser/devtools/shared_worker_devtools_agent_host.h
index 82c3bdc..c37e2b58 100644
--- a/content/browser/devtools/shared_worker_devtools_agent_host.h
+++ b/content/browser/devtools/shared_worker_devtools_agent_host.h
@@ -40,7 +40,7 @@
       override;
   RenderProcessHost* GetProcessHost() override;
 
-  url::Origin GetConstructorOrigin();
+  storage::StorageKey GetStorageKey() const;
 
   bool Matches(SharedWorkerHost* worker_host);
   void WorkerReadyForInspection(
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index 8d29d2c8..445bb94 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -5804,11 +5804,11 @@
 }
 
 const GURL& NavigationRequest::GetSearchableFormURL() {
-  return begin_params()->searchable_form_url;
+  return begin_params().searchable_form_url;
 }
 
 const std::string& NavigationRequest::GetSearchableFormEncoding() {
-  return begin_params()->searchable_form_encoding;
+  return begin_params().searchable_form_encoding;
 }
 
 ReloadType NavigationRequest::GetReloadType() {
@@ -5833,11 +5833,11 @@
 }
 
 bool NavigationRequest::IsFormSubmission() {
-  return begin_params()->is_form_submission;
+  return begin_params().is_form_submission;
 }
 
 bool NavigationRequest::WasInitiatedByLinkClick() {
-  return begin_params()->was_initiated_by_link_click;
+  return begin_params().was_initiated_by_link_click;
 }
 
 const std::string& NavigationRequest::GetHrefTranslate() {
@@ -5845,7 +5845,7 @@
 }
 
 const base::Optional<blink::Impression>& NavigationRequest::GetImpression() {
-  return begin_params()->impression;
+  return begin_params().impression;
 }
 
 const base::Optional<blink::LocalFrameToken>&
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h
index a501981..7bea4f9a 100644
--- a/content/browser/renderer_host/navigation_request.h
+++ b/content/browser/renderer_host/navigation_request.h
@@ -363,8 +363,8 @@
     return *common_params_;
   }
 
-  const mojom::BeginNavigationParams* begin_params() const {
-    return begin_params_.get();
+  const mojom::BeginNavigationParams& begin_params() const {
+    return *begin_params_;
   }
 
   const mojom::CommitNavigationParams& commit_params() const {
@@ -1597,7 +1597,7 @@
   const GlobalFrameRoutingId previous_render_frame_host_id_;
 
   // Frame token of the frame host that initiated the navigation, derived from
-  // |begin_params()->initiator_frame_token|. This is best effort: it is only
+  // |begin_params().initiator_frame_token|. This is best effort: it is only
   // defined for some renderer-initiated navigations (e.g., not drag and drop).
   // The frame with the corresponding frame token may have been deleted before
   // the navigation begins. This parameter is defined if and only if
diff --git a/content/browser/renderer_host/navigator.cc b/content/browser/renderer_host/navigator.cc
index 22dca70..bc2d7c7f 100644
--- a/content/browser/renderer_host/navigator.cc
+++ b/content/browser/renderer_host/navigator.cc
@@ -881,8 +881,8 @@
       false /* is_browser_initiated_before_unload */);
 
   LogRendererInitiatedBeforeUnloadTime(
-      navigation_request->begin_params()->before_unload_start,
-      navigation_request->begin_params()->before_unload_end);
+      navigation_request->begin_params().before_unload_start,
+      navigation_request->begin_params().before_unload_end);
 
   // This frame has already run beforeunload before it sent this IPC.  See if
   // any of its cross-process subframes also need to run beforeunload.  If so,
diff --git a/content/browser/web_package/signed_exchange_subresource_prefetch_browsertest.cc b/content/browser/web_package/signed_exchange_subresource_prefetch_browsertest.cc
index 5e90f94..282916f 100644
--- a/content/browser/web_package/signed_exchange_subresource_prefetch_browsertest.cc
+++ b/content/browser/web_package/signed_exchange_subresource_prefetch_browsertest.cc
@@ -7,6 +7,7 @@
 
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
+#include "base/format_macros.h"
 #include "base/no_destructor.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
diff --git a/content/browser/web_package/web_bundle_browsertest.cc b/content/browser/web_package/web_bundle_browsertest.cc
index 32dff24..2a5854bc 100644
--- a/content/browser/web_package/web_bundle_browsertest.cc
+++ b/content/browser/web_package/web_bundle_browsertest.cc
@@ -4,6 +4,7 @@
 
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
+#include "base/format_macros.h"
 #include "base/optional.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
diff --git a/content/browser/worker_host/shared_worker_host.cc b/content/browser/worker_host/shared_worker_host.cc
index 2ff575a..af053af8 100644
--- a/content/browser/worker_host/shared_worker_host.cc
+++ b/content/browser/worker_host/shared_worker_host.cc
@@ -237,7 +237,7 @@
   // Send the CreateSharedWorker message.
   factory_.Bind(std::move(factory));
   factory_->CreateSharedWorker(
-      std::move(info), token_, instance_.constructor_origin(),
+      std::move(info), token_, instance_.storage_key().origin(),
       GetContentClient()->browser()->GetUserAgent(),
       GetContentClient()->browser()->GetUserAgentMetadata(),
       devtools_handle_->pause_on_start(), devtools_handle_->dev_tools_token(),
@@ -311,13 +311,13 @@
 
 network::mojom::URLLoaderFactoryParamsPtr
 SharedWorkerHost::CreateNetworkFactoryParamsForSubresources() {
-  url::Origin origin = url::Origin::Create(instance_.url());
+  url::Origin origin = instance().storage_key().origin();
 
   // TODO(https://crbug.com/1060832): Implement COEP reporter for shared
   // workers.
   network::mojom::URLLoaderFactoryParamsPtr factory_params =
       URLLoaderFactoryParamsHelper::CreateForWorker(
-          GetProcessHost(), instance_.constructor_origin(),
+          GetProcessHost(), origin,
           net::IsolationInfo::Create(net::IsolationInfo::RequestType::kOther,
                                      origin, origin,
                                      net::SiteForCookies::FromOrigin(origin)),
@@ -474,11 +474,11 @@
 }
 
 net::NetworkIsolationKey SharedWorkerHost::GetNetworkIsolationKey() const {
-  const url::Origin origin = url::Origin::Create(instance().url());
   // TODO(https://crbug.com/1147281): This is the NetworkIsolationKey of a
   // top-level browsing context, which shouldn't be use for SharedWorkers used
   // in iframes.
-  return net::NetworkIsolationKey::ToDoUseTopFrameOriginAsWell(origin);
+  return net::NetworkIsolationKey::ToDoUseTopFrameOriginAsWell(
+      instance().storage_key().origin());
 }
 
 void SharedWorkerHost::ReportNoBinderForInterface(const std::string& error) {
diff --git a/content/browser/worker_host/shared_worker_host_unittest.cc b/content/browser/worker_host/shared_worker_host_unittest.cc
index 0707ad2..98cdec5 100644
--- a/content/browser/worker_host/shared_worker_host_unittest.cc
+++ b/content/browser/worker_host/shared_worker_host_unittest.cc
@@ -74,7 +74,7 @@
     SharedWorkerInstance instance(
         kWorkerUrl, blink::mojom::ScriptType::kClassic,
         network::mojom::CredentialsMode::kSameOrigin, "name",
-        url::Origin::Create(kWorkerUrl),
+        storage::StorageKey(url::Origin::Create(kWorkerUrl)),
         network::mojom::IPAddressSpace::kPublic,
         blink::mojom::SharedWorkerCreationContextType::kSecure);
     auto host = std::make_unique<SharedWorkerHost>(
diff --git a/content/browser/worker_host/shared_worker_instance_unittest.cc b/content/browser/worker_host/shared_worker_instance_unittest.cc
index 0e34cc51..eddb330 100644
--- a/content/browser/worker_host/shared_worker_instance_unittest.cc
+++ b/content/browser/worker_host/shared_worker_instance_unittest.cc
@@ -9,6 +9,7 @@
 
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
+#include "components/services/storage/public/cpp/storage_key.h"
 #include "services/network/public/mojom/content_security_policy.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -20,10 +21,10 @@
 
   SharedWorkerInstance CreateInstance(const GURL& script_url,
                                       const std::string& name,
-                                      const url::Origin& constructor_origin) {
+                                      const storage::StorageKey& storage_key) {
     return SharedWorkerInstance(
         script_url, blink::mojom::ScriptType::kClassic,
-        network::mojom::CredentialsMode::kSameOrigin, name, constructor_origin,
+        network::mojom::CredentialsMode::kSameOrigin, name, storage_key,
         network::mojom::IPAddressSpace::kPublic,
         blink::mojom::SharedWorkerCreationContextType::kNonsecure);
   }
@@ -31,12 +32,14 @@
   bool Matches(const SharedWorkerInstance& instance,
                const std::string& url,
                const base::StringPiece& name) {
-    url::Origin constructor_origin;
-    if (GURL(url).SchemeIs(url::kDataScheme))
-      constructor_origin = url::Origin::Create(GURL("http://example.com/"));
-    else
-      constructor_origin = url::Origin::Create(GURL(url));
-    return instance.Matches(GURL(url), name.as_string(), constructor_origin);
+    storage::StorageKey storage_key;
+    if (GURL(url).SchemeIs(url::kDataScheme)) {
+      storage_key =
+          storage::StorageKey(url::Origin::Create(GURL("http://example.com/")));
+    } else {
+      storage_key = storage::StorageKey(url::Origin::Create(GURL(url)));
+    }
+    return instance.Matches(GURL(url), name.as_string(), storage_key);
   }
 
  private:
@@ -50,9 +53,9 @@
   // SharedWorker that doesn't have a name option.
   GURL script_url1("http://example.com/w.js");
   std::string name1("");
-  url::Origin constructor_origin1 = url::Origin::Create(script_url1);
+  storage::StorageKey storage_key1(url::Origin::Create(script_url1));
   SharedWorkerInstance instance1 =
-      CreateInstance(script_url1, name1, constructor_origin1);
+      CreateInstance(script_url1, name1, storage_key1);
 
   EXPECT_TRUE(Matches(instance1, "http://example.com/w.js", ""));
   EXPECT_FALSE(Matches(instance1, "http://example.com/w2.js", ""));
@@ -70,9 +73,9 @@
   // SharedWorker that has a name option.
   GURL script_url2("http://example.com/w.js");
   std::string name2("name");
-  url::Origin constructor_origin2 = url::Origin::Create(script_url2);
+  storage::StorageKey storage_key2(url::Origin::Create(script_url2));
   SharedWorkerInstance instance2 =
-      CreateInstance(script_url2, name2, constructor_origin2);
+      CreateInstance(script_url2, name2, storage_key2);
 
   EXPECT_FALSE(Matches(instance2, "http://example.com/w.js", ""));
   EXPECT_FALSE(Matches(instance2, "http://example.com/w2.js", ""));
@@ -99,10 +102,10 @@
   // SharedWorker created from a data: URL without a name option.
   GURL script_url1(kDataURL);
   std::string name1("");
-  url::Origin constructor_origin1 =
-      url::Origin::Create(GURL("http://example.com/"));
+  storage::StorageKey storage_key1(
+      url::Origin::Create(GURL("http://example.com/")));
   SharedWorkerInstance instance1 =
-      CreateInstance(script_url1, name1, constructor_origin1);
+      CreateInstance(script_url1, name1, storage_key1);
 
   EXPECT_FALSE(Matches(instance1, "http://example.com/w.js", ""));
   EXPECT_FALSE(Matches(instance1, "http://example.com/w2.js", ""));
@@ -126,10 +129,10 @@
   // SharedWorker created from a data: URL with a name option.
   GURL script_url2(kDataURL);
   std::string name2("name");
-  url::Origin constructor_origin2 =
-      url::Origin::Create(GURL("http://example.com/"));
+  storage::StorageKey storage_key2(
+      url::Origin::Create(GURL("http://example.com/")));
   SharedWorkerInstance instance2 =
-      CreateInstance(script_url2, name2, constructor_origin2);
+      CreateInstance(script_url2, name2, storage_key2);
 
   EXPECT_FALSE(Matches(instance2, "http://example.com/w.js", ""));
   EXPECT_FALSE(Matches(instance2, "http://example.com/w2.js", ""));
@@ -154,10 +157,10 @@
   // opposed to example.com) without a name option.
   GURL script_url3(kDataURL);
   std::string name3("");
-  url::Origin constructor_origin3 =
-      url::Origin::Create(GURL("http://example.net/"));
+  storage::StorageKey storage_key3(
+      url::Origin::Create(GURL("http://example.net/")));
   SharedWorkerInstance instance3 =
-      CreateInstance(script_url3, name3, constructor_origin3);
+      CreateInstance(script_url3, name3, storage_key3);
 
   EXPECT_FALSE(Matches(instance3, "http://example.com/w.js", ""));
   EXPECT_FALSE(Matches(instance3, "http://example.com/w2.js", ""));
@@ -182,10 +185,10 @@
   // opposed to example.com) with a name option.
   GURL script_url4(kDataURL);
   std::string name4("");
-  url::Origin constructor_origin4 =
-      url::Origin::Create(GURL("http://example.net/"));
+  storage::StorageKey storage_key4(
+      url::Origin::Create(GURL("http://example.net/")));
   SharedWorkerInstance instance4 =
-      CreateInstance(script_url4, name4, constructor_origin4);
+      CreateInstance(script_url4, name4, storage_key4);
 
   EXPECT_FALSE(Matches(instance4, "http://example.com/w.js", ""));
   EXPECT_FALSE(Matches(instance4, "http://example.com/w2.js", ""));
@@ -214,9 +217,9 @@
   // SharedWorker created from a file:// URL without a name option.
   GURL script_url1(kFileURL);
   std::string name1("");
-  url::Origin constructor_origin1 = url::Origin::Create(GURL(kFileURL));
+  storage::StorageKey storage_key1(url::Origin::Create(GURL(kFileURL)));
   SharedWorkerInstance instance1 =
-      CreateInstance(script_url1, name1, constructor_origin1);
+      CreateInstance(script_url1, name1, storage_key1);
 
   EXPECT_FALSE(Matches(instance1, "http://example.com/w.js", ""));
   EXPECT_FALSE(Matches(instance1, "http://example.com/w2.js", ""));
@@ -239,9 +242,9 @@
   // SharedWorker created from a file:// URL with a name option.
   GURL script_url2(kFileURL);
   std::string name2("name");
-  url::Origin constructor_origin2 = url::Origin::Create(GURL(kFileURL));
+  storage::StorageKey storage_key2(url::Origin::Create(GURL(kFileURL)));
   SharedWorkerInstance instance2 =
-      CreateInstance(script_url2, name2, constructor_origin2);
+      CreateInstance(script_url2, name2, storage_key2);
 
   EXPECT_FALSE(Matches(instance2, "http://example.com/w.js", ""));
   EXPECT_FALSE(Matches(instance2, "http://example.com/w2.js", ""));
@@ -271,7 +274,8 @@
     SharedWorkerInstance instance(
         GURL("http://example.com/w.js"), blink::mojom::ScriptType::kClassic,
         network::mojom::CredentialsMode::kSameOrigin, "name",
-        url::Origin::Create(GURL("http://example.com/")), address_space,
+        storage::StorageKey(url::Origin::Create(GURL("http://example.com/"))),
+        address_space,
         blink::mojom::SharedWorkerCreationContextType::kNonsecure);
     EXPECT_EQ(address_space, instance.creation_address_space());
   }
diff --git a/content/browser/worker_host/shared_worker_service_impl.cc b/content/browser/worker_host/shared_worker_service_impl.cc
index 5966521..35db6fde 100644
--- a/content/browser/worker_host/shared_worker_service_impl.cc
+++ b/content/browser/worker_host/shared_worker_service_impl.cc
@@ -17,6 +17,7 @@
 #include "base/feature_list.h"
 #include "base/macros.h"
 #include "base/task/post_task.h"
+#include "components/services/storage/public/cpp/storage_key.h"
 #include "content/browser/appcache/appcache_navigation_handle.h"
 #include "content/browser/devtools/shared_worker_devtools_agent_host.h"
 #include "content/browser/loader/file_url_loader_factory.h"
@@ -90,11 +91,11 @@
 bool SharedWorkerServiceImpl::TerminateWorker(
     const GURL& url,
     const std::string& name,
-    const url::Origin& constructor_origin) {
+    const storage::StorageKey& storage_key) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   SharedWorkerHost* worker_host =
-      FindMatchingSharedWorkerHost(url, name, constructor_origin);
+      FindMatchingSharedWorkerHost(url, name, storage_key);
   if (worker_host) {
     DestroyHost(worker_host);
     return true;
@@ -133,12 +134,12 @@
 
   // Enforce same-origin policy.
   // data: URLs are not considered a different origin.
-  url::Origin constructor_origin = render_frame_host->GetLastCommittedOrigin();
+  storage::StorageKey storage_key(render_frame_host->GetLastCommittedOrigin());
   bool is_cross_origin = !info->url.SchemeIs(url::kDataScheme) &&
-                         url::Origin::Create(info->url) != constructor_origin;
+                         url::Origin::Create(info->url) != storage_key.origin();
   if (is_cross_origin &&
       !GetContentClient()->browser()->DoesSchemeAllowCrossOriginSharedWorker(
-          constructor_origin.scheme())) {
+          storage_key.origin().scheme())) {
     ScriptLoadFailed(std::move(client), /*error_message=*/"");
     return;
   }
@@ -148,7 +149,7 @@
           info->url,
           render_frame_host->ComputeSiteForCookies().RepresentativeUrl(),
           main_frame->GetLastCommittedOrigin(), info->options->name,
-          constructor_origin,
+          storage_key,
           WebContentsImpl::FromRenderFrameHostID(client_render_frame_host_id)
               ->GetBrowserContext(),
           client_render_frame_host_id.child_id,
@@ -157,8 +158,8 @@
     return;
   }
 
-  SharedWorkerHost* host = FindMatchingSharedWorkerHost(
-      info->url, info->options->name, constructor_origin);
+  SharedWorkerHost* host =
+      FindMatchingSharedWorkerHost(info->url, info->options->name, storage_key);
   if (host) {
     // Non-secure contexts cannot connect to secure workers, and secure contexts
     // cannot connect to non-secure workers:
@@ -194,10 +195,10 @@
     return;
   }
   auto partition_domain = site_instance->GetPartitionDomain(storage_partition_);
-  SharedWorkerInstance instance(
-      info->url, info->options->type, info->options->credentials,
-      info->options->name, constructor_origin, info->creation_address_space,
-      creation_context_type);
+  SharedWorkerInstance instance(info->url, info->options->type,
+                                info->options->credentials, info->options->name,
+                                storage_key, info->creation_address_space,
+                                creation_context_type);
   host = CreateWorker(
       *render_frame_host, instance, std::move(info->content_security_policies),
       std::move(info->outside_fetch_client_settings_object), partition_domain,
@@ -364,7 +365,7 @@
   WorkerScriptFetchInitiator::Start(
       worker_process_host->GetID(), host->token(), host->instance().url(),
       &creator, net::SiteForCookies::FromOrigin(worker_origin),
-      host->instance().constructor_origin(),
+      host->instance().storage_key().origin(),
       net::IsolationInfo::Create(
           net::IsolationInfo::RequestType::kOther, worker_origin, worker_origin,
           net::SiteForCookies::FromOrigin(worker_origin)),
@@ -446,9 +447,9 @@
 SharedWorkerHost* SharedWorkerServiceImpl::FindMatchingSharedWorkerHost(
     const GURL& url,
     const std::string& name,
-    const url::Origin& constructor_origin) {
+    const storage::StorageKey& storage_key) {
   for (auto& host : worker_hosts_) {
-    if (host->instance().Matches(url, name, constructor_origin))
+    if (host->instance().Matches(url, name, storage_key))
       return host.get();
   }
   return nullptr;
diff --git a/content/browser/worker_host/shared_worker_service_impl.h b/content/browser/worker_host/shared_worker_service_impl.h
index f53581c7..777cff19 100644
--- a/content/browser/worker_host/shared_worker_service_impl.h
+++ b/content/browser/worker_host/shared_worker_service_impl.h
@@ -14,6 +14,7 @@
 #include "base/containers/unique_ptr_adapters.h"
 #include "base/macros.h"
 #include "base/observer_list.h"
+#include "components/services/storage/public/cpp/storage_key.h"
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
 #include "content/browser/worker_host/shared_worker_host.h"
 #include "content/public/browser/global_routing_id.h"
@@ -54,7 +55,7 @@
   void EnumerateSharedWorkers(Observer* observer) override;
   bool TerminateWorker(const GURL& url,
                        const std::string& name,
-                       const url::Origin& constructor_origin) override;
+                       const storage::StorageKey& storage_key) override;
   void Shutdown() override;
 
   // Uses |url_loader_factory| to load workers' scripts instead of
@@ -124,7 +125,7 @@
   SharedWorkerHost* FindMatchingSharedWorkerHost(
       const GURL& url,
       const std::string& name,
-      const url::Origin& constructor_origin);
+      const storage::StorageKey& storage_key);
 
   void ScriptLoadFailed(
       mojo::PendingRemote<blink::mojom::SharedWorkerClient> client,
diff --git a/content/browser/worker_host/worker_browsertest.cc b/content/browser/worker_host/worker_browsertest.cc
index b7eeaaf..e77094f78 100644
--- a/content/browser/worker_host/worker_browsertest.cc
+++ b/content/browser/worker_host/worker_browsertest.cc
@@ -209,8 +209,8 @@
     DCHECK(partition);
     auto* service = static_cast<SharedWorkerServiceImpl*>(
         partition->GetSharedWorkerService());
-    return service->FindMatchingSharedWorkerHost(url, "",
-                                                 url::Origin::Create(url));
+    return service->FindMatchingSharedWorkerHost(
+        url, "", storage::StorageKey(url::Origin::Create(url)));
   }
 
   net::test_server::EmbeddedTestServer* ssl_server() { return &ssl_server_; }
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index 9b5f90a..d0e5901 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -82,6 +82,7 @@
   deps = [
     ":content_java_resources",
     "//base:base_java",
+    "//components/version_info/android:version_constants_java",
     "//third_party/android_deps:com_google_code_findbugs_jsr305_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//ui/android:ui_no_recycler_view_java",
diff --git a/content/public/android/java/src/org/chromium/content/app/ZygotePreload.java b/content/public/android/java/src/org/chromium/content/app/ZygotePreload.java
index 3a27008..7c6df5e 100644
--- a/content/public/android/java/src/org/chromium/content/app/ZygotePreload.java
+++ b/content/public/android/java/src/org/chromium/content/app/ZygotePreload.java
@@ -15,6 +15,8 @@
 import org.chromium.base.Log;
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.process_launcher.ChildProcessService;
+import org.chromium.build.BuildConfig;
+import org.chromium.components.version_info.VersionConstants;
 
 /**
  * Class used in android:zygotePreloadName attribute of manifest.
@@ -31,6 +33,12 @@
     @Override
     public void doPreload(ApplicationInfo appInfo) {
         try {
+            // Using concatenation rather than %s to allow values to be inlined by R8.
+            Log.i(TAG,
+                    "Loaded Zygote. version=" + VersionConstants.PRODUCT_VERSION
+                            + " minSdkVersion=" + BuildConfig.MIN_SDK_VERSION
+                            + " isBundle=" + BuildConfig.BUNDLES_SUPPORTED);
+
             // The current thread time is the best approximation we have of the zygote start time
             // since Process.getStartUptimeMillis() is not reliable in the zygote process. This will
             // be the total CPU time the current thread has been running, and is reset on fork so
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index f929502..e833ef9 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -467,6 +467,7 @@
   deps = [
     "//build:chromeos_buildflags",
     "//cc",
+    "//components/services/storage/public/cpp",
     "//components/viz/host",
     "//content/browser",  # Must not be public_deps!
     "//device/fido",
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 9778e66..338c0091 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -358,7 +358,7 @@
     const GURL& site_for_cookies,
     const base::Optional<url::Origin>& top_frame_origin,
     const std::string& name,
-    const url::Origin& constructor_origin,
+    const storage::StorageKey& storage_key,
     BrowserContext* context,
     int render_process_id,
     int render_frame_id) {
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 28363c6..802e4f28 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -182,6 +182,7 @@
 
 namespace storage {
 class FileSystemBackend;
+class StorageKey;
 }  // namespace storage
 
 namespace content {
@@ -679,7 +680,7 @@
       const GURL& site_for_cookies,
       const base::Optional<url::Origin>& top_frame_origin,
       const std::string& name,
-      const url::Origin& constructor_origin,
+      const storage::StorageKey& storage_key,
       BrowserContext* context,
       int render_process_id,
       int render_frame_id);
diff --git a/content/public/browser/shared_worker_instance.cc b/content/public/browser/shared_worker_instance.cc
index d47d957..1ebc741 100644
--- a/content/public/browser/shared_worker_instance.cc
+++ b/content/public/browser/shared_worker_instance.cc
@@ -15,21 +15,21 @@
     blink::mojom::ScriptType script_type,
     network::mojom::CredentialsMode credentials_mode,
     const std::string& name,
-    const url::Origin& constructor_origin,
+    const storage::StorageKey& storage_key,
     network::mojom::IPAddressSpace creation_address_space,
     blink::mojom::SharedWorkerCreationContextType creation_context_type)
     : url_(url),
       script_type_(script_type),
       credentials_mode_(credentials_mode),
       name_(name),
-      constructor_origin_(constructor_origin),
+      storage_key_(storage_key),
       creation_address_space_(creation_address_space),
       creation_context_type_(creation_context_type) {
   // Ensure the same-origin policy is enforced correctly.
   DCHECK(url.SchemeIs(url::kDataScheme) ||
          GetContentClient()->browser()->DoesSchemeAllowCrossOriginSharedWorker(
-             constructor_origin.scheme()) ||
-         url::Origin::Create(url).IsSameOriginWith(constructor_origin));
+             storage_key.origin().scheme()) ||
+         url::Origin::Create(url).IsSameOriginWith(storage_key.origin()));
 }
 
 SharedWorkerInstance::SharedWorkerInstance(const SharedWorkerInstance& other) =
@@ -43,20 +43,19 @@
 bool SharedWorkerInstance::Matches(
     const GURL& url,
     const std::string& name,
-    const url::Origin& constructor_origin) const {
+    const storage::StorageKey& storage_key) const {
   // Step 11.2: "If there exists a SharedWorkerGlobalScope object whose closing
   // flag is false, constructor origin is same origin with outside settings's
   // origin, constructor url equals urlRecord, and name equals the value of
   // options's name member, then set worker global scope to that
   // SharedWorkerGlobalScope object."
-  if (!constructor_origin_.IsSameOriginWith(constructor_origin) ||
-      url_ != url || name_ != name) {
+  if (storage_key_ != storage_key || url_ != url || name_ != name) {
     return false;
   }
 
   // TODO(https://crbug.com/794098): file:// URLs should be treated as opaque
   // origins, but not in url::Origin. Therefore, we manually check it here.
-  if (url.SchemeIsFile() || constructor_origin.scheme() == url::kFileScheme)
+  if (url.SchemeIsFile() || storage_key.origin().scheme() == url::kFileScheme)
     return false;
 
   return true;
diff --git a/content/public/browser/shared_worker_instance.h b/content/public/browser/shared_worker_instance.h
index 4bfd64e..97a25e3d 100644
--- a/content/public/browser/shared_worker_instance.h
+++ b/content/public/browser/shared_worker_instance.h
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "components/services/storage/public/cpp/storage_key.h"
 #include "content/common/content_export.h"
 #include "services/network/public/mojom/content_security_policy.mojom.h"
 #include "services/network/public/mojom/fetch_api.mojom.h"
@@ -33,7 +34,7 @@
       blink::mojom::ScriptType script_type,
       network::mojom::CredentialsMode credentials_mode,
       const std::string& name,
-      const url::Origin& constructor_origin,
+      const storage::StorageKey& storage_key,
       network::mojom::IPAddressSpace creation_address_space,
       blink::mojom::SharedWorkerCreationContextType creation_context_type);
   SharedWorkerInstance(const SharedWorkerInstance& other);
@@ -46,9 +47,10 @@
   // constructor origin params according to the SharedWorker constructor steps
   // in the HTML spec:
   // https://html.spec.whatwg.org/multipage/workers.html#shared-workers-and-the-sharedworker-interface
+  // Note that we are using StorageKey to represent the constructor origin.
   bool Matches(const GURL& url,
                const std::string& name,
-               const url::Origin& constructor_origin) const;
+               const storage::StorageKey& storage_key) const;
 
   // Accessors.
   const GURL& url() const { return url_; }
@@ -57,7 +59,7 @@
   network::mojom::CredentialsMode credentials_mode() const {
     return credentials_mode_;
   }
-  const url::Origin& constructor_origin() const { return constructor_origin_; }
+  const storage::StorageKey& storage_key() const { return storage_key_; }
   network::mojom::IPAddressSpace creation_address_space() const {
     return creation_address_space_;
   }
@@ -74,10 +76,11 @@
 
   const std::string name_;
 
-  // The origin of the document that created this shared worker instance. Used
-  // for security checks. See Matches() for details.
+  // The storage key. The key contains the origin of the document that created
+  // this shared worker instance. Used for security checks. See Matches() for
+  // details.
   // https://html.spec.whatwg.org/multipage/workers.html#concept-sharedworkerglobalscope-constructor-origin
-  const url::Origin constructor_origin_;
+  const storage::StorageKey storage_key_;
 
   const network::mojom::IPAddressSpace creation_address_space_;
   const blink::mojom::SharedWorkerCreationContextType creation_context_type_;
diff --git a/content/public/browser/shared_worker_service.h b/content/public/browser/shared_worker_service.h
index e0721b9..1f40342 100644
--- a/content/public/browser/shared_worker_service.h
+++ b/content/public/browser/shared_worker_service.h
@@ -18,9 +18,9 @@
 class UnguessableToken;
 }
 
-namespace url {
-class Origin;
-}
+namespace storage {
+class StorageKey;
+}  // namespace storage
 
 namespace content {
 
@@ -76,12 +76,11 @@
   //       OnClientAdded() for each worker's clients.
   virtual void EnumerateSharedWorkers(Observer* observer) = 0;
 
-  // Terminates the given shared worker identified by its name, the URL of
-  // its main script resource, and the constructor origin. Returns true on
-  // success.
+  // Terminates the given shared worker identified by its name, the URL of its
+  // main script resource, and the storage key.  Returns true on success.
   virtual bool TerminateWorker(const GURL& url,
                                const std::string& name,
-                               const url::Origin& constructor_origin) = 0;
+                               const storage::StorageKey& storage_key) = 0;
 
   // Drops all shared workers and references to processes for shared workers
   // synchronously.
diff --git a/content/renderer/media/media_factory.cc b/content/renderer/media/media_factory.cc
index 2448553b..77e39f1 100644
--- a/content/renderer/media/media_factory.cc
+++ b/content/renderer/media/media_factory.cc
@@ -265,13 +265,6 @@
 // Helper function returning whether SurfaceLayer should be enabled.
 blink::WebMediaPlayer::SurfaceLayerMode GetSurfaceLayerMode(
     MediaPlayerType type) {
-#if defined(OS_ANDROID)
-  if (base::FeatureList::IsEnabled(media::kDisableSurfaceLayerForVideo) &&
-      !features::IsUsingVizForWebView()) {
-    return blink::WebMediaPlayer::SurfaceLayerMode::kNever;
-  }
-#endif  // OS_ANDROID
-
   if (type != MediaPlayerType::kMediaStream)
     return blink::WebMediaPlayer::SurfaceLayerMode::kAlways;
 
diff --git a/content/test/data/conversions/register_conversion.js b/content/test/data/conversions/register_conversion.js
index 14a6e9b..2e5db76 100644
--- a/content/test/data/conversions/register_conversion.js
+++ b/content/test/data/conversions/register_conversion.js
@@ -2,16 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-function registerConversion(data) {
+function registerConversion(data, eventSourceTriggerData) {
   // Use a relative URL for conversion registration.
-  registerConversionForOrigin(data, "");
+  registerConversionForOrigin(data, "", eventSourceTriggerData);
 }
 
-function registerConversionForOrigin(data, origin) {
+function registerConversionForOrigin(data, origin, eventSourceTriggerData) {
   let img = document.createElement("img");
   img.src = origin +
       "/server-redirect?.well-known/register-conversion?conversion-data=" +
-      data;
+      data + (eventSourceTriggerData === undefined ? ""
+              : "&event-source-trigger-data=" + eventSourceTriggerData);
   img.onerror = function () { document.title = "converted"; };
   document.body.appendChild(img);
 }
diff --git a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
index f60bcfd..991da643 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
@@ -57,5 +57,3 @@
 # tags: [ display-server-wayland display-server-x ]
 # results: [ Failure RetryOnFailure Skip ]
 # END TAG HEADER
-
-WebCodecs_EncodeDecodeRender_* [ Failure ]
\ No newline at end of file
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index 031867b..46ceea9 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -694,7 +694,7 @@
 crbug.com/1175233 [ android android-pixel-4 no-passthrough ] deqp/functional/gles3/fborender/resize_03.html [ RetryOnFailure ]
 
 crbug.com/1179432 [ android android-pixel-4 angle-disabled no-passthrough ] deqp/functional/gles3/texturespecification/basic_teximage2d_2d_01.html [ RetryOnFailure ]
-crbug.com/1179432 [ android android-pixel-4 angle-disabled no-passthrough ] deqp/functional/gles3/transformfeedback/array_interleaved_points.html [ RetryOnFailure ]
+crbug.com/1179432 [ android android-pixel-4 angle-disabled no-passthrough ] deqp/functional/gles3/transformfeedback/* [ RetryOnFailure ]
 
 crbug.com/1191030 [ android android-pixel-4 ] conformance/textures/misc/video-rotation.html [ Failure ]
 
diff --git a/docs/security/security-labels.md b/docs/security/security-labels.md
index e398a1c..cce7440e 100644
--- a/docs/security/security-labels.md
+++ b/docs/security/security-labels.md
@@ -50,6 +50,9 @@
     *security@chromium.org* is a member of that group so the former is a
     superset of the latter. **Restrict-View-SecurityNotify** is not suitable for
     sensitive bugs.
+  * **Restrict-View-SecurityNotifyWebRTC**: As above, but additionally
+    gives access to *security-notify@webrtc.org*, a community of downstream
+    WebRTC embedders.
   * **Restrict-View-Google**: Restricts access to users that are Google
     employees (but also via their *chromium.org* accounts). This should be used
     for bugs that aren't OK for external contributors to see (even if we trust
@@ -241,7 +244,8 @@
 
 ### Drop **Restrict-View-{SecurityTeam,SecurityNotify}** From Old And Fixed Bugs
 
-Remove **Restrict-View-SecurityTeam** and **Restrict-View-SecurityNotify** from
+Remove **Restrict-View-SecurityTeam**, **Restrict-View-SecurityNotify** and
+**Restrict-View-SecurityNotifyWebRTC** from
 security bugs that have been closed (Fixed, Verified, Duplicate, WontFix,
 Invalid) more than 14 weeks ago and add the **allpublic** label to make the bugs
 accessible publicly. The idea here is that security bug fixes will generally
@@ -255,6 +259,7 @@
 fixed security bugs. Rationale is that while fixed bugs are generally not
 intended to become public immediately, we'd like to give access to external
 parties depending on Chromium via *security-notify@chromium.org*.
+(WebRTC bugs instead get set to **Restrict-View-SecurityNotifyWebRTC**).
 
 ### Set **Merge-Request-X** For Fixed Bugs
 
diff --git a/extensions/browser/api/declarative_net_request/file_sequence_helper_unittest.cc b/extensions/browser/api/declarative_net_request/file_sequence_helper_unittest.cc
index 98c413e..e58cf516 100644
--- a/extensions/browser/api/declarative_net_request/file_sequence_helper_unittest.cc
+++ b/extensions/browser/api/declarative_net_request/file_sequence_helper_unittest.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/files/file_util.h"
+#include "base/format_macros.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/post_task.h"
diff --git a/gpu/command_buffer/client/shared_image_interface.cc b/gpu/command_buffer/client/shared_image_interface.cc
index 6f501c4..6fc75d6 100644
--- a/gpu/command_buffer/client/shared_image_interface.cc
+++ b/gpu/command_buffer/client/shared_image_interface.cc
@@ -21,4 +21,16 @@
   return Mailbox();
 }
 
+Mailbox SharedImageInterface::CreateSharedImage(
+    gfx::GpuMemoryBuffer* gpu_memory_buffer,
+    GpuMemoryBufferManager* gpu_memory_buffer_manager,
+    const gfx::ColorSpace& color_space,
+    GrSurfaceOrigin surface_origin,
+    SkAlphaType alpha_type,
+    uint32_t usage) {
+  return CreateSharedImage(gpu_memory_buffer, gpu_memory_buffer_manager,
+                           gfx::BufferPlane::DEFAULT, color_space,
+                           surface_origin, alpha_type, usage);
+}
+
 }  // namespace gpu
diff --git a/gpu/command_buffer/client/shared_image_interface.h b/gpu/command_buffer/client/shared_image_interface.h
index 8026dad..1b2c6a1 100644
--- a/gpu/command_buffer/client/shared_image_interface.h
+++ b/gpu/command_buffer/client/shared_image_interface.h
@@ -97,11 +97,20 @@
   virtual Mailbox CreateSharedImage(
       gfx::GpuMemoryBuffer* gpu_memory_buffer,
       GpuMemoryBufferManager* gpu_memory_buffer_manager,
+      gfx::BufferPlane plane,
       const gfx::ColorSpace& color_space,
       GrSurfaceOrigin surface_origin,
       SkAlphaType alpha_type,
       uint32_t usage) = 0;
 
+  // Same as the above, but specifies gfx::BufferPlane::DEFAULT for |plane|.
+  Mailbox CreateSharedImage(gfx::GpuMemoryBuffer* gpu_memory_buffer,
+                            GpuMemoryBufferManager* gpu_memory_buffer_manager,
+                            const gfx::ColorSpace& color_space,
+                            GrSurfaceOrigin surface_origin,
+                            SkAlphaType alpha_type,
+                            uint32_t usage);
+
   // The primary purpose of this is API to use an AHB from media/AImageReader in
   // a thread-safe way. The source mailbox passed to this API must be backed by
   // a SharedImageVideo. The current AHB associated with the video is wrapped in
diff --git a/gpu/command_buffer/service/external_vk_image_skia_representation.cc b/gpu/command_buffer/service/external_vk_image_skia_representation.cc
index 775d88bb..60e8f44e 100644
--- a/gpu/command_buffer/service/external_vk_image_skia_representation.cc
+++ b/gpu/command_buffer/service/external_vk_image_skia_representation.cc
@@ -62,7 +62,7 @@
     SkColorType sk_color_type = viz::ResourceFormatToClosestSkColorType(
         true /* gpu_compositing */, format());
     surface = SkSurface::MakeFromBackendTexture(
-        gr_context, promise_texture->backendTexture(), kTopLeft_GrSurfaceOrigin,
+        gr_context, promise_texture->backendTexture(), surface_origin(),
         final_msaa_count, sk_color_type,
         backing_impl()->color_space().ToSkColorSpace(), &surface_props);
     if (!surface) {
diff --git a/gpu/ipc/client/client_shared_image_interface.cc b/gpu/ipc/client/client_shared_image_interface.cc
index 774d607..4f40653 100644
--- a/gpu/ipc/client/client_shared_image_interface.cc
+++ b/gpu/ipc/client/client_shared_image_interface.cc
@@ -105,13 +105,14 @@
 Mailbox ClientSharedImageInterface::CreateSharedImage(
     gfx::GpuMemoryBuffer* gpu_memory_buffer,
     GpuMemoryBufferManager* gpu_memory_buffer_manager,
+    gfx::BufferPlane plane,
     const gfx::ColorSpace& color_space,
     GrSurfaceOrigin surface_origin,
     SkAlphaType alpha_type,
     uint32_t usage) {
   return AddMailbox(proxy_->CreateSharedImage(
-      gpu_memory_buffer, gpu_memory_buffer_manager, color_space, surface_origin,
-      alpha_type, usage));
+      gpu_memory_buffer, gpu_memory_buffer_manager, plane, color_space,
+      surface_origin, alpha_type, usage));
 }
 
 #if defined(OS_ANDROID)
diff --git a/gpu/ipc/client/client_shared_image_interface.h b/gpu/ipc/client/client_shared_image_interface.h
index e65e745..81de5162 100644
--- a/gpu/ipc/client/client_shared_image_interface.h
+++ b/gpu/ipc/client/client_shared_image_interface.h
@@ -61,6 +61,7 @@
                             base::span<const uint8_t> pixel_data) override;
   Mailbox CreateSharedImage(gfx::GpuMemoryBuffer* gpu_memory_buffer,
                             GpuMemoryBufferManager* gpu_memory_buffer_manager,
+                            gfx::BufferPlane plane,
                             const gfx::ColorSpace& color_space,
                             GrSurfaceOrigin surface_origin,
                             SkAlphaType alpha_type,
diff --git a/gpu/ipc/client/shared_image_interface_proxy.cc b/gpu/ipc/client/shared_image_interface_proxy.cc
index 02e74d5a..68cae6b 100644
--- a/gpu/ipc/client/shared_image_interface_proxy.cc
+++ b/gpu/ipc/client/shared_image_interface_proxy.cc
@@ -156,6 +156,7 @@
 Mailbox SharedImageInterfaceProxy::CreateSharedImage(
     gfx::GpuMemoryBuffer* gpu_memory_buffer,
     GpuMemoryBufferManager* gpu_memory_buffer_manager,
+    gfx::BufferPlane plane,
     const gfx::ColorSpace& color_space,
     GrSurfaceOrigin surface_origin,
     SkAlphaType alpha_type,
@@ -172,7 +173,7 @@
   params.handle = gpu_memory_buffer->CloneHandle();
   params.size = gpu_memory_buffer->GetSize();
   params.format = gpu_memory_buffer->GetFormat();
-  params.plane = gfx::BufferPlane::DEFAULT;
+  params.plane = plane;
   params.color_space = color_space;
   params.usage = usage;
   params.surface_origin = surface_origin;
diff --git a/gpu/ipc/client/shared_image_interface_proxy.h b/gpu/ipc/client/shared_image_interface_proxy.h
index b97c35b91..cc5f411 100644
--- a/gpu/ipc/client/shared_image_interface_proxy.h
+++ b/gpu/ipc/client/shared_image_interface_proxy.h
@@ -35,6 +35,7 @@
                             base::span<const uint8_t> pixel_data);
   Mailbox CreateSharedImage(gfx::GpuMemoryBuffer* gpu_memory_buffer,
                             GpuMemoryBufferManager* gpu_memory_buffer_manager,
+                            gfx::BufferPlane plane,
                             const gfx::ColorSpace& color_space,
                             GrSurfaceOrigin surface_origin,
                             SkAlphaType alpha_type,
diff --git a/gpu/ipc/shared_image_interface_in_process.cc b/gpu/ipc/shared_image_interface_in_process.cc
index dfb2ba9a8..caa1cec 100644
--- a/gpu/ipc/shared_image_interface_in_process.cc
+++ b/gpu/ipc/shared_image_interface_in_process.cc
@@ -233,6 +233,7 @@
 Mailbox SharedImageInterfaceInProcess::CreateSharedImage(
     gfx::GpuMemoryBuffer* gpu_memory_buffer,
     GpuMemoryBufferManager* gpu_memory_buffer_manager,
+    gfx::BufferPlane plane,
     const gfx::ColorSpace& color_space,
     GrSurfaceOrigin surface_origin,
     SkAlphaType alpha_type,
@@ -244,6 +245,8 @@
   // TODO(piman): DCHECK GMB format support.
   DCHECK(IsImageSizeValidForGpuMemoryBufferFormat(
       gpu_memory_buffer->GetSize(), gpu_memory_buffer->GetFormat()));
+  DCHECK(IsPlaneValidForGpuMemoryBufferFormat(plane,
+                                              gpu_memory_buffer->GetFormat()));
 
   auto mailbox = Mailbox::GenerateForSharedImage();
   gfx::GpuMemoryBufferHandle handle = gpu_memory_buffer->CloneHandle();
@@ -260,7 +263,7 @@
         base::BindOnce(
             &SharedImageInterfaceInProcess::CreateGMBSharedImageOnGpuThread,
             base::Unretained(this), mailbox, std::move(handle),
-            gpu_memory_buffer->GetFormat(), gpu_memory_buffer->GetSize(),
+            gpu_memory_buffer->GetFormat(), plane, gpu_memory_buffer->GetSize(),
             color_space, surface_origin, alpha_type, usage, sync_token),
         {});
   }
@@ -276,6 +279,7 @@
     const Mailbox& mailbox,
     gfx::GpuMemoryBufferHandle handle,
     gfx::BufferFormat format,
+    gfx::BufferPlane plane,
     const gfx::Size& size,
     const gfx::ColorSpace& color_space,
     GrSurfaceOrigin surface_origin,
@@ -291,9 +295,9 @@
   // TODO(piman): add support for SurfaceHandle (for backbuffers for ozone/drm).
   SurfaceHandle surface_handle = kNullSurfaceHandle;
   if (!shared_image_factory_->CreateSharedImage(
-          mailbox, kDisplayCompositorClientId, std::move(handle), format,
-          gfx::BufferPlane::DEFAULT, surface_handle, size, color_space,
-          surface_origin, alpha_type, usage)) {
+          mailbox, kDisplayCompositorClientId, std::move(handle), format, plane,
+          surface_handle, size, color_space, surface_origin, alpha_type,
+          usage)) {
     // Signal errors by losing the command buffer.
     // Signal errors by losing the command buffer.
     command_buffer_helper_->SetError();
diff --git a/gpu/ipc/shared_image_interface_in_process.h b/gpu/ipc/shared_image_interface_in_process.h
index 0a2246f..e3a1dff 100644
--- a/gpu/ipc/shared_image_interface_in_process.h
+++ b/gpu/ipc/shared_image_interface_in_process.h
@@ -71,6 +71,7 @@
   // the GPU channel is lost).
   Mailbox CreateSharedImage(gfx::GpuMemoryBuffer* gpu_memory_buffer,
                             GpuMemoryBufferManager* gpu_memory_buffer_manager,
+                            gfx::BufferPlane plane,
                             const gfx::ColorSpace& color_space,
                             GrSurfaceOrigin surface_origin,
                             SkAlphaType alpha_type,
@@ -184,6 +185,7 @@
   void CreateGMBSharedImageOnGpuThread(const Mailbox& mailbox,
                                        gfx::GpuMemoryBufferHandle handle,
                                        gfx::BufferFormat format,
+                                       gfx::BufferPlane plane,
                                        const gfx::Size& size,
                                        const gfx::ColorSpace& color_space,
                                        GrSurfaceOrigin surface_origin,
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg
index bef88abd..16251c5 100644
--- a/infra/config/generated/commit-queue.cfg
+++ b/infra/config/generated/commit-queue.cfg
@@ -1246,6 +1246,10 @@
         includable_only: true
       }
       builders {
+        name: "chromium/try/linux-xenial-rel"
+        includable_only: true
+      }
+      builders {
         name: "chromium/try/linux_android_dbg_ng"
         includable_only: true
       }
@@ -1269,10 +1273,7 @@
       }
       builders {
         name: "chromium/try/linux_chromium_asan_rel_ng_bionic"
-        experiment_percentage: 10
-        location_regexp: ".*"
-        location_regexp_exclude: ".+/[+]/docs/.+"
-        location_regexp_exclude: ".+/[+]/infra/config/.+"
+        includable_only: true
       }
       builders {
         name: "chromium/try/linux_chromium_cfi_rel_ng"
@@ -1326,7 +1327,10 @@
       }
       builders {
         name: "chromium/try/linux_chromium_tsan_rel_ng_bionic"
-        includable_only: true
+        experiment_percentage: 10
+        location_regexp: ".*"
+        location_regexp_exclude: ".+/[+]/docs/.+"
+        location_regexp_exclude: ".+/[+]/infra/config/.+"
       }
       builders {
         name: "chromium/try/linux_chromium_ubsan_rel_ng"
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md
index 384f33e1..5a3b9ee 100644
--- a/infra/config/generated/cq-builders.md
+++ b/infra/config/generated/cq-builders.md
@@ -449,6 +449,6 @@
 * [linux-rel-rts](https://ci.chromium.org/p/chromium/builders/try/linux-rel-rts) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+linux-rel-rts)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+linux-rel-rts))
   * Experiment percentage: 5.0
 
-* [linux_chromium_asan_rel_ng_bionic](https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_rel_ng_bionic) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+linux_chromium_asan_rel_ng_bionic)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+linux_chromium_asan_rel_ng_bionic))
+* [linux_chromium_tsan_rel_ng_bionic](https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_rel_ng_bionic) ([definition](https://cs.chromium.org/search?q=package:%5Echromium$+file:/cq.star$+-file:/beta/+-file:/stable/+linux_chromium_tsan_rel_ng_bionic)) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+linux_chromium_tsan_rel_ng_bionic))
   * Experiment percentage: 10.0
 
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index 0465d162..c224ca96 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -27082,6 +27082,68 @@
       }
     }
     builders {
+      name: "linux-xenial-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.ci"
+      dimensions: "ssd:0"
+      exe {
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        cmd: "recipes"
+      }
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":500,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.linux\",\"recipe\":\"chromium\"}"
+      execution_timeout_secs: 10800
+      build_numbers: YES
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "chromium.resultdb.result_sink"
+        value: 100
+      }
+      experiments {
+        key: "chromium.resultdb.result_sink.gtests_local"
+        value: 100
+      }
+      experiments {
+        key: "chromium.resultdb.result_sink.junit_tests"
+        value: 100
+      }
+      experiments {
+        key: "luci.buildbucket.use_bbagent"
+        value: 100
+      }
+      experiments {
+        key: "luci.use_realms"
+        value: 100
+      }
+      resultdb {
+        enable: true
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "ci_test_results"
+          test_results {}
+        }
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "gpu_ci_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+"
+            }
+          }
+        }
+        history_options {
+          use_invocation_timestamp: true
+        }
+      }
+    }
+    builders {
       name: "mac-angle-amd"
       swarming_host: "chromium-swarm.appspot.com"
       swarming_tags: "vpython:native-python-wrapper"
@@ -47771,6 +47833,71 @@
       }
     }
     builders {
+      name: "linux-xenial-rel"
+      swarming_host: "chromium-swarm.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "builderless:1"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.chromium.try"
+      dimensions: "ssd:0"
+      exe {
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        cmd: "recipes"
+      }
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      execution_timeout_secs: 14400
+      expiration_secs: 7200
+      grace_period {
+        seconds: 120
+      }
+      caches {
+        name: "win_toolchain"
+        path: "win_toolchain"
+      }
+      build_numbers: YES
+      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+      task_template_canary_percentage {
+        value: 5
+      }
+      experiments {
+        key: "chromium.resultdb.result_sink"
+        value: 100
+      }
+      experiments {
+        key: "chromium.resultdb.result_sink.junit_tests"
+        value: 100
+      }
+      experiments {
+        key: "luci.use_realms"
+        value: 100
+      }
+      resultdb {
+        enable: true
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "try_test_results"
+          test_results {}
+        }
+        bq_exports {
+          project: "luci-resultdb"
+          dataset: "chromium"
+          table: "gpu_try_test_results"
+          test_results {
+            predicate {
+              test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+"
+            }
+          }
+        }
+        history_options {
+          use_invocation_timestamp: true
+        }
+      }
+    }
+    builders {
       name: "linux_android_dbg_ng"
       swarming_host: "chromium-swarm.appspot.com"
       swarming_tags: "vpython:native-python-wrapper"
@@ -48036,7 +48163,7 @@
       dimensions: "builderless:1"
       dimensions: "cores:8"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
+      dimensions: "os:Ubuntu-16.04|Ubuntu-18.04"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:1"
       exe {
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg
index 65337bf..abb4a68 100644
--- a/infra/config/generated/luci-milo.cfg
+++ b/infra/config/generated/luci-milo.cfg
@@ -256,6 +256,11 @@
     short_name: "tru"
   }
   builders {
+    name: "buildbucket/luci.chromium.ci/linux-xenial-rel"
+    category: "chromium.linux|release"
+    short_name: "xen"
+  }
+  builders {
     name: "buildbucket/luci.chromium.ci/Linux Tester (Ozone Headless)"
     category: "chromium.linux|release|ozone"
     short_name: "ltoh"
@@ -8060,6 +8065,11 @@
     short_name: "tru"
   }
   builders {
+    name: "buildbucket/luci.chromium.ci/linux-xenial-rel"
+    category: "release"
+    short_name: "xen"
+  }
+  builders {
     name: "buildbucket/luci.chromium.ci/Linux Tester (Ozone Headless)"
     category: "release|ozone"
     short_name: "ltoh"
@@ -12980,6 +12990,9 @@
     name: "buildbucket/luci.chromium.try/linux-wpt-input-fyi-rel"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/linux-xenial-rel"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/linux_android_dbg_ng"
   }
   builders {
@@ -13927,6 +13940,9 @@
     name: "buildbucket/luci.chromium.try/linux-wpt-input-fyi-rel"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/linux-xenial-rel"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/linux_chromium_analysis"
   }
   builders {
diff --git a/infra/config/generated/luci-notify.cfg b/infra/config/generated/luci-notify.cfg
index 1fae14a..6f727714 100644
--- a/infra/config/generated/luci-notify.cfg
+++ b/infra/config/generated/luci-notify.cfg
@@ -3252,6 +3252,32 @@
     }
     template: "tree_closure_email_template"
   }
+  notifications {
+    on_occurrence: FAILURE
+    failed_step_regexp: "\\b(bot_update|compile|gclient runhooks|runhooks|update|\\w*nocompile_test)\\b"
+    email {
+      recipients: "thomasanderson@chromium.org"
+    }
+  }
+  builders {
+    bucket: "ci"
+    name: "linux-xenial-rel"
+    repository: "https://chromium.googlesource.com/chromium/src"
+  }
+  tree_closers {
+    tree_status_host: "chromium-status.appspot.com"
+    failed_step_regexp: "\\b(bot_update|compile|gclient runhooks|runhooks|update|\\w*nocompile_test)\\b"
+  }
+}
+notifiers {
+  notifications {
+    on_occurrence: FAILURE
+    failed_step_regexp: "\\b(bot_update|compile|gclient runhooks|runhooks|update|\\w*nocompile_test)\\b"
+    email {
+      rotation_urls: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-build-sheriff"
+    }
+    template: "tree_closure_email_template"
+  }
   builders {
     bucket: "ci"
     name: "mac-archive-dbg"
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg
index f03934ca..dce6c2e 100644
--- a/infra/config/generated/luci-scheduler.cfg
+++ b/infra/config/generated/luci-scheduler.cfg
@@ -5759,6 +5759,16 @@
   }
 }
 job {
+  id: "linux-xenial-rel"
+  realm: "ci"
+  acl_sets: "ci"
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "linux-xenial-rel"
+  }
+}
+job {
   id: "linux_chromium_bot_db_exporter"
   realm: "findit"
   schedule: "0 0,6,12,18 * * *"
@@ -6983,6 +6993,7 @@
   triggers: "linux-wpt-fyi-rel"
   triggers: "linux-wpt-identity-fyi-rel"
   triggers: "linux-wpt-input-fyi-rel"
+  triggers: "linux-xenial-rel"
   triggers: "mac-angle-builder"
   triggers: "mac-angle-chromium-builder"
   triggers: "mac-archive-dbg"
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star
index ad44aa02..22617d76 100644
--- a/infra/config/lib/builders.star
+++ b/infra/config/lib/builders.star
@@ -59,6 +59,10 @@
     ANDROID = os_enum("Android", os_category.ANDROID),
     LINUX_TRUSTY = os_enum("Ubuntu-14.04", os_category.LINUX),
     LINUX_XENIAL = os_enum("Ubuntu-16.04", os_category.LINUX),
+    LINUX_XENIAL_OR_BIONIC = os_enum(
+        "Ubuntu-16.04|Ubuntu-18.04",
+        os_category.LINUX,
+    ),
     LINUX_BIONIC = os_enum("Ubuntu-18.04", os_category.LINUX),
     # xenial -> bionic migration
     # * If a builder does not already explicitly set an os value, use
diff --git a/infra/config/subprojects/chromium/ci.star b/infra/config/subprojects/chromium/ci.star
index 0cd7ee8..2d3a3959 100644
--- a/infra/config/subprojects/chromium/ci.star
+++ b/infra/config/subprojects/chromium/ci.star
@@ -5111,6 +5111,16 @@
 )
 
 ci.linux_builder(
+    name = "linux-xenial-rel",
+    console_view_entry = consoles.console_view_entry(
+        category = "release",
+        short_name = "xen",
+    ),
+    main_console_view = "main",
+    os = os.LINUX_XENIAL,
+)
+
+ci.linux_builder(
     name = "metadata-exporter",
     console_view_entry = consoles.console_view_entry(
         console_view = "metadata.exporter",
diff --git a/infra/config/subprojects/chromium/try.star b/infra/config/subprojects/chromium/try.star
index 41f8cb3..801bb82 100644
--- a/infra/config/subprojects/chromium/try.star
+++ b/infra/config/subprojects/chromium/try.star
@@ -1294,6 +1294,12 @@
 )
 
 try_.chromium_linux_builder(
+    name = "linux-xenial-rel",
+    goma_jobs = goma.jobs.J150,
+    os = os.LINUX_XENIAL,
+)
+
+try_.chromium_linux_builder(
     name = "linux-viz-rel",
 )
 
@@ -1328,6 +1334,7 @@
     ssd = True,
     main_list_view = "try",
     tryjob = try_.job(),
+    os = os.LINUX_XENIAL_OR_BIONIC,
 )
 
 # TODO(crbug.com/1200574): Remove after migration.
@@ -1338,9 +1345,6 @@
     ssd = True,
     os = os.LINUX_BIONIC,
     main_list_view = "try",
-    tryjob = try_.job(
-        experiment_percentage = 10,
-    ),
 )
 
 try_.chromium_linux_builder(
@@ -1421,6 +1425,9 @@
     goma_jobs = goma.jobs.J150,
     os = os.LINUX_BIONIC,
     main_list_view = "try",
+    tryjob = try_.job(
+        experiment_percentage = 10,
+    ),
 )
 
 try_.chromium_linux_builder(
diff --git a/ios/chrome/app/app_startup_parameters.h b/ios/chrome/app/app_startup_parameters.h
index c210376..5134b9e4 100644
--- a/ios/chrome/app/app_startup_parameters.h
+++ b/ios/chrome/app/app_startup_parameters.h
@@ -8,6 +8,7 @@
 #import <Foundation/Foundation.h>
 
 #include <map>
+#include <string>
 
 enum class ApplicationModeForTabOpening { NORMAL, INCOGNITO, CURRENT };
 
diff --git a/ios/chrome/browser/crash_report/breadcrumbs/application_breadcrumbs_logger.h b/ios/chrome/browser/crash_report/breadcrumbs/application_breadcrumbs_logger.h
index e175bd88..e8ea108 100644
--- a/ios/chrome/browser/crash_report/breadcrumbs/application_breadcrumbs_logger.h
+++ b/ios/chrome/browser/crash_report/breadcrumbs/application_breadcrumbs_logger.h
@@ -8,6 +8,7 @@
 #import <UIKit/UIKit.h>
 
 #include <memory>
+#include <string>
 
 #include "base/memory/memory_pressure_listener.h"
 #include "base/metrics/user_metrics.h"
diff --git a/ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_observer_bridge.h b/ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_observer_bridge.h
index bcc99253..96441d9a 100644
--- a/ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_observer_bridge.h
+++ b/ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_observer_bridge.h
@@ -7,8 +7,9 @@
 
 #import <Foundation/Foundation.h>
 
-#include "components/breadcrumbs/core/breadcrumb_manager_observer.h"
+#include <string>
 
+#include "components/breadcrumbs/core/breadcrumb_manager_observer.h"
 
 namespace breadcrumbs {
 class BreadcrumbManager;
diff --git a/ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_tab_helper.h b/ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_tab_helper.h
index 15b6eb5..506931d 100644
--- a/ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_tab_helper.h
+++ b/ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_tab_helper.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_CRASH_REPORT_BREADCRUMBS_BREADCRUMB_MANAGER_TAB_HELPER_H_
 #define IOS_CHROME_BROWSER_CRASH_REPORT_BREADCRUMBS_BREADCRUMB_MANAGER_TAB_HELPER_H_
 
+#include <string>
+
 #include "base/scoped_observer.h"
 #include "components/infobars/core/infobar_manager.h"
 #include "ios/web/public/web_state_observer.h"
diff --git a/ios/chrome/browser/crash_report/crash_reporter_breadcrumb_observer.h b/ios/chrome/browser/crash_report/crash_reporter_breadcrumb_observer.h
index 6cb66e1..d362979 100644
--- a/ios/chrome/browser/crash_report/crash_reporter_breadcrumb_observer.h
+++ b/ios/chrome/browser/crash_report/crash_reporter_breadcrumb_observer.h
@@ -7,6 +7,7 @@
 
 #include <map>
 #include <memory>
+#include <string>
 
 #import <Foundation/Foundation.h>
 
diff --git a/ios/chrome/browser/crash_report/crash_reporter_url_observer.h b/ios/chrome/browser/crash_report/crash_reporter_url_observer.h
index 51bbd6e..1150a50 100644
--- a/ios/chrome/browser/crash_report/crash_reporter_url_observer.h
+++ b/ios/chrome/browser/crash_report/crash_reporter_url_observer.h
@@ -8,6 +8,7 @@
 #import <Foundation/Foundation.h>
 
 #include <map>
+#include <string>
 
 #include "ios/chrome/browser/web_state_list/web_state_list_observer.h"
 #include "ios/web/public/web_state_observer.h"
diff --git a/ios/chrome/browser/link_to_text/link_to_text_utils.h b/ios/chrome/browser/link_to_text/link_to_text_utils.h
index 7937242..6627e48 100644
--- a/ios/chrome/browser/link_to_text/link_to_text_utils.h
+++ b/ios/chrome/browser/link_to_text/link_to_text_utils.h
@@ -8,6 +8,8 @@
 #import <CoreGraphics/CoreGraphics.h>
 #import <UIKit/UIKit.h>
 
+#include <string>
+
 #import "base/optional.h"
 #import "components/shared_highlighting/core/common/shared_highlighting_metrics.h"
 #import "ios/chrome/browser/link_to_text/link_generation_outcome.h"
diff --git a/ios/chrome/browser/metrics/first_user_action_recorder.h b/ios/chrome/browser/metrics/first_user_action_recorder.h
index 5bc87aa..6ce03cc 100644
--- a/ios/chrome/browser/metrics/first_user_action_recorder.h
+++ b/ios/chrome/browser/metrics/first_user_action_recorder.h
@@ -5,6 +5,7 @@
 #ifndef IOS_CHROME_BROWSER_METRICS_FIRST_USER_ACTION_RECORDER_H_
 #define IOS_CHROME_BROWSER_METRICS_FIRST_USER_ACTION_RECORDER_H_
 
+#include <string>
 #include <vector>
 
 #include "base/cancelable_callback.h"
diff --git a/ios/chrome/browser/omaha/omaha_service.h b/ios/chrome/browser/omaha/omaha_service.h
index 902f8c38..a89a81238 100644
--- a/ios/chrome/browser/omaha/omaha_service.h
+++ b/ios/chrome/browser/omaha/omaha_service.h
@@ -6,6 +6,7 @@
 #define IOS_CHROME_BROWSER_OMAHA_OMAHA_SERVICE_H_
 
 #include <memory>
+#include <string>
 
 #include "base/callback.h"
 #include "base/gtest_prod_util.h"
diff --git a/ios/chrome/browser/open_in/open_in_tab_helper.h b/ios/chrome/browser/open_in/open_in_tab_helper.h
index 409b496..99b9c4ddc 100644
--- a/ios/chrome/browser/open_in/open_in_tab_helper.h
+++ b/ios/chrome/browser/open_in/open_in_tab_helper.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_OPEN_IN_OPEN_IN_TAB_HELPER_H_
 #define IOS_CHROME_BROWSER_OPEN_IN_OPEN_IN_TAB_HELPER_H_
 
+#include <string>
+
 #include "base/macros.h"
 #import "ios/chrome/browser/open_in/open_in_tab_helper_delegate.h"
 #include "ios/web/public/web_state_observer.h"
diff --git a/ios/chrome/browser/overlays/public/web_content_area/http_auth_overlay.h b/ios/chrome/browser/overlays/public/web_content_area/http_auth_overlay.h
index 8a5cbea..e53ec58 100644
--- a/ios/chrome/browser/overlays/public/web_content_area/http_auth_overlay.h
+++ b/ios/chrome/browser/overlays/public/web_content_area/http_auth_overlay.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_WEB_CONTENT_AREA_HTTP_AUTH_OVERLAY_H_
 #define IOS_CHROME_BROWSER_OVERLAYS_PUBLIC_WEB_CONTENT_AREA_HTTP_AUTH_OVERLAY_H_
 
+#include <string>
+
 #include "ios/chrome/browser/overlays/public/overlay_request_config.h"
 #include "ios/chrome/browser/overlays/public/overlay_response_info.h"
 #include "url/gurl.h"
diff --git a/ios/chrome/browser/reading_list/reading_list_download_service.h b/ios/chrome/browser/reading_list/reading_list_download_service.h
index d187fda..4e383475 100644
--- a/ios/chrome/browser/reading_list/reading_list_download_service.h
+++ b/ios/chrome/browser/reading_list/reading_list_download_service.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_READING_LIST_READING_LIST_DOWNLOAD_SERVICE_H_
 #define IOS_CHROME_BROWSER_READING_LIST_READING_LIST_DOWNLOAD_SERVICE_H_
 
+#include <string>
+
 #include "base/macros.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/reading_list/core/reading_list_model_observer.h"
diff --git a/ios/chrome/browser/reading_list/url_downloader.h b/ios/chrome/browser/reading_list/url_downloader.h
index f5331da..30f044f3 100644
--- a/ios/chrome/browser/reading_list/url_downloader.h
+++ b/ios/chrome/browser/reading_list/url_downloader.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_READING_LIST_URL_DOWNLOADER_H_
 #define IOS_CHROME_BROWSER_READING_LIST_URL_DOWNLOADER_H_
 
+#include <string>
+
 #include "base/callback.h"
 #include "base/containers/circular_deque.h"
 #include "base/files/file_path.h"
diff --git a/ios/chrome/browser/safe_browsing/safe_browsing_query_manager.h b/ios/chrome/browser/safe_browsing/safe_browsing_query_manager.h
index 0d2aa785..80e4299 100644
--- a/ios/chrome/browser/safe_browsing/safe_browsing_query_manager.h
+++ b/ios/chrome/browser/safe_browsing/safe_browsing_query_manager.h
@@ -6,6 +6,7 @@
 #define IOS_CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_QUERY_MANAGER_H_
 
 #include <map>
+#include <string>
 
 #include "base/containers/flat_map.h"
 #include "base/containers/unique_ptr_adapters.h"
diff --git a/ios/chrome/browser/safe_browsing/unsafe_resource_util.h b/ios/chrome/browser/safe_browsing/unsafe_resource_util.h
index b3cc294..314c5b12 100644
--- a/ios/chrome/browser/safe_browsing/unsafe_resource_util.h
+++ b/ios/chrome/browser/safe_browsing/unsafe_resource_util.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_SAFE_BROWSING_UNSAFE_RESOURCE_UTIL_H_
 #define IOS_CHROME_BROWSER_SAFE_BROWSING_UNSAFE_RESOURCE_UTIL_H_
 
+#include <string>
+
 #include "components/security_interstitials/core/base_safe_browsing_error_ui.h"
 #include "components/security_interstitials/core/unsafe_resource.h"
 
diff --git a/ios/chrome/browser/signin/gaia_auth_fetcher_ios_ns_url_session_bridge.h b/ios/chrome/browser/signin/gaia_auth_fetcher_ios_ns_url_session_bridge.h
index 795f9b1..d26a9bc3 100644
--- a/ios/chrome/browser/signin/gaia_auth_fetcher_ios_ns_url_session_bridge.h
+++ b/ios/chrome/browser/signin/gaia_auth_fetcher_ios_ns_url_session_bridge.h
@@ -7,6 +7,7 @@
 
 #import <Foundation/Foundation.h>
 
+#include <string>
 #include <vector>
 
 #include "ios/chrome/browser/signin/gaia_auth_fetcher_ios_bridge.h"
diff --git a/ios/chrome/browser/test/perf_test_with_bvc_ios.h b/ios/chrome/browser/test/perf_test_with_bvc_ios.h
index c1440308..0b81780 100644
--- a/ios/chrome/browser/test/perf_test_with_bvc_ios.h
+++ b/ios/chrome/browser/test/perf_test_with_bvc_ios.h
@@ -8,6 +8,7 @@
 #import <UIKit/UIKit.h>
 
 #include <memory>
+#include <string>
 
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #import "ios/chrome/browser/main/browser_web_state_list_delegate.h"
diff --git a/ios/chrome/browser/translate/fake_translate_infobar_delegate.h b/ios/chrome/browser/translate/fake_translate_infobar_delegate.h
index 7a16e67..283fc3f1 100644
--- a/ios/chrome/browser/translate/fake_translate_infobar_delegate.h
+++ b/ios/chrome/browser/translate/fake_translate_infobar_delegate.h
@@ -5,9 +5,10 @@
 #ifndef IOS_CHROME_BROWSER_TRANSLATE_FAKE_TRANSLATE_INFOBAR_DELEGATE_H_
 #define IOS_CHROME_BROWSER_TRANSLATE_FAKE_TRANSLATE_INFOBAR_DELEGATE_H_
 
-#include "components/translate/core/browser/translate_infobar_delegate.h"
+#include <string>
 
 #include "components/translate/core/browser/mock_translate_driver.h"
+#include "components/translate/core/browser/translate_infobar_delegate.h"
 
 namespace sync_preferences {
 class TestingPrefServiceSyncable;
diff --git a/ios/chrome/browser/translate/translate_service_ios.h b/ios/chrome/browser/translate/translate_service_ios.h
index 4bbc3a7f..b10e57e3 100644
--- a/ios/chrome/browser/translate/translate_service_ios.h
+++ b/ios/chrome/browser/translate/translate_service_ios.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_TRANSLATE_TRANSLATE_SERVICE_IOS_H_
 #define IOS_CHROME_BROWSER_TRANSLATE_TRANSLATE_SERVICE_IOS_H_
 
+#include <string>
+
 #include "base/macros.h"
 #include "components/web_resource/resource_request_allowed_notifier.h"
 
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.mm b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.mm
index 5f1ce51..8eba7d5 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_app_interface.h"
 
+#include "base/format_macros.h"
 #include "base/strings/sys_string_conversions.h"
 #import "base/test/ios/wait_util.h"
 #include "components/bookmarks/browser/bookmark_model.h"
diff --git a/ios/chrome/browser/ui/content_suggestions/mediator_util.h b/ios/chrome/browser/ui/content_suggestions/mediator_util.h
index aaff7a9..6eabac4 100644
--- a/ios/chrome/browser/ui/content_suggestions/mediator_util.h
+++ b/ios/chrome/browser/ui/content_suggestions/mediator_util.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_MEDIATOR_UTIL_H_
 #define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_MEDIATOR_UTIL_H_
 
+#include <string>
+
 #include "base/bind.h"
 #include "base/optional.h"
 #include "components/ntp_snippets/category_info.h"
diff --git a/ios/chrome/browser/ui/settings/autofill/cells/autofill_card_item.h b/ios/chrome/browser/ui/settings/autofill/cells/autofill_card_item.h
index 2e53a424..ae85c7a 100644
--- a/ios/chrome/browser/ui/settings/autofill/cells/autofill_card_item.h
+++ b/ios/chrome/browser/ui/settings/autofill/cells/autofill_card_item.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_CELLS_AUTOFILL_CARD_ITEM_H_
 #define IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_CELLS_AUTOFILL_CARD_ITEM_H_
 
+#include <string>
+
 #import "ios/chrome/browser/ui/table_view/cells/table_view_multi_detail_text_item.h"
 
 // Item for autofill credit card.
diff --git a/ios/chrome/browser/ui/settings/autofill/cells/autofill_profile_item.h b/ios/chrome/browser/ui/settings/autofill/cells/autofill_profile_item.h
index dd02fd52..fc7a708e 100644
--- a/ios/chrome/browser/ui/settings/autofill/cells/autofill_profile_item.h
+++ b/ios/chrome/browser/ui/settings/autofill/cells/autofill_profile_item.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_CELLS_AUTOFILL_PROFILE_ITEM_H_
 #define IOS_CHROME_BROWSER_UI_SETTINGS_AUTOFILL_CELLS_AUTOFILL_PROFILE_ITEM_H_
 
+#include <string>
+
 #import "ios/chrome/browser/ui/table_view/cells/table_view_multi_detail_text_item.h"
 
 // Item for autofill profile (address).
diff --git a/ios/chrome/browser/ui/settings/language/add_language_table_view_controller.h b/ios/chrome/browser/ui/settings/language/add_language_table_view_controller.h
index 9525857..d9d7c0f 100644
--- a/ios/chrome/browser/ui/settings/language/add_language_table_view_controller.h
+++ b/ios/chrome/browser/ui/settings/language/add_language_table_view_controller.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_UI_SETTINGS_LANGUAGE_ADD_LANGUAGE_TABLE_VIEW_CONTROLLER_H_
 #define IOS_CHROME_BROWSER_UI_SETTINGS_LANGUAGE_ADD_LANGUAGE_TABLE_VIEW_CONTROLLER_H_
 
+#include <string>
+
 #import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h"
 
 @class AddLanguageTableViewController;
diff --git a/ios/chrome/browser/ui/settings/password/password_exporter.h b/ios/chrome/browser/ui/settings/password/password_exporter.h
index 4ad6710..0c41922 100644
--- a/ios/chrome/browser/ui/settings/password/password_exporter.h
+++ b/ios/chrome/browser/ui/settings/password/password_exporter.h
@@ -8,6 +8,7 @@
 #import <Foundation/Foundation.h>
 
 #include <memory>
+#include <string>
 #include <vector>
 
 namespace password_manager {
diff --git a/ios/chrome/browser/ui/start_surface/start_surface_recent_tab_browser_agent.mm b/ios/chrome/browser/ui/start_surface/start_surface_recent_tab_browser_agent.mm
index fb8b7b56..d16adce 100644
--- a/ios/chrome/browser/ui/start_surface/start_surface_recent_tab_browser_agent.mm
+++ b/ios/chrome/browser/ui/start_surface/start_surface_recent_tab_browser_agent.mm
@@ -54,6 +54,7 @@
 void StartSurfaceRecentTabBrowserAgent::BrowserDestroyed(Browser* browser) {
   browser_->GetWebStateList()->RemoveObserver(this);
   browser_->RemoveObserver(this);
+  favicon_driver_observer_.Reset();
 }
 
 #pragma mark - WebStateListObserver
diff --git a/ios/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui_ios.h b/ios/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui_ios.h
index b8a1654..fb485bba 100644
--- a/ios/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui_ios.h
+++ b/ios/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui_ios.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_UI_WEBUI_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_PASSWORD_MANAGER_INTERNALS_UI_IOS_H_
 #define IOS_CHROME_BROWSER_UI_WEBUI_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_PASSWORD_MANAGER_INTERNALS_UI_IOS_H_
 
+#include <string>
+
 #include "base/macros.h"
 #import "ios/web/public/webui/web_ui_ios_controller.h"
 
diff --git a/ios/chrome/browser/ui/webui/user_actions_handler.h b/ios/chrome/browser/ui/webui/user_actions_handler.h
index 314901d..d0f554d 100644
--- a/ios/chrome/browser/ui/webui/user_actions_handler.h
+++ b/ios/chrome/browser/ui/webui/user_actions_handler.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_UI_WEBUI_USER_ACTIONS_HANDLER_H_
 #define IOS_CHROME_BROWSER_UI_WEBUI_USER_ACTIONS_HANDLER_H_
 
+#include <string>
+
 #include "base/macros.h"
 #include "base/metrics/user_metrics.h"
 #include "ios/web/public/webui/web_ui_ios_message_handler.h"
diff --git a/ios/chrome/browser/web/font_size/font_size_tab_helper.h b/ios/chrome/browser/web/font_size/font_size_tab_helper.h
index ff84495..7042fe6 100644
--- a/ios/chrome/browser/web/font_size/font_size_tab_helper.h
+++ b/ios/chrome/browser/web/font_size/font_size_tab_helper.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_WEB_FONT_SIZE_FONT_SIZE_TAB_HELPER_H_
 #define IOS_CHROME_BROWSER_WEB_FONT_SIZE_FONT_SIZE_TAB_HELPER_H_
 
+#include <string>
+
 #include "base/macros.h"
 #include "ios/web/public/web_state_observer.h"
 #import "ios/web/public/web_state_user_data.h"
diff --git a/ios/chrome/browser/web/image_fetch_tab_helper.h b/ios/chrome/browser/web/image_fetch_tab_helper.h
index 0f154feb..b1fed21 100644
--- a/ios/chrome/browser/web/image_fetch_tab_helper.h
+++ b/ios/chrome/browser/web/image_fetch_tab_helper.h
@@ -5,6 +5,7 @@
 #ifndef IOS_CHROME_BROWSER_WEB_IMAGE_FETCH_TAB_HELPER_H_
 #define IOS_CHROME_BROWSER_WEB_IMAGE_FETCH_TAB_HELPER_H_
 
+#include <string>
 #include <unordered_map>
 
 #include "base/macros.h"
diff --git a/ios/chrome/test/app/histogram_test_util.h b/ios/chrome/test/app/histogram_test_util.h
index 6f00337..93317c9 100644
--- a/ios/chrome/test/app/histogram_test_util.h
+++ b/ios/chrome/test/app/histogram_test_util.h
@@ -7,6 +7,7 @@
 
 #include <map>
 #include <memory>
+#include <string>
 #include <vector>
 
 #include "base/macros.h"
diff --git a/ios/chrome/test/base/perf_test_ios.h b/ios/chrome/test/base/perf_test_ios.h
index df8e959..c100682 100644
--- a/ios/chrome/test/base/perf_test_ios.h
+++ b/ios/chrome/test/base/perf_test_ios.h
@@ -7,6 +7,8 @@
 
 #import <Foundation/Foundation.h>
 
+#include <string>
+
 #import "base/ios/block_types.h"
 #include "base/time/time.h"
 #import "ios/chrome/test/block_cleanup_test.h"
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index 95f5d9b..fb31baa9 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -627,11 +627,6 @@
 const base::Feature kMediaDrmPreprovisioningAtStartup{
     "MediaDrmPreprovisioningAtStartup", base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Prevents using SurfaceLayer for videos. This is meant to be used by embedders
-// that cannot support SurfaceLayer at the moment.
-const base::Feature kDisableSurfaceLayerForVideo{
-    "DisableSurfaceLayerForVideo", base::FEATURE_DISABLED_BY_DEFAULT};
-
 // Enable picture in picture web api for android.
 const base::Feature kPictureInPictureAPI{"PictureInPictureAPI",
                                          base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index 3e2e482..1e5c3f89 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -206,7 +206,6 @@
 MEDIA_EXPORT extern const base::Feature kMediaDrmPersistentLicense;
 MEDIA_EXPORT extern const base::Feature kMediaDrmPreprovisioning;
 MEDIA_EXPORT extern const base::Feature kMediaDrmPreprovisioningAtStartup;
-MEDIA_EXPORT extern const base::Feature kDisableSurfaceLayerForVideo;
 MEDIA_EXPORT extern const base::Feature kCanPlayHls;
 MEDIA_EXPORT extern const base::Feature kPictureInPictureAPI;
 MEDIA_EXPORT extern const base::Feature kHlsPlayer;
diff --git a/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc b/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc
index 2b319ea..767b167 100644
--- a/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc
+++ b/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc
@@ -115,6 +115,7 @@
   gpu::Mailbox CreateSharedImage(
       gfx::GpuMemoryBuffer* gpu_memory_buffer,
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
+      gfx::BufferPlane plane,
       const gfx::ColorSpace& color_space,
       GrSurfaceOrigin surface_origin,
       SkAlphaType alpha_type,
diff --git a/media/fuchsia/common/sysmem_buffer_pool.cc b/media/fuchsia/common/sysmem_buffer_pool.cc
index 4c907ebe..de58ebf 100644
--- a/media/fuchsia/common/sysmem_buffer_pool.cc
+++ b/media/fuchsia/common/sysmem_buffer_pool.cc
@@ -111,10 +111,11 @@
   }
 
   if (acquire_buffers_cb_) {
+    auto buffers = VmoBuffer::CreateBuffersFromSysmemCollection(
+        &buffer_collection_info, writable_);
+
     std::move(acquire_buffers_cb_)
-        .Run(VmoBuffer::CreateBuffersFromSysmemCollection(
-                 std::move(buffer_collection_info), writable_),
-             buffer_collection_info.settings);
+        .Run(std::move(buffers), buffer_collection_info.settings);
   }
 }
 
diff --git a/media/fuchsia/common/vmo_buffer.cc b/media/fuchsia/common/vmo_buffer.cc
index d304f70..693508d 100644
--- a/media/fuchsia/common/vmo_buffer.cc
+++ b/media/fuchsia/common/vmo_buffer.cc
@@ -39,15 +39,15 @@
 
 // static
 std::vector<VmoBuffer> VmoBuffer::CreateBuffersFromSysmemCollection(
-    fuchsia::sysmem::BufferCollectionInfo_2 info,
+    fuchsia::sysmem::BufferCollectionInfo_2* info,
     bool writable) {
   std::vector<VmoBuffer> buffers;
-  buffers.resize(info.buffer_count);
+  buffers.resize(info->buffer_count);
 
   fuchsia::sysmem::BufferMemorySettings& settings =
-      info.settings.buffer_settings;
-  for (size_t i = 0; i < info.buffer_count; ++i) {
-    fuchsia::sysmem::VmoBuffer& buffer = info.buffers[i];
+      info->settings.buffer_settings;
+  for (size_t i = 0; i < info->buffer_count; ++i) {
+    fuchsia::sysmem::VmoBuffer& buffer = info->buffers[i];
     if (!buffers[i].Initialize(std::move(buffer.vmo), writable,
                                buffer.vmo_usable_start, settings.size_bytes,
                                settings.coherency_domain)) {
diff --git a/media/fuchsia/common/vmo_buffer.h b/media/fuchsia/common/vmo_buffer.h
index 160fe39..67541c0 100644
--- a/media/fuchsia/common/vmo_buffer.h
+++ b/media/fuchsia/common/vmo_buffer.h
@@ -29,7 +29,7 @@
   // Creates a set of buffers from a sysmem collection. An empty vector is
   // returned in case of a failure.
   static std::vector<VmoBuffer> CreateBuffersFromSysmemCollection(
-      fuchsia::sysmem::BufferCollectionInfo_2 info,
+      fuchsia::sysmem::BufferCollectionInfo_2* info,
       bool writable);
 
   VmoBuffer();
diff --git a/media/gpu/h265_decoder.cc b/media/gpu/h265_decoder.cc
index 64d5106..54715468 100644
--- a/media/gpu/h265_decoder.cc
+++ b/media/gpu/h265_decoder.cc
@@ -40,7 +40,7 @@
     case HEVCPROFILE_MAIN_STILL_PICTURE:
       return bit_depth == 8u;
     default:
-      NOTREACHED();
+      DVLOG(1) << "Invalid profile specified for H265";
       return false;
   }
 }
diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
index 4dabdb1..e61b7fd 100644
--- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
+++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
@@ -254,6 +254,7 @@
     frame_rate_ = kMaxFrameRateNumerator / kMaxFrameRateDenominator;
   target_bitrate_ = config.initial_bitrate;
   bitstream_buffer_size_ = config.input_visible_size.GetArea();
+  gop_length_ = config.gop_length;
 
   if (!SetEncoderModes()) {
     DLOG(ERROR) << "Failed setting encoder parameters.";
@@ -669,6 +670,12 @@
     }
   }
 
+  if (gop_length_.has_value()) {
+    var.ulVal = gop_length_.value();
+    hr = codec_api_->SetValue(&CODECAPI_AVEncMPVGOPSize, &var);
+    RETURN_ON_HR_FAILURE(hr, "Couldn't set low keyframe interval", false);
+  }
+
   if (!is_async_mft_ ||
       (is_async_mft_ &&
        S_OK == codec_api_->IsModifiable(&CODECAPI_AVLowLatencyMode))) {
diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.h b/media/gpu/windows/media_foundation_video_encode_accelerator_win.h
index f2e7df8..3ce96cc 100644
--- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.h
+++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.h
@@ -137,6 +137,10 @@
   uint32_t frame_rate_;
   uint32_t target_bitrate_;
 
+  // Group of picture length for encoded output stream, indicates the
+  // distance between two key frames.
+  base::Optional<uint32_t> gop_length_;
+
   Microsoft::WRL::ComPtr<IMFActivate> activate_;
   Microsoft::WRL::ComPtr<IMFTransform> encoder_;
   Microsoft::WRL::ComPtr<ICodecAPI> codec_api_;
diff --git a/media/video/video_encode_accelerator_adapter.cc b/media/video/video_encode_accelerator_adapter.cc
index ba84a36e..ad210ec 100644
--- a/media/video/video_encode_accelerator_adapter.cc
+++ b/media/video/video_encode_accelerator_adapter.cc
@@ -44,7 +44,7 @@
       format, opts.frame_size, profile,
       opts.bitrate.value_or(opts.frame_size.width() * opts.frame_size.height() *
                             kVEADefaultBitratePerPixel),
-      initial_framerate);
+      initial_framerate, opts.keyframe_interval);
 
   if (opts.temporal_layers > 1) {
     VideoEncodeAccelerator::Config::SpatialLayer layer;
diff --git a/printing/BUILD.gn b/printing/BUILD.gn
index e4d5d0fe..5b7ecdf 100644
--- a/printing/BUILD.gn
+++ b/printing/BUILD.gn
@@ -32,12 +32,6 @@
   use_cups_ipp = use_cups && !(is_linux || is_chromeos_lacros)
 }
 
-# Several targets want to include this header file. We separate it out
-# here so multiple targets can depend on it.
-source_set("printing_export") {
-  sources = [ "printing_export.h" ]
-}
-
 if (use_cups_ipp && is_chromeos_ash) {
   ipp_handler_map_path = "$target_gen_dir/backend/ipp_handler_map.cc"
 
@@ -55,8 +49,7 @@
       "sandbox/print_backend_sandbox_hook_linux.h",
     ]
     deps = [
-      ":printing_export",
-      "//base:base",
+      "//base",
       "//sandbox/linux:sandbox_services",
       "//sandbox/policy",
       "//services/network:network_sandbox_hook",
@@ -111,11 +104,10 @@
 
   configs += [ "//build/config/compiler:noshadowing" ]
   cflags = []
-  defines = [ "PRINTING_IMPLEMENTATION" ]
+  defines = [ "IS_PRINTING_IMPL" ]
 
   public_deps = [ "//printing/buildflags" ]
   deps = [
-    ":printing_export",
     "//base",
     "//base:i18n",
     "//base/third_party/dynamic_annotations",
diff --git a/printing/backend/cups_connection.h b/printing/backend/cups_connection.h
index af02dcd..0f9f7830 100644
--- a/printing/backend/cups_connection.h
+++ b/printing/backend/cups_connection.h
@@ -11,18 +11,18 @@
 #include <string>
 #include <vector>
 
+#include "base/component_export.h"
 #include "base/memory/weak_ptr.h"
 #include "printing/backend/cups_deleters.h"
 #include "printing/backend/cups_jobs.h"
 #include "printing/backend/cups_printer.h"
 #include "printing/printer_status.h"
-#include "printing/printing_export.h"
 #include "url/gurl.h"
 
 namespace printing {
 
 // Represents the status of a printer queue.
-struct PRINTING_EXPORT QueueStatus {
+struct COMPONENT_EXPORT(PRINTING) QueueStatus {
   QueueStatus();
   QueueStatus(const QueueStatus& other);
   ~QueueStatus();
@@ -32,7 +32,7 @@
 };
 
 // Represents a connection to a CUPS server.
-class PRINTING_EXPORT CupsConnection {
+class COMPONENT_EXPORT(PRINTING) CupsConnection {
  public:
   virtual ~CupsConnection() = default;
 
diff --git a/printing/backend/cups_deleters.h b/printing/backend/cups_deleters.h
index 1f71d06..1d455b6d 100644
--- a/printing/backend/cups_deleters.h
+++ b/printing/backend/cups_deleters.h
@@ -8,23 +8,23 @@
 #include <cups/cups.h>
 #include <memory>
 
-#include "printing/printing_export.h"
+#include "base/component_export.h"
 
 namespace printing {
 
-struct PRINTING_EXPORT HttpDeleter {
+struct COMPONENT_EXPORT(PRINTING) HttpDeleter {
   void operator()(http_t* http) const;
 };
 
-struct PRINTING_EXPORT DestinationDeleter {
+struct COMPONENT_EXPORT(PRINTING) DestinationDeleter {
   void operator()(cups_dest_t* dest) const;
 };
 
-struct PRINTING_EXPORT DestInfoDeleter {
+struct COMPONENT_EXPORT(PRINTING) DestInfoDeleter {
   void operator()(cups_dinfo_t* info) const;
 };
 
-struct PRINTING_EXPORT OptionDeleter {
+struct COMPONENT_EXPORT(PRINTING) OptionDeleter {
   void operator()(cups_option_t* option) const;
 };
 
diff --git a/printing/backend/cups_helper.h b/printing/backend/cups_helper.h
index 5a1ee119..38f64668 100644
--- a/printing/backend/cups_helper.h
+++ b/printing/backend/cups_helper.h
@@ -7,8 +7,8 @@
 
 #include <cups/cups.h>
 
+#include "base/component_export.h"
 #include "base/strings/string_piece.h"
-#include "printing/printing_export.h"
 
 class GURL;
 
@@ -19,7 +19,7 @@
 
 // Helper wrapper around http_t structure, with connection and cleanup
 // functionality.
-class PRINTING_EXPORT HttpConnectionCUPS {
+class COMPONENT_EXPORT(PRINTING) HttpConnectionCUPS {
  public:
   HttpConnectionCUPS(const GURL& print_server_url,
                      http_encryption_t encryption,
@@ -34,11 +34,11 @@
 
 // Helper function to parse and convert PPD capabilitites to
 // semantic options.
-PRINTING_EXPORT bool ParsePpdCapabilities(
-    cups_dest_t* dest,
-    base::StringPiece locale,
-    base::StringPiece printer_capabilities,
-    PrinterSemanticCapsAndDefaults* printer_info);
+COMPONENT_EXPORT(PRINTING)
+bool ParsePpdCapabilities(cups_dest_t* dest,
+                          base::StringPiece locale,
+                          base::StringPiece printer_capabilities,
+                          PrinterSemanticCapsAndDefaults* printer_info);
 
 }  // namespace printing
 
diff --git a/printing/backend/cups_ipp_constants.h b/printing/backend/cups_ipp_constants.h
index 38d1c46a..6348f328 100644
--- a/printing/backend/cups_ipp_constants.h
+++ b/printing/backend/cups_ipp_constants.h
@@ -5,35 +5,35 @@
 #ifndef PRINTING_BACKEND_CUPS_IPP_CONSTANTS_H_
 #define PRINTING_BACKEND_CUPS_IPP_CONSTANTS_H_
 
+#include "base/component_export.h"
 #include "build/chromeos_buildflags.h"
-#include "printing/printing_export.h"
 
 namespace printing {
 
 // property names
-PRINTING_EXPORT extern const char kIppCollate[];
-PRINTING_EXPORT extern const char kIppCopies[];
-PRINTING_EXPORT extern const char kIppColor[];
-PRINTING_EXPORT extern const char kIppMedia[];
-PRINTING_EXPORT extern const char kIppDuplex[];
-PRINTING_EXPORT extern const char kIppRequestingUserName[];
-PRINTING_EXPORT extern const char kIppResolution[];
-PRINTING_EXPORT extern const char kIppPin[];
-PRINTING_EXPORT extern const char kIppPinEncryption[];
+COMPONENT_EXPORT(PRINTING) extern const char kIppCollate[];
+COMPONENT_EXPORT(PRINTING) extern const char kIppCopies[];
+COMPONENT_EXPORT(PRINTING) extern const char kIppColor[];
+COMPONENT_EXPORT(PRINTING) extern const char kIppMedia[];
+COMPONENT_EXPORT(PRINTING) extern const char kIppDuplex[];
+COMPONENT_EXPORT(PRINTING) extern const char kIppRequestingUserName[];
+COMPONENT_EXPORT(PRINTING) extern const char kIppResolution[];
+COMPONENT_EXPORT(PRINTING) extern const char kIppPin[];
+COMPONENT_EXPORT(PRINTING) extern const char kIppPinEncryption[];
 
 // collation values
-PRINTING_EXPORT extern const char kCollated[];
-PRINTING_EXPORT extern const char kUncollated[];
+COMPONENT_EXPORT(PRINTING) extern const char kCollated[];
+COMPONENT_EXPORT(PRINTING) extern const char kUncollated[];
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 
-PRINTING_EXPORT extern const char kIppDocumentAttributes[];
-PRINTING_EXPORT extern const char kIppJobAttributes[];
+COMPONENT_EXPORT(PRINTING) extern const char kIppDocumentAttributes[];
+COMPONENT_EXPORT(PRINTING) extern const char kIppJobAttributes[];
 
-PRINTING_EXPORT extern const char kPinEncryptionNone[];
+COMPONENT_EXPORT(PRINTING) extern const char kPinEncryptionNone[];
 
-PRINTING_EXPORT extern const char kOptionFalse[];
-PRINTING_EXPORT extern const char kOptionTrue[];
+COMPONENT_EXPORT(PRINTING) extern const char kOptionFalse[];
+COMPONENT_EXPORT(PRINTING) extern const char kOptionTrue[];
 
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
diff --git a/printing/backend/cups_ipp_helper.h b/printing/backend/cups_ipp_helper.h
index 4ee174cd..b6faae4 100644
--- a/printing/backend/cups_ipp_helper.h
+++ b/printing/backend/cups_ipp_helper.h
@@ -9,9 +9,9 @@
 
 #include <memory>
 
+#include "base/component_export.h"
 #include "printing/backend/cups_printer.h"
 #include "printing/backend/print_backend.h"
-#include "printing/printing_export.h"
 
 namespace printing {
 
@@ -24,12 +24,12 @@
 
 // Populates the `printer_info` object with attributes retrieved using IPP from
 // `printer`.
-PRINTING_EXPORT void CapsAndDefaultsFromPrinter(
-    const CupsOptionProvider& printer,
-    PrinterSemanticCapsAndDefaults* printer_info);
+COMPONENT_EXPORT(PRINTING)
+void CapsAndDefaultsFromPrinter(const CupsOptionProvider& printer,
+                                PrinterSemanticCapsAndDefaults* printer_info);
 
 // Wraps `ipp` in unique_ptr with appropriate deleter
-PRINTING_EXPORT ScopedIppPtr WrapIpp(ipp_t* ipp);
+COMPONENT_EXPORT(PRINTING) ScopedIppPtr WrapIpp(ipp_t* ipp);
 
 }  // namespace printing
 
diff --git a/printing/backend/cups_jobs.h b/printing/backend/cups_jobs.h
index 60b8691..f276740 100644
--- a/printing/backend/cups_jobs.h
+++ b/printing/backend/cups_jobs.h
@@ -13,9 +13,9 @@
 #include <utility>
 #include <vector>
 
+#include "base/component_export.h"
 #include "base/version.h"
 #include "printing/printer_query_result.h"
-#include "printing/printing_export.h"
 
 // This file contains a collection of functions used to query IPP printers or
 // print servers and the related code to parse these responses.  All Get*
@@ -26,7 +26,7 @@
 struct PrinterStatus;
 
 // Represents a print job sent to the queue.
-struct PRINTING_EXPORT CupsJob {
+struct COMPONENT_EXPORT(PRINTING) CupsJob {
   // Corresponds to job-state from RFC2911.
   enum JobState {
     UNKNOWN,
@@ -58,8 +58,7 @@
   int processing_started = 0;
 };
 
-
-struct PRINTING_EXPORT PrinterInfo {
+struct COMPONENT_EXPORT(PRINTING) PrinterInfo {
   PrinterInfo();
   PrinterInfo(const PrinterInfo& info);
 
@@ -88,7 +87,8 @@
 
 // Returns the uri for printer with `id` as served by CUPS. Assumes that `id` is
 // a valid CUPS printer name and performs no error checking or escaping.
-std::string PRINTING_EXPORT PrinterUriFromName(const std::string& id);
+std::string COMPONENT_EXPORT(PRINTING)
+    PrinterUriFromName(const std::string& id);
 
 // Extracts structured job information from the `response` for `printer_id`.
 // Extracted jobs are added to `jobs`.
@@ -102,13 +102,13 @@
 // Queries the printer at `address` on `port` with a Get-Printer-Attributes
 // request to populate `printer_info`. If `encrypted` is true, request is made
 // using ipps, otherwise, ipp is used. Returns false if the request failed.
-PrinterQueryResult PRINTING_EXPORT
-GetPrinterInfo(const std::string& address,
-               int port,
-               const std::string& resource,
-               bool encrypted,
-               PrinterInfo* printer_info,
-               PrinterStatus* printer_status);
+PrinterQueryResult COMPONENT_EXPORT(PRINTING)
+    GetPrinterInfo(const std::string& address,
+                   int port,
+                   const std::string& resource,
+                   bool encrypted,
+                   PrinterInfo* printer_info,
+                   PrinterStatus* printer_status);
 
 // Attempts to retrieve printer status using connection `http` for `printer_id`.
 // Returns true if succcssful and updates the fields in `printer_status` as
diff --git a/printing/backend/cups_printer.h b/printing/backend/cups_printer.h
index 15e6e217..e4dc672 100644
--- a/printing/backend/cups_printer.h
+++ b/printing/backend/cups_printer.h
@@ -11,8 +11,8 @@
 #include <string>
 #include <vector>
 
+#include "base/component_export.h"
 #include "printing/backend/cups_deleters.h"
-#include "printing/printing_export.h"
 #include "url/gurl.h"
 
 namespace printing {
@@ -20,7 +20,7 @@
 struct PrinterBasicInfo;
 
 // Provides information regarding cups options.
-class PRINTING_EXPORT CupsOptionProvider {
+class COMPONENT_EXPORT(PRINTING) CupsOptionProvider {
  public:
   virtual ~CupsOptionProvider() = default;
 
@@ -48,7 +48,7 @@
 // Retrieves information from CUPS printer objects as requested.  This class
 // is only valid as long as the CupsConnection which created it exists as they
 // share an http connection which the CupsConnection closes on destruction.
-class PRINTING_EXPORT CupsPrinter : public CupsOptionProvider {
+class COMPONENT_EXPORT(PRINTING) CupsPrinter : public CupsOptionProvider {
  public:
   // Represents the margins that CUPS reports for some given media.
   // Its members are valued in PWG units (100ths of mm).
diff --git a/printing/backend/print_backend.h b/printing/backend/print_backend.h
index 57fae55..092853c 100644
--- a/printing/backend/print_backend.h
+++ b/printing/backend/print_backend.h
@@ -11,12 +11,12 @@
 #include <string>
 #include <vector>
 
+#include "base/component_export.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/scoped_refptr.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "printing/mojom/print.mojom.h"
-#include "printing/printing_export.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace base {
@@ -28,7 +28,7 @@
 
 using PrinterBasicInfoOptions = std::map<std::string, std::string>;
 
-struct PRINTING_EXPORT PrinterBasicInfo {
+struct COMPONENT_EXPORT(PRINTING) PrinterBasicInfo {
   PrinterBasicInfo();
   PrinterBasicInfo(const std::string& printer_name,
                    const std::string& display_name,
@@ -58,7 +58,7 @@
 
 #if defined(OS_CHROMEOS)
 
-struct PRINTING_EXPORT AdvancedCapabilityValue {
+struct COMPONENT_EXPORT(PRINTING) AdvancedCapabilityValue {
   AdvancedCapabilityValue();
   AdvancedCapabilityValue(const std::string& name,
                           const std::string& display_name);
@@ -74,7 +74,7 @@
   std::string display_name;
 };
 
-struct PRINTING_EXPORT AdvancedCapability {
+struct COMPONENT_EXPORT(PRINTING) AdvancedCapability {
   enum class Type : uint8_t { kBoolean, kFloat, kInteger, kString };
 
   AdvancedCapability();
@@ -109,7 +109,7 @@
 
 #endif  // defined(OS_CHROMEOS)
 
-struct PRINTING_EXPORT PrinterSemanticCapsAndDefaults {
+struct COMPONENT_EXPORT(PRINTING) PrinterSemanticCapsAndDefaults {
   PrinterSemanticCapsAndDefaults();
   PrinterSemanticCapsAndDefaults(const PrinterSemanticCapsAndDefaults& other);
   ~PrinterSemanticCapsAndDefaults();
@@ -130,7 +130,7 @@
   mojom::ColorModel color_model = mojom::ColorModel::kUnknownColorModel;
   mojom::ColorModel bw_model = mojom::ColorModel::kUnknownColorModel;
 
-  struct PRINTING_EXPORT Paper {
+  struct COMPONENT_EXPORT(PRINTING) Paper {
     std::string display_name;
     std::string vendor_id;
     gfx::Size size_um;
@@ -151,7 +151,7 @@
 #endif  // defined(OS_CHROMEOS)
 };
 
-struct PRINTING_EXPORT PrinterCapsAndDefaults {
+struct COMPONENT_EXPORT(PRINTING) PrinterCapsAndDefaults {
   PrinterCapsAndDefaults();
   PrinterCapsAndDefaults(const PrinterCapsAndDefaults& other);
   ~PrinterCapsAndDefaults();
@@ -169,7 +169,7 @@
 // print system specific. For example, CUPS is available on both Linux and Mac,
 // but not available on ChromeOS, etc. This design allows us to add more
 // functionality on some platforms, while reusing core (CUPS) functions.
-class PRINTING_EXPORT PrintBackend
+class COMPONENT_EXPORT(PRINTING) PrintBackend
     : public base::RefCountedThreadSafe<PrintBackend> {
  public:
   // Enumerates the list of installed local and network printers.
diff --git a/printing/backend/print_backend_consts.h b/printing/backend/print_backend_consts.h
index 55232b3..600c7d73 100644
--- a/printing/backend/print_backend_consts.h
+++ b/printing/backend/print_backend_consts.h
@@ -5,24 +5,24 @@
 #ifndef PRINTING_BACKEND_PRINT_BACKEND_CONSTS_H_
 #define PRINTING_BACKEND_PRINT_BACKEND_CONSTS_H_
 
-#include "printing/printing_export.h"
+#include "base/component_export.h"
 
-PRINTING_EXPORT extern const char kCUPSBlocking[];
-PRINTING_EXPORT extern const char kCUPSEncryption[];
-PRINTING_EXPORT extern const char kCUPSEnterprisePrinter[];
-PRINTING_EXPORT extern const char kCUPSPrintServerURL[];
-PRINTING_EXPORT extern const char kDriverInfoTagName[];
-PRINTING_EXPORT extern const char kDriverNameTagName[];
-PRINTING_EXPORT extern const char kLocationTagName[];
-PRINTING_EXPORT extern const char kValueFalse[];
-PRINTING_EXPORT extern const char kValueTrue[];
+COMPONENT_EXPORT(PRINTING) extern const char kCUPSBlocking[];
+COMPONENT_EXPORT(PRINTING) extern const char kCUPSEncryption[];
+COMPONENT_EXPORT(PRINTING) extern const char kCUPSEnterprisePrinter[];
+COMPONENT_EXPORT(PRINTING) extern const char kCUPSPrintServerURL[];
+COMPONENT_EXPORT(PRINTING) extern const char kDriverInfoTagName[];
+COMPONENT_EXPORT(PRINTING) extern const char kDriverNameTagName[];
+COMPONENT_EXPORT(PRINTING) extern const char kLocationTagName[];
+COMPONENT_EXPORT(PRINTING) extern const char kValueFalse[];
+COMPONENT_EXPORT(PRINTING) extern const char kValueTrue[];
 
 // CUPS destination option names.
-PRINTING_EXPORT extern const char kCUPSOptDeviceUri[];
-PRINTING_EXPORT extern const char kCUPSOptPrinterInfo[];
-PRINTING_EXPORT extern const char kCUPSOptPrinterLocation[];
-PRINTING_EXPORT extern const char kCUPSOptPrinterMakeAndModel[];
-PRINTING_EXPORT extern const char kCUPSOptPrinterState[];
-PRINTING_EXPORT extern const char kCUPSOptPrinterType[];
+COMPONENT_EXPORT(PRINTING) extern const char kCUPSOptDeviceUri[];
+COMPONENT_EXPORT(PRINTING) extern const char kCUPSOptPrinterInfo[];
+COMPONENT_EXPORT(PRINTING) extern const char kCUPSOptPrinterLocation[];
+COMPONENT_EXPORT(PRINTING) extern const char kCUPSOptPrinterMakeAndModel[];
+COMPONENT_EXPORT(PRINTING) extern const char kCUPSOptPrinterState[];
+COMPONENT_EXPORT(PRINTING) extern const char kCUPSOptPrinterType[];
 
 #endif  // PRINTING_BACKEND_PRINT_BACKEND_CONSTS_H_
diff --git a/printing/backend/print_backend_cups.h b/printing/backend/print_backend_cups.h
index 2a07f2bd..0623192 100644
--- a/printing/backend/print_backend_cups.h
+++ b/printing/backend/print_backend_cups.h
@@ -10,9 +10,9 @@
 #include <memory>
 #include <string>
 
+#include "base/component_export.h"
 #include "base/files/file_path.h"
 #include "printing/backend/print_backend.h"
-#include "printing/printing_export.h"
 #include "url/gurl.h"
 
 namespace printing {
@@ -25,11 +25,11 @@
                    const std::string& locale);
 
   // These static functions are exposed here for use in the tests.
-  PRINTING_EXPORT static bool PrinterBasicInfoFromCUPS(
-      const cups_dest_t& printer,
-      PrinterBasicInfo* printer_info);
-  PRINTING_EXPORT static std::string PrinterDriverInfoFromCUPS(
-      const cups_dest_t& printer);
+  COMPONENT_EXPORT(PRINTING)
+  static bool PrinterBasicInfoFromCUPS(const cups_dest_t& printer,
+                                       PrinterBasicInfo* printer_info);
+  COMPONENT_EXPORT(PRINTING)
+  static std::string PrinterDriverInfoFromCUPS(const cups_dest_t& printer);
 
  private:
   struct DestinationDeleter {
diff --git a/printing/backend/print_backend_utils.h b/printing/backend/print_backend_utils.h
index 59d0145..d2c661e 100644
--- a/printing/backend/print_backend_utils.h
+++ b/printing/backend/print_backend_utils.h
@@ -5,14 +5,14 @@
 #ifndef PRINTING_BACKEND_PRINT_BACKEND_UTILS_H_
 #define PRINTING_BACKEND_PRINT_BACKEND_UTILS_H_
 
+#include "base/component_export.h"
 #include "base/strings/string_piece.h"
 #include "printing/backend/print_backend.h"
-#include "printing/printing_export.h"
 
 namespace printing {
 
-PRINTING_EXPORT PrinterSemanticCapsAndDefaults::Paper ParsePaper(
-    base::StringPiece value);
+COMPONENT_EXPORT(PRINTING)
+PrinterSemanticCapsAndDefaults::Paper ParsePaper(base::StringPiece value);
 
 }  // namespace printing
 
diff --git a/printing/backend/printing_info_win.h b/printing/backend/printing_info_win.h
index 0fd1160..2ee907e 100644
--- a/printing/backend/printing_info_win.h
+++ b/printing/backend/printing_info_win.h
@@ -11,14 +11,14 @@
 
 #include <memory>
 
-#include "printing/printing_export.h"
+#include "base/component_export.h"
 
 namespace printing {
 
 namespace internal {
 
-PRINTING_EXPORT uint8_t* GetDriverInfo(HANDLE printer, int level);
-PRINTING_EXPORT uint8_t* GetPrinterInfo(HANDLE printer, int level);
+COMPONENT_EXPORT(PRINTING) uint8_t* GetDriverInfo(HANDLE printer, int level);
+COMPONENT_EXPORT(PRINTING) uint8_t* GetPrinterInfo(HANDLE printer, int level);
 
 // This class is designed to work with PRINTER_INFO_X structures
 // and calls GetPrinter internally with correctly allocated buffer.
diff --git a/printing/backend/printing_restrictions.h b/printing/backend/printing_restrictions.h
index b35d647..149ecfb 100644
--- a/printing/backend/printing_restrictions.h
+++ b/printing/backend/printing_restrictions.h
@@ -5,8 +5,8 @@
 #ifndef PRINTING_BACKEND_PRINTING_RESTRICTIONS_H_
 #define PRINTING_BACKEND_PRINTING_RESTRICTIONS_H_
 
+#include "base/component_export.h"
 #include "build/chromeos_buildflags.h"
-#include "printing/printing_export.h"
 
 namespace printing {
 
@@ -40,12 +40,12 @@
 // Dictionary key for printing policies.
 // Must coincide with the name of field in `print_preview.Policies` in
 // chrome/browser/resources/print_preview/data/destination.js
-PRINTING_EXPORT extern const char kAllowedColorModes[];
-PRINTING_EXPORT extern const char kAllowedDuplexModes[];
-PRINTING_EXPORT extern const char kAllowedPinModes[];
-PRINTING_EXPORT extern const char kDefaultColorMode[];
-PRINTING_EXPORT extern const char kDefaultDuplexMode[];
-PRINTING_EXPORT extern const char kDefaultPinMode[];
+COMPONENT_EXPORT(PRINTING) extern const char kAllowedColorModes[];
+COMPONENT_EXPORT(PRINTING) extern const char kAllowedDuplexModes[];
+COMPONENT_EXPORT(PRINTING) extern const char kAllowedPinModes[];
+COMPONENT_EXPORT(PRINTING) extern const char kDefaultColorMode[];
+COMPONENT_EXPORT(PRINTING) extern const char kDefaultDuplexMode[];
+COMPONENT_EXPORT(PRINTING) extern const char kDefaultPinMode[];
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 // Allowed background graphics modes.
@@ -57,11 +57,11 @@
 };
 
 // Dictionary keys to be used with `kPrintingPaperSizeDefault` policy.
-PRINTING_EXPORT extern const char kPaperSizeName[];
-PRINTING_EXPORT extern const char kPaperSizeNameCustomOption[];
-PRINTING_EXPORT extern const char kPaperSizeCustomSize[];
-PRINTING_EXPORT extern const char kPaperSizeWidth[];
-PRINTING_EXPORT extern const char kPaperSizeHeight[];
+COMPONENT_EXPORT(PRINTING) extern const char kPaperSizeName[];
+COMPONENT_EXPORT(PRINTING) extern const char kPaperSizeNameCustomOption[];
+COMPONENT_EXPORT(PRINTING) extern const char kPaperSizeCustomSize[];
+COMPONENT_EXPORT(PRINTING) extern const char kPaperSizeWidth[];
+COMPONENT_EXPORT(PRINTING) extern const char kPaperSizeHeight[];
 
 }  // namespace printing
 
diff --git a/printing/backend/win_helper.h b/printing/backend/win_helper.h
index 1fe6eaa2..4b38b627 100644
--- a/printing/backend/win_helper.h
+++ b/printing/backend/win_helper.h
@@ -19,16 +19,16 @@
 #include <memory>
 #include <string>
 
+#include "base/component_export.h"
 #include "base/memory/free_deleter.h"
 #include "base/win/scoped_handle.h"
-#include "printing/printing_export.h"
 
 // These are helper functions for dealing with Windows Printing.
 namespace printing {
 
-struct PRINTING_EXPORT PrinterBasicInfo;
+struct COMPONENT_EXPORT(PRINTING) PrinterBasicInfo;
 
-class PRINTING_EXPORT PrinterHandleTraits {
+class COMPONENT_EXPORT(PRINTING) PrinterHandleTraits {
  public:
   PrinterHandleTraits() = delete;
   PrinterHandleTraits(const PrinterHandleTraits&) = delete;
@@ -43,14 +43,14 @@
   static HANDLE NullHandle() { return nullptr; }
 };
 
-class PRINTING_EXPORT ScopedPrinterHandle
+class COMPONENT_EXPORT(PRINTING) ScopedPrinterHandle
     : public base::win::GenericScopedHandle<PrinterHandleTraits,
                                             base::win::DummyVerifierTraits> {
  public:
   bool OpenPrinterWithName(const wchar_t* printer);
 };
 
-class PRINTING_EXPORT PrinterChangeHandleTraits {
+class COMPONENT_EXPORT(PRINTING) PrinterChangeHandleTraits {
  public:
   PrinterChangeHandleTraits() = delete;
   PrinterChangeHandleTraits(const PrinterChangeHandleTraits&) = delete;
@@ -75,7 +75,7 @@
 // this would mean having to add that to every binary that links with
 // printing.lib (which is a LOT of binaries). So choosing the GetProcAddress
 // route instead).
-class PRINTING_EXPORT XPSModule {
+class COMPONENT_EXPORT(PRINTING) XPSModule {
  public:
   // All the other methods can ONLY be called after a successful call to Init.
   // Init can be called many times and by multiple threads.
@@ -115,7 +115,7 @@
 };
 
 // See comments in cc file explaining why we need this.
-class PRINTING_EXPORT ScopedXPSInitializer {
+class COMPONENT_EXPORT(PRINTING) ScopedXPSInitializer {
  public:
   ScopedXPSInitializer();
   ScopedXPSInitializer(const ScopedXPSInitializer&) = delete;
@@ -131,7 +131,7 @@
 // Wrapper class to wrap the XPS Print APIs (these are different from the PTxxx
 // which deal with the XML Print Schema). This is needed because these
 // APIs are only available on Windows 7 and higher.
-class PRINTING_EXPORT XPSPrintModule {
+class COMPONENT_EXPORT(PRINTING) XPSPrintModule {
  public:
   // All the other methods can ONLY be called after a successful call to Init.
   // Init can be called many times and by multiple threads.
@@ -153,34 +153,38 @@
 };
 
 // Sets the function that gets friendly names for network printers.
-PRINTING_EXPORT void SetGetDisplayNameFunction(
+COMPONENT_EXPORT(PRINTING)
+void SetGetDisplayNameFunction(
     std::string (*get_display_name_func)(const std::string& printer_name));
 
-PRINTING_EXPORT bool InitBasicPrinterInfo(HANDLE printer,
-                                          PrinterBasicInfo* printer_info);
+COMPONENT_EXPORT(PRINTING)
+bool InitBasicPrinterInfo(HANDLE printer, PrinterBasicInfo* printer_info);
 
-PRINTING_EXPORT std::string GetDriverInfo(HANDLE printer);
+COMPONENT_EXPORT(PRINTING) std::string GetDriverInfo(HANDLE printer);
 
-PRINTING_EXPORT std::unique_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode(
+COMPONENT_EXPORT(PRINTING)
+std::unique_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode(
     const std::wstring& printer_name,
     const std::string& print_ticket);
 
-PRINTING_EXPORT bool IsDevModeWithColor(const DEVMODE* devmode);
+COMPONENT_EXPORT(PRINTING) bool IsDevModeWithColor(const DEVMODE* devmode);
 
 // Creates default DEVMODE and sets color option. Some devices need special
 // workaround for color.
-PRINTING_EXPORT std::unique_ptr<DEVMODE, base::FreeDeleter>
-CreateDevModeWithColor(HANDLE printer,
-                       const std::wstring& printer_name,
-                       bool color);
+COMPONENT_EXPORT(PRINTING)
+std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor(
+    HANDLE printer,
+    const std::wstring& printer_name,
+    bool color);
 
 // Creates new DEVMODE. If `in` is not NULL copy settings from there.
-PRINTING_EXPORT std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(
-    HANDLE printer,
-    DEVMODE* in);
+COMPONENT_EXPORT(PRINTING)
+std::unique_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(HANDLE printer,
+                                                          DEVMODE* in);
 
 // Prompts for new DEVMODE. If `in` is not NULL copy settings from there.
-PRINTING_EXPORT std::unique_ptr<DEVMODE, base::FreeDeleter> PromptDevMode(
+COMPONENT_EXPORT(PRINTING)
+std::unique_ptr<DEVMODE, base::FreeDeleter> PromptDevMode(
     HANDLE printer,
     const std::wstring& printer_name,
     DEVMODE* in,
diff --git a/printing/emf_win.h b/printing/emf_win.h
index 7688d6a..b7c77314 100644
--- a/printing/emf_win.h
+++ b/printing/emf_win.h
@@ -28,7 +28,7 @@
 namespace printing {
 
 // Simple wrapper class that manage an EMF data stream and its virtual HDC.
-class PRINTING_EXPORT Emf : public Metafile {
+class COMPONENT_EXPORT(PRINTING) Emf : public Metafile {
  public:
   class Record;
   class Enumerator;
@@ -110,7 +110,7 @@
 
 // One EMF record. It keeps pointers to the EMF buffer held by Emf::emf_.
 // The entries become invalid once Emf::CloseEmf() is called.
-class PRINTING_EXPORT Emf::Record {
+class COMPONENT_EXPORT(PRINTING) Emf::Record {
  public:
   // Plays the record.
   bool Play(EnumerationContext* context) const;
@@ -134,7 +134,7 @@
 // Retrieves individual records out of a Emf buffer. The main use is to skip
 // over records that are unsupported on a specific printer or to play back
 // only a part of an EMF buffer.
-class PRINTING_EXPORT Emf::Enumerator {
+class COMPONENT_EXPORT(PRINTING) Emf::Enumerator {
  public:
   // Iterator type used for iterating the records.
   typedef std::vector<Record>::const_iterator const_iterator;
@@ -169,7 +169,6 @@
   std::vector<Record> items_;
 
   EnumerationContext context_;
-
 };
 
 }  // namespace printing
diff --git a/printing/metafile.h b/printing/metafile.h
index 58f74bb..ba38232c 100644
--- a/printing/metafile.h
+++ b/printing/metafile.h
@@ -9,11 +9,11 @@
 
 #include <vector>
 
+#include "base/component_export.h"
 #include "base/containers/span.h"
 #include "build/build_config.h"
 #include "printing/mojom/print.mojom-forward.h"
 #include "printing/native_drawing_context.h"
-#include "printing/printing_export.h"
 
 #if defined(OS_WIN)
 #include <windows.h>
@@ -35,7 +35,7 @@
 namespace printing {
 
 // This class plays metafiles from data stream (usually PDF or EMF).
-class PRINTING_EXPORT MetafilePlayer {
+class COMPONENT_EXPORT(PRINTING) MetafilePlayer {
  public:
   MetafilePlayer();
   MetafilePlayer(const MetafilePlayer&) = delete;
@@ -81,7 +81,7 @@
 
 // This class creates a graphics context that renders into a data stream
 // (usually PDF or EMF).
-class PRINTING_EXPORT Metafile : public MetafilePlayer {
+class COMPONENT_EXPORT(PRINTING) Metafile : public MetafilePlayer {
  public:
   Metafile();
   Metafile(const Metafile&) = delete;
diff --git a/printing/metafile_skia.h b/printing/metafile_skia.h
index 945a8b7..157dade9 100644
--- a/printing/metafile_skia.h
+++ b/printing/metafile_skia.h
@@ -31,7 +31,7 @@
 struct MetafileSkiaData;
 
 // This class uses Skia graphics library to generate a PDF or MSKP document.
-class PRINTING_EXPORT MetafileSkia : public Metafile {
+class COMPONENT_EXPORT(PRINTING) MetafileSkia : public Metafile {
  public:
   // Default constructor, for mojom::SkiaDocumentType::kPDF type only.
   // TODO(weili): we should split up this use case into a different class, see
diff --git a/printing/nup_parameters.h b/printing/nup_parameters.h
index 00df338..bbc6444 100644
--- a/printing/nup_parameters.h
+++ b/printing/nup_parameters.h
@@ -5,11 +5,11 @@
 #ifndef PRINTING_NUP_PARAMETERS_H_
 #define PRINTING_NUP_PARAMETERS_H_
 
-#include "printing/printing_export.h"
+#include "base/component_export.h"
 
 namespace printing {
 
-class PRINTING_EXPORT NupParameters {
+class COMPONENT_EXPORT(PRINTING) NupParameters {
  public:
   NupParameters();
 
diff --git a/printing/page_number.h b/printing/page_number.h
index 4f363a2..48372a1 100644
--- a/printing/page_number.h
+++ b/printing/page_number.h
@@ -15,7 +15,7 @@
 
 // Represents a page series following the array of page ranges defined in a
 // PrintSettings.
-class PRINTING_EXPORT PageNumber {
+class COMPONENT_EXPORT(PRINTING) PageNumber {
  public:
   // Initializes the page to the first page in the settings's range or 0.
   PageNumber(const PrintSettings& settings, uint32_t document_page_count);
diff --git a/printing/page_range.h b/printing/page_range.h
index 20e84fa..5cdb31a 100644
--- a/printing/page_range.h
+++ b/printing/page_range.h
@@ -9,7 +9,7 @@
 
 #include <vector>
 
-#include "printing/printing_export.h"
+#include "base/component_export.h"
 
 namespace printing {
 
@@ -18,7 +18,7 @@
 using PageRanges = std::vector<PageRange>;
 
 // Print range is inclusive. To select one page, set from == to.
-struct PRINTING_EXPORT PageRange {
+struct COMPONENT_EXPORT(PRINTING) PageRange {
   uint32_t from;
   uint32_t to;
 
diff --git a/printing/page_setup.h b/printing/page_setup.h
index b9d02ca..76bcb4dd 100644
--- a/printing/page_setup.h
+++ b/printing/page_setup.h
@@ -5,13 +5,13 @@
 #ifndef PRINTING_PAGE_SETUP_H_
 #define PRINTING_PAGE_SETUP_H_
 
-#include "printing/printing_export.h"
+#include "base/component_export.h"
 #include "ui/gfx/geometry/rect.h"
 
 namespace printing {
 
 // Margins for a page setup.
-class PRINTING_EXPORT PageMargins {
+class COMPONENT_EXPORT(PRINTING) PageMargins {
  public:
   PageMargins();
 
@@ -33,7 +33,7 @@
 
 // Settings that define the size and printable areas of a page. Unit is
 // unspecified.
-class PRINTING_EXPORT PageSetup {
+class COMPONENT_EXPORT(PRINTING) PageSetup {
  public:
   PageSetup();
   PageSetup(const PageSetup& other);
diff --git a/printing/pdf_metafile_cg_mac.h b/printing/pdf_metafile_cg_mac.h
index cfe26e3..8b5c2d8 100644
--- a/printing/pdf_metafile_cg_mac.h
+++ b/printing/pdf_metafile_cg_mac.h
@@ -15,7 +15,7 @@
 namespace printing {
 
 // This class creates a graphics context that renders into a PDF data stream.
-class PRINTING_EXPORT PdfMetafileCg : public Metafile {
+class COMPONENT_EXPORT(PRINTING) PdfMetafileCg : public Metafile {
  public:
   PdfMetafileCg();
   PdfMetafileCg(const PdfMetafileCg&) = delete;
diff --git a/printing/print_job_constants.h b/printing/print_job_constants.h
index 03d7f70..5950ba0 100644
--- a/printing/print_job_constants.h
+++ b/printing/print_job_constants.h
@@ -7,109 +7,109 @@
 
 #include <stdint.h>
 
-#include "printing/printing_export.h"
+#include "base/component_export.h"
 
 namespace printing {
 
-PRINTING_EXPORT extern const char kIsFirstRequest[];
-PRINTING_EXPORT extern const char kPreviewRequestID[];
-PRINTING_EXPORT extern const char kPreviewUIID[];
-PRINTING_EXPORT extern const char kSettingCapabilities[];
-PRINTING_EXPORT extern const char kSettingCloudPrintId[];
-PRINTING_EXPORT extern const char kSettingCollate[];
-PRINTING_EXPORT extern const char kSettingColor[];
-PRINTING_EXPORT extern const char kSettingSetColorAsDefault[];
-PRINTING_EXPORT extern const char kSettingContentHeight[];
-PRINTING_EXPORT extern const char kSettingContentWidth[];
-PRINTING_EXPORT extern const char kSettingCopies[];
-PRINTING_EXPORT extern const char kSettingDeviceName[];
-PRINTING_EXPORT extern const char kSettingDisableScaling[];
-PRINTING_EXPORT extern const char kSettingDpiDefault[];
-PRINTING_EXPORT extern const char kSettingDpiHorizontal[];
-PRINTING_EXPORT extern const char kSettingDpiVertical[];
-PRINTING_EXPORT extern const char kSettingDuplexMode[];
-PRINTING_EXPORT extern const char kSettingFitToPageScaling[];
-PRINTING_EXPORT extern const char kSettingHeaderFooterEnabled[];
-PRINTING_EXPORT extern const float kSettingHeaderFooterInterstice;
-PRINTING_EXPORT extern const char kSettingHeaderFooterDate[];
-PRINTING_EXPORT extern const char kSettingHeaderFooterTitle[];
-PRINTING_EXPORT extern const char kSettingHeaderFooterURL[];
-PRINTING_EXPORT extern const char kSettingLandscape[];
-PRINTING_EXPORT extern const char kSettingMediaSize[];
-PRINTING_EXPORT extern const char kSettingMediaSizeHeightMicrons[];
-PRINTING_EXPORT extern const char kSettingMediaSizeWidthMicrons[];
-PRINTING_EXPORT extern const char kSettingMediaSizeVendorId[];
-PRINTING_EXPORT extern const char kSettingMediaSizeIsDefault[];
-PRINTING_EXPORT extern const char kSettingMarginBottom[];
-PRINTING_EXPORT extern const char kSettingMarginLeft[];
-PRINTING_EXPORT extern const char kSettingMarginRight[];
-PRINTING_EXPORT extern const char kSettingMarginTop[];
-PRINTING_EXPORT extern const char kSettingMarginsCustom[];
-PRINTING_EXPORT extern const char kSettingMarginsType[];
-PRINTING_EXPORT extern const char kSettingPreviewPageCount[];
-PRINTING_EXPORT extern const char kSettingPageRange[];
-PRINTING_EXPORT extern const char kSettingPageRangeFrom[];
-PRINTING_EXPORT extern const char kSettingPageRangeTo[];
-PRINTING_EXPORT extern const char kSettingPageWidth[];
-PRINTING_EXPORT extern const char kSettingPageHeight[];
-PRINTING_EXPORT extern const char kSettingPagesPerSheet[];
-PRINTING_EXPORT extern const char kSettingPinValue[];
-PRINTING_EXPORT extern const char kSettingPolicies[];
-PRINTING_EXPORT extern const char kSettingPreviewIsFromArc[];
-PRINTING_EXPORT extern const char kSettingPreviewIsPdf[];
-PRINTING_EXPORT extern const char kSettingPreviewModifiable[];
-PRINTING_EXPORT extern const char kSettingPrintToGoogleDrive[];
-PRINTING_EXPORT extern const char kSettingPrintableAreaHeight[];
-PRINTING_EXPORT extern const char kSettingPrintableAreaWidth[];
-PRINTING_EXPORT extern const char kSettingPrintableAreaX[];
-PRINTING_EXPORT extern const char kSettingPrintableAreaY[];
-PRINTING_EXPORT extern const char kSettingPrinterDescription[];
-PRINTING_EXPORT extern const char kSettingPrinterName[];
-PRINTING_EXPORT extern const char kSettingPrinterOptions[];
-PRINTING_EXPORT extern const char kSettingPrinterType[];
-PRINTING_EXPORT extern const char kSettingRasterizePdf[];
-PRINTING_EXPORT extern const char kSettingScaleFactor[];
-PRINTING_EXPORT extern const char kSettingScalingType[];
-PRINTING_EXPORT extern const char kSettingTicket[];
-PRINTING_EXPORT extern const char kSettingSendUserInfo[];
-PRINTING_EXPORT extern const char kSettingShouldPrintBackgrounds[];
-PRINTING_EXPORT extern const char kSettingShouldPrintSelectionOnly[];
-PRINTING_EXPORT extern const char kSettingShowSystemDialog[];
-PRINTING_EXPORT extern const char kSettingUsername[];
-PRINTING_EXPORT extern const char kSettingAdvancedSettings[];
+COMPONENT_EXPORT(PRINTING) extern const char kIsFirstRequest[];
+COMPONENT_EXPORT(PRINTING) extern const char kPreviewRequestID[];
+COMPONENT_EXPORT(PRINTING) extern const char kPreviewUIID[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingCapabilities[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingCloudPrintId[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingCollate[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingColor[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingSetColorAsDefault[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingContentHeight[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingContentWidth[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingCopies[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingDeviceName[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingDisableScaling[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingDpiDefault[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingDpiHorizontal[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingDpiVertical[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingDuplexMode[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingFitToPageScaling[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingHeaderFooterEnabled[];
+COMPONENT_EXPORT(PRINTING) extern const float kSettingHeaderFooterInterstice;
+COMPONENT_EXPORT(PRINTING) extern const char kSettingHeaderFooterDate[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingHeaderFooterTitle[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingHeaderFooterURL[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingLandscape[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingMediaSize[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingMediaSizeHeightMicrons[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingMediaSizeWidthMicrons[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingMediaSizeVendorId[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingMediaSizeIsDefault[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingMarginBottom[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingMarginLeft[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingMarginRight[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingMarginTop[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingMarginsCustom[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingMarginsType[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPreviewPageCount[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPageRange[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPageRangeFrom[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPageRangeTo[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPageWidth[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPageHeight[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPagesPerSheet[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPinValue[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPolicies[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPreviewIsFromArc[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPreviewIsPdf[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPreviewModifiable[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPrintToGoogleDrive[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPrintableAreaHeight[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPrintableAreaWidth[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPrintableAreaX[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPrintableAreaY[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPrinterDescription[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPrinterName[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPrinterOptions[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingPrinterType[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingRasterizePdf[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingScaleFactor[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingScalingType[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingTicket[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingSendUserInfo[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingShouldPrintBackgrounds[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingShouldPrintSelectionOnly[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingShowSystemDialog[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingUsername[];
+COMPONENT_EXPORT(PRINTING) extern const char kSettingAdvancedSettings[];
 
-PRINTING_EXPORT extern const int FIRST_PAGE_INDEX;
-PRINTING_EXPORT extern const int COMPLETE_PREVIEW_DOCUMENT_INDEX;
-PRINTING_EXPORT extern const char kSettingOpenPDFInPreview[];
+COMPONENT_EXPORT(PRINTING) extern const int FIRST_PAGE_INDEX;
+COMPONENT_EXPORT(PRINTING) extern const int COMPLETE_PREVIEW_DOCUMENT_INDEX;
+COMPONENT_EXPORT(PRINTING) extern const char kSettingOpenPDFInPreview[];
 
-PRINTING_EXPORT extern const uint32_t kInvalidPageIndex;
-PRINTING_EXPORT extern const uint32_t kMaxPageCount;
+COMPONENT_EXPORT(PRINTING) extern const uint32_t kInvalidPageIndex;
+COMPONENT_EXPORT(PRINTING) extern const uint32_t kMaxPageCount;
 
 #if defined(USE_CUPS)
 // Printer color models
-PRINTING_EXPORT extern const char kBlack[];
-PRINTING_EXPORT extern const char kCMYK[];
-PRINTING_EXPORT extern const char kKCMY[];
-PRINTING_EXPORT extern const char kCMY_K[];
-PRINTING_EXPORT extern const char kCMY[];
-PRINTING_EXPORT extern const char kColor[];
-PRINTING_EXPORT extern const char kEpsonColor[];
-PRINTING_EXPORT extern const char kEpsonMono[];
-PRINTING_EXPORT extern const char kFullColor[];
-PRINTING_EXPORT extern const char kGray[];
-PRINTING_EXPORT extern const char kGrayscale[];
-PRINTING_EXPORT extern const char kGreyscale[];
-PRINTING_EXPORT extern const char kMono[];
-PRINTING_EXPORT extern const char kMonochrome[];
-PRINTING_EXPORT extern const char kNormal[];
-PRINTING_EXPORT extern const char kNormalGray[];
-PRINTING_EXPORT extern const char kRGB[];
-PRINTING_EXPORT extern const char kRGBA[];
-PRINTING_EXPORT extern const char kRGB16[];
-PRINTING_EXPORT extern const char kSharpCMColor[];
-PRINTING_EXPORT extern const char kSharpCMBW[];
-PRINTING_EXPORT extern const char kXeroxAutomatic[];
-PRINTING_EXPORT extern const char kXeroxBW[];
+COMPONENT_EXPORT(PRINTING) extern const char kBlack[];
+COMPONENT_EXPORT(PRINTING) extern const char kCMYK[];
+COMPONENT_EXPORT(PRINTING) extern const char kKCMY[];
+COMPONENT_EXPORT(PRINTING) extern const char kCMY_K[];
+COMPONENT_EXPORT(PRINTING) extern const char kCMY[];
+COMPONENT_EXPORT(PRINTING) extern const char kColor[];
+COMPONENT_EXPORT(PRINTING) extern const char kEpsonColor[];
+COMPONENT_EXPORT(PRINTING) extern const char kEpsonMono[];
+COMPONENT_EXPORT(PRINTING) extern const char kFullColor[];
+COMPONENT_EXPORT(PRINTING) extern const char kGray[];
+COMPONENT_EXPORT(PRINTING) extern const char kGrayscale[];
+COMPONENT_EXPORT(PRINTING) extern const char kGreyscale[];
+COMPONENT_EXPORT(PRINTING) extern const char kMono[];
+COMPONENT_EXPORT(PRINTING) extern const char kMonochrome[];
+COMPONENT_EXPORT(PRINTING) extern const char kNormal[];
+COMPONENT_EXPORT(PRINTING) extern const char kNormalGray[];
+COMPONENT_EXPORT(PRINTING) extern const char kRGB[];
+COMPONENT_EXPORT(PRINTING) extern const char kRGBA[];
+COMPONENT_EXPORT(PRINTING) extern const char kRGB16[];
+COMPONENT_EXPORT(PRINTING) extern const char kSharpCMColor[];
+COMPONENT_EXPORT(PRINTING) extern const char kSharpCMBW[];
+COMPONENT_EXPORT(PRINTING) extern const char kXeroxAutomatic[];
+COMPONENT_EXPORT(PRINTING) extern const char kXeroxBW[];
 #endif
 
 // Specifies the horizontal alignment of the headers and footers.
diff --git a/printing/print_settings.h b/printing/print_settings.h
index 773c14c7..703a720 100644
--- a/printing/print_settings.h
+++ b/printing/print_settings.h
@@ -8,6 +8,7 @@
 #include <algorithm>
 #include <string>
 
+#include "base/component_export.h"
 #include "base/optional.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
@@ -15,7 +16,6 @@
 #include "printing/page_range.h"
 #include "printing/page_setup.h"
 #include "printing/print_job_constants.h"
-#include "printing/printing_export.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 
@@ -29,33 +29,35 @@
 
 // Convert from `color_mode` into a `color_model`.  An invalid `color_mode`
 // will give a result of `mojom::ColorModel::kUnknownColorModel`.
-PRINTING_EXPORT mojom::ColorModel ColorModeToColorModel(int color_mode);
+COMPONENT_EXPORT(PRINTING)
+mojom::ColorModel ColorModeToColorModel(int color_mode);
 
 // Returns true if `color_model` is color and false if it is B&W.  Callers
 // are not supposed to pass in `mojom::ColorModel::kUnknownColorModel`, but
 // if they do then the result will be base::nullopt.
-PRINTING_EXPORT base::Optional<bool> IsColorModelSelected(
-    mojom::ColorModel color_model);
+COMPONENT_EXPORT(PRINTING)
+base::Optional<bool> IsColorModelSelected(mojom::ColorModel color_model);
 
 #if defined(USE_CUPS)
 // Get the color model setting name and value for the `color_model`.
-PRINTING_EXPORT void GetColorModelForModel(mojom::ColorModel color_model,
-                                           std::string* color_setting_name,
-                                           std::string* color_value);
+COMPONENT_EXPORT(PRINTING)
+void GetColorModelForModel(mojom::ColorModel color_model,
+                           std::string* color_setting_name,
+                           std::string* color_value);
 
 #if defined(OS_MAC) || BUILDFLAG(IS_CHROMEOS_ASH)
 // Convert from `color_model` to a print-color-mode value from PWG 5100.13.
-PRINTING_EXPORT std::string GetIppColorModelForModel(
-    mojom::ColorModel color_model);
+COMPONENT_EXPORT(PRINTING)
+std::string GetIppColorModelForModel(mojom::ColorModel color_model);
 #endif
 #endif  // defined(USE_CUPS)
 
 // Inform the printing system that it may embed this user-agent string
 // in its output's metadata.
-PRINTING_EXPORT void SetAgent(const std::string& user_agent);
-PRINTING_EXPORT const std::string& GetAgent();
+COMPONENT_EXPORT(PRINTING) void SetAgent(const std::string& user_agent);
+COMPONENT_EXPORT(PRINTING) const std::string& GetAgent();
 
-class PRINTING_EXPORT PrintSettings {
+class COMPONENT_EXPORT(PRINTING) PrintSettings {
  public:
 #if defined(OS_WIN)
   enum PrinterType {
diff --git a/printing/print_settings_conversion.h b/printing/print_settings_conversion.h
index 2a4fe23..4541f03 100644
--- a/printing/print_settings_conversion.h
+++ b/printing/print_settings_conversion.h
@@ -7,8 +7,8 @@
 
 #include <memory>
 
+#include "base/component_export.h"
 #include "printing/page_range.h"
-#include "printing/printing_export.h"
 
 namespace base {
 class DictionaryValue;
@@ -19,11 +19,12 @@
 
 class PrintSettings;
 
-PRINTING_EXPORT PageRanges
-GetPageRangesFromJobSettings(const base::Value& job_settings);
+COMPONENT_EXPORT(PRINTING)
+PageRanges GetPageRangesFromJobSettings(const base::Value& job_settings);
 
 // Returns nullptr on failure.
-PRINTING_EXPORT std::unique_ptr<PrintSettings> PrintSettingsFromJobSettings(
+COMPONENT_EXPORT(PRINTING)
+std::unique_ptr<PrintSettings> PrintSettingsFromJobSettings(
     const base::Value& job_settings);
 
 // Use for debug only, because output is not completely consistent with format
diff --git a/printing/print_settings_initializer_mac.h b/printing/print_settings_initializer_mac.h
index 9e73867..f7b33bff 100644
--- a/printing/print_settings_initializer_mac.h
+++ b/printing/print_settings_initializer_mac.h
@@ -14,7 +14,7 @@
 class PrintSettings;
 
 // Initializes a PrintSettings object from the provided device context.
-class PRINTING_EXPORT PrintSettingsInitializerMac {
+class COMPONENT_EXPORT(PRINTING) PrintSettingsInitializerMac {
  public:
   PrintSettingsInitializerMac() = delete;
   PrintSettingsInitializerMac(const PrintSettingsInitializerMac&) = delete;
diff --git a/printing/print_settings_initializer_win.h b/printing/print_settings_initializer_win.h
index b92f3d33..de76e992 100644
--- a/printing/print_settings_initializer_win.h
+++ b/printing/print_settings_initializer_win.h
@@ -17,7 +17,7 @@
 class PrintSettings;
 
 // Initializes a PrintSettings object from the provided device context.
-class PRINTING_EXPORT PrintSettingsInitializerWin {
+class COMPONENT_EXPORT(PRINTING) PrintSettingsInitializerWin {
  public:
   PrintSettingsInitializerWin() = delete;
   PrintSettingsInitializerWin(const PrintSettingsInitializerWin&) = delete;
diff --git a/printing/printed_document.h b/printing/printed_document.h
index ec217ed4..d48702c 100644
--- a/printing/printed_document.h
+++ b/printing/printed_document.h
@@ -32,7 +32,7 @@
 // will have write access. Sensible functions are protected by a lock.
 // Warning: Once a page is loaded, it cannot be replaced. Pages may be discarded
 // under low memory conditions.
-class PRINTING_EXPORT PrintedDocument
+class COMPONENT_EXPORT(PRINTING) PrintedDocument
     : public base::RefCountedThreadSafe<PrintedDocument> {
  public:
   // The cookie shall be unique and has a specific relationship with its
diff --git a/printing/printed_page_win.h b/printing/printed_page_win.h
index 37d1dd75..3f701f1 100644
--- a/printing/printed_page_win.h
+++ b/printing/printed_page_win.h
@@ -20,7 +20,7 @@
 // Note: May be accessed from many threads at the same time. This is an non
 // issue since this object is immutable. The reason is that a page may be
 // printed and be displayed at the same time.
-class PRINTING_EXPORT PrintedPage
+class COMPONENT_EXPORT(PRINTING) PrintedPage
     : public base::RefCountedThreadSafe<PrintedPage> {
  public:
   PrintedPage(uint32_t page_number,
diff --git a/printing/printer_query_result.h b/printing/printer_query_result.h
index 0913090..a5fe727 100644
--- a/printing/printer_query_result.h
+++ b/printing/printer_query_result.h
@@ -5,7 +5,7 @@
 #ifndef PRINTING_PRINTER_QUERY_RESULT_H_
 #define PRINTING_PRINTER_QUERY_RESULT_H_
 
-#include "printing/printing_export.h"
+#include "base/component_export.h"
 
 namespace printing {
 
@@ -13,7 +13,7 @@
 // This enum is used to record UMA histogram values and should not be
 // reordered. Please keep in sync with PrinterStatusQueryResult in
 // src/tools/metrics/histograms/enums.xml.
-enum class PRINTING_EXPORT PrinterQueryResult {
+enum class COMPONENT_EXPORT(PRINTING) PrinterQueryResult {
   kUnknownFailure = 0,      // catchall error
   kSuccess = 1,             // successful
   kUnreachable = 2,         // failed to reach the host
diff --git a/printing/printer_status.h b/printing/printer_status.h
index c8765871..5269655 100644
--- a/printing/printer_status.h
+++ b/printing/printer_status.h
@@ -10,13 +10,13 @@
 #include <string>
 #include <vector>
 
-#include "printing/printing_export.h"
+#include "base/component_export.h"
 
 namespace printing {
 
 // Represents the status of a printer containing the properties printer-state,
 // printer-state-reasons, and printer-state-message.
-struct PRINTING_EXPORT PrinterStatus {
+struct COMPONENT_EXPORT(PRINTING) PrinterStatus {
   struct PrinterReason {
     // This enum is used to record UMA histogram values and should not be
     // reordered. Please keep in sync with PrinterStatusReasons in
diff --git a/printing/printing_context.h b/printing/printing_context.h
index c8d087c..a45e0a76 100644
--- a/printing/printing_context.h
+++ b/printing/printing_context.h
@@ -23,7 +23,7 @@
 // user selected printing context. This includes the OS-dependent UI to ask the
 // user about the print settings. Concrete implementations directly talk to the
 // printer and manage the document and page breaks.
-class PRINTING_EXPORT PrintingContext {
+class COMPONENT_EXPORT(PRINTING) PrintingContext {
  public:
   // Printing context delegate.
   class Delegate {
diff --git a/printing/printing_context_android.h b/printing/printing_context_android.h
index a07377a..9fbeed6 100644
--- a/printing/printing_context_android.h
+++ b/printing/printing_context_android.h
@@ -21,7 +21,8 @@
 
 // Android subclass of PrintingContext. This class communicates with the
 // Java side through JNI.
-class PRINTING_EXPORT PrintingContextAndroid : public PrintingContext {
+class COMPONENT_EXPORT(PRINTING) PrintingContextAndroid
+    : public PrintingContext {
  public:
   explicit PrintingContextAndroid(Delegate* delegate);
   PrintingContextAndroid(const PrintingContextAndroid&) = delete;
diff --git a/printing/printing_context_chromeos.h b/printing/printing_context_chromeos.h
index 04b9dd3..e0ccfdc5 100644
--- a/printing/printing_context_chromeos.h
+++ b/printing/printing_context_chromeos.h
@@ -17,7 +17,8 @@
 
 namespace printing {
 
-class PRINTING_EXPORT PrintingContextChromeos : public PrintingContext {
+class COMPONENT_EXPORT(PRINTING) PrintingContextChromeos
+    : public PrintingContext {
  public:
   static std::unique_ptr<PrintingContextChromeos> CreateForTesting(
       Delegate* delegate,
@@ -65,7 +66,8 @@
 
 // This has the side effect of recording UMA for advanced attributes usage,
 // so only call once per job.
-PRINTING_EXPORT std::vector<ScopedCupsOption> SettingsToCupsOptions(
+COMPONENT_EXPORT(PRINTING)
+std::vector<ScopedCupsOption> SettingsToCupsOptions(
     const PrintSettings& settings);
 
 }  // namespace printing
diff --git a/printing/printing_context_linux.h b/printing/printing_context_linux.h
index bc96bed1..88c8c54 100644
--- a/printing/printing_context_linux.h
+++ b/printing/printing_context_linux.h
@@ -16,7 +16,7 @@
 class PrintDialogGtkInterface;
 
 // PrintingContext with optional native UI for print dialog and pdf_paper_size.
-class PRINTING_EXPORT PrintingContextLinux : public PrintingContext {
+class COMPONENT_EXPORT(PRINTING) PrintingContextLinux : public PrintingContext {
  public:
   explicit PrintingContextLinux(Delegate* delegate);
   PrintingContextLinux(const PrintingContextLinux&) = delete;
diff --git a/printing/printing_context_mac.h b/printing/printing_context_mac.h
index 6249cfe..07fcfad 100644
--- a/printing/printing_context_mac.h
+++ b/printing/printing_context_mac.h
@@ -17,7 +17,7 @@
 
 namespace printing {
 
-class PRINTING_EXPORT PrintingContextMac : public PrintingContext {
+class COMPONENT_EXPORT(PRINTING) PrintingContextMac : public PrintingContext {
  public:
   explicit PrintingContextMac(Delegate* delegate);
   PrintingContextMac(const PrintingContextMac&) = delete;
diff --git a/printing/printing_context_no_system_dialog.h b/printing/printing_context_no_system_dialog.h
index 6c61339..d68a4969 100644
--- a/printing/printing_context_no_system_dialog.h
+++ b/printing/printing_context_no_system_dialog.h
@@ -7,11 +7,13 @@
 
 #include <string>
 
+#include "base/component_export.h"
 #include "printing/printing_context.h"
 
 namespace printing {
 
-class PRINTING_EXPORT PrintingContextNoSystemDialog : public PrintingContext {
+class COMPONENT_EXPORT(PRINTING) PrintingContextNoSystemDialog
+    : public PrintingContext {
  public:
   explicit PrintingContextNoSystemDialog(Delegate* delegate);
   PrintingContextNoSystemDialog(const PrintingContextNoSystemDialog&) = delete;
diff --git a/printing/printing_context_system_dialog_win.h b/printing/printing_context_system_dialog_win.h
index f905e6d..73397eb2 100644
--- a/printing/printing_context_system_dialog_win.h
+++ b/printing/printing_context_system_dialog_win.h
@@ -16,7 +16,7 @@
 
 namespace printing {
 
-class PRINTING_EXPORT PrintingContextSystemDialogWin
+class COMPONENT_EXPORT(PRINTING) PrintingContextSystemDialogWin
     : public PrintingContextWin {
  public:
   explicit PrintingContextSystemDialogWin(Delegate* delegate);
diff --git a/printing/printing_context_win.h b/printing/printing_context_win.h
index f76c051..cc28fb3 100644
--- a/printing/printing_context_win.h
+++ b/printing/printing_context_win.h
@@ -16,7 +16,7 @@
 class MetafileSkia;
 class PrintSettings;
 
-class PRINTING_EXPORT PrintingContextWin : public PrintingContext {
+class COMPONENT_EXPORT(PRINTING) PrintingContextWin : public PrintingContext {
  public:
   explicit PrintingContextWin(Delegate* delegate);
   PrintingContextWin(const PrintingContextWin&) = delete;
diff --git a/printing/printing_export.h b/printing/printing_export.h
deleted file mode 100644
index a8371910..0000000
--- a/printing/printing_export.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PRINTING_PRINTING_EXPORT_H_
-#define PRINTING_PRINTING_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(PRINTING_IMPLEMENTATION)
-#define PRINTING_EXPORT __declspec(dllexport)
-#else
-#define PRINTING_EXPORT __declspec(dllimport)
-#endif  // defined(PRINTING_IMPLEMENTATION)
-
-#else  // defined(WIN32)
-#if defined(PRINTING_IMPLEMENTATION)
-#define PRINTING_EXPORT __attribute__((visibility("default")))
-#else
-#define PRINTING_EXPORT
-#endif
-#endif
-
-#else  // defined(COMPONENT_BUILD)
-#define PRINTING_EXPORT
-#endif
-
-#endif  // PRINTING_PRINTING_EXPORT_H_
diff --git a/printing/printing_features.h b/printing/printing_features.h
index 72b155a..9dc84aa 100644
--- a/printing/printing_features.h
+++ b/printing/printing_features.h
@@ -5,10 +5,10 @@
 #ifndef PRINTING_PRINTING_FEATURES_H_
 #define PRINTING_PRINTING_FEATURES_H_
 
+#include "base/component_export.h"
 #include "base/feature_list.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
-#include "printing/printing_export.h"
 
 namespace printing {
 namespace features {
@@ -17,26 +17,27 @@
 // documented with descriptions of their behaviors in the .cc file.
 
 #if defined(OS_MAC)
-PRINTING_EXPORT extern const base::Feature kCupsIppPrintingBackend;
+COMPONENT_EXPORT(PRINTING) extern const base::Feature kCupsIppPrintingBackend;
 #endif  // defined(OS_MAC)
 
 #if defined(OS_WIN)
-PRINTING_EXPORT extern const base::Feature kPrintWithReducedRasterization;
-PRINTING_EXPORT extern const base::Feature kUseXpsForPrinting;
-PRINTING_EXPORT extern const base::Feature kUseXpsForPrintingFromPdf;
+COMPONENT_EXPORT(PRINTING)
+extern const base::Feature kPrintWithReducedRasterization;
+COMPONENT_EXPORT(PRINTING) extern const base::Feature kUseXpsForPrinting;
+COMPONENT_EXPORT(PRINTING) extern const base::Feature kUseXpsForPrintingFromPdf;
 
 // Helper function to determine if there is any print path which could require
 // the use of XPS print capabilities.
-PRINTING_EXPORT bool IsXpsPrintCapabilityRequired();
+COMPONENT_EXPORT(PRINTING) bool IsXpsPrintCapabilityRequired();
 
 // Helper function to determine if printing of a document from a particular
 // source should be done using XPS printing API instead of with GDI.
-PRINTING_EXPORT bool ShouldPrintUsingXps(bool source_is_pdf);
+COMPONENT_EXPORT(PRINTING) bool ShouldPrintUsingXps(bool source_is_pdf);
 #endif  // defined(OS_WIN)
 
 #if defined(OS_WIN) || defined(OS_MAC) || defined(OS_LINUX) || \
     defined(OS_CHROMEOS)
-PRINTING_EXPORT extern const base::Feature kEnableOopPrintDrivers;
+COMPONENT_EXPORT(PRINTING) extern const base::Feature kEnableOopPrintDrivers;
 #endif  // defined(OS_WIN) || defined(OS_MAC) || defined(OS_LINUX) ||
         // defined(OS_CHROMEOS)
 
diff --git a/printing/printing_utils.h b/printing/printing_utils.h
index 5b623a1c..9000dde 100644
--- a/printing/printing_utils.h
+++ b/printing/printing_utils.h
@@ -9,8 +9,8 @@
 
 #include <string>
 
+#include "base/component_export.h"
 #include "base/strings/string_piece.h"
-#include "printing/printing_export.h"
 
 namespace gfx {
 class Size;
@@ -19,32 +19,34 @@
 namespace printing {
 
 // Simplify title to resolve issue with some drivers.
-PRINTING_EXPORT std::u16string SimplifyDocumentTitle(
-    const std::u16string& title);
+COMPONENT_EXPORT(PRINTING)
+std::u16string SimplifyDocumentTitle(const std::u16string& title);
 
-PRINTING_EXPORT std::u16string SimplifyDocumentTitleWithLength(
-    const std::u16string& title,
-    size_t length);
+COMPONENT_EXPORT(PRINTING)
+std::u16string SimplifyDocumentTitleWithLength(const std::u16string& title,
+                                               size_t length);
 
-PRINTING_EXPORT std::u16string FormatDocumentTitleWithOwner(
-    const std::u16string& owner,
-    const std::u16string& title);
+COMPONENT_EXPORT(PRINTING)
+std::u16string FormatDocumentTitleWithOwner(const std::u16string& owner,
+                                            const std::u16string& title);
 
-PRINTING_EXPORT std::u16string FormatDocumentTitleWithOwnerAndLength(
+COMPONENT_EXPORT(PRINTING)
+std::u16string FormatDocumentTitleWithOwnerAndLength(
     const std::u16string& owner,
     const std::u16string& title,
     size_t length);
 
 // Returns the paper size (microns) most common in the locale to the nearest
 // millimeter. Defaults to ISO A4 for an empty or invalid locale.
-PRINTING_EXPORT gfx::Size GetDefaultPaperSizeFromLocaleMicrons(
-    base::StringPiece locale);
+COMPONENT_EXPORT(PRINTING)
+gfx::Size GetDefaultPaperSizeFromLocaleMicrons(base::StringPiece locale);
 
 // Returns true if both dimensions of the sizes have a delta less than or equal
 // to the epsilon value.
-PRINTING_EXPORT bool SizesEqualWithinEpsilon(const gfx::Size& lhs,
-                                             const gfx::Size& rhs,
-                                             int epsilon);
+COMPONENT_EXPORT(PRINTING)
+bool SizesEqualWithinEpsilon(const gfx::Size& lhs,
+                             const gfx::Size& rhs,
+                             int epsilon);
 
 }  // namespace printing
 
diff --git a/printing/sandbox/print_backend_sandbox_hook_linux.h b/printing/sandbox/print_backend_sandbox_hook_linux.h
index 03668589..160934e 100644
--- a/printing/sandbox/print_backend_sandbox_hook_linux.h
+++ b/printing/sandbox/print_backend_sandbox_hook_linux.h
@@ -5,15 +5,15 @@
 #ifndef PRINTING_SANDBOX_PRINT_BACKEND_SANDBOX_HOOK_LINUX_H_
 #define PRINTING_SANDBOX_PRINT_BACKEND_SANDBOX_HOOK_LINUX_H_
 
-#include "printing/printing_export.h"
+#include "base/component_export.h"
 #include "sandbox/policy/linux/sandbox_linux.h"
 
 namespace printing {
 
 // Setup allowed commands and filesystem permissions for print backend service
 // sandboxed process.
-PRINTING_EXPORT bool PrintBackendPreSandboxHook(
-    sandbox::policy::SandboxLinux::Options options);
+COMPONENT_EXPORT(PRINTING)
+bool PrintBackendPreSandboxHook(sandbox::policy::SandboxLinux::Options options);
 
 }  // namespace printing
 
diff --git a/printing/units.h b/printing/units.h
index 6dcc206..fc78236 100644
--- a/printing/units.h
+++ b/printing/units.h
@@ -5,7 +5,7 @@
 #ifndef PRINTING_UNITS_H_
 #define PRINTING_UNITS_H_
 
-#include "printing/printing_export.h"
+#include "base/component_export.h"
 
 namespace printing {
 
@@ -44,21 +44,21 @@
 constexpr float kA3HeightInch = 16.54f;
 
 // Converts from one unit system to another using integer arithmetics.
-PRINTING_EXPORT int ConvertUnit(double value, int old_unit, int new_unit);
+COMPONENT_EXPORT(PRINTING)
+int ConvertUnit(double value, int old_unit, int new_unit);
 
 // Converts from one unit system to another using doubles.
-PRINTING_EXPORT double ConvertUnitDouble(double value,
-                                         double old_unit,
-                                         double new_unit);
+COMPONENT_EXPORT(PRINTING)
+double ConvertUnitDouble(double value, double old_unit, double new_unit);
 
 // Converts from 1 pixel to 1 point using integers.
-PRINTING_EXPORT int ConvertPixelsToPoint(int pixels);
+COMPONENT_EXPORT(PRINTING) int ConvertPixelsToPoint(int pixels);
 
 // Converts from 1 pixel to 1 point using doubles.
-PRINTING_EXPORT double ConvertPixelsToPointDouble(double pixels);
+COMPONENT_EXPORT(PRINTING) double ConvertPixelsToPointDouble(double pixels);
 
 // Converts from 1 point to 1 pixel using doubles.
-PRINTING_EXPORT double ConvertPointsToPixelDouble(double points);
+COMPONENT_EXPORT(PRINTING) double ConvertPointsToPixelDouble(double points);
 
 }  // namespace printing
 
diff --git a/remoting/android/java/src/org/chromium/chromoting/ThirdPartyTokenFetcher.java b/remoting/android/java/src/org/chromium/chromoting/ThirdPartyTokenFetcher.java
index e61d1c9..19cfac8 100644
--- a/remoting/android/java/src/org/chromium/chromoting/ThirdPartyTokenFetcher.java
+++ b/remoting/android/java/src/org/chromium/chromoting/ThirdPartyTokenFetcher.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chromoting;
 
-import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.ActivityNotFoundException;
 import android.content.ComponentName;
@@ -16,9 +15,7 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
-import org.chromium.base.SecureRandomInitializer;
 
-import java.io.IOException;
 import java.security.SecureRandom;
 import java.util.ArrayList;
 
@@ -46,18 +43,12 @@
     private static final String RESPONSE_TYPE = "code token";
 
     /** This is used to securely generate an opaque 128 bit for the |mState| variable. */
-    @SuppressLint("TrulyRandom")
     private static SecureRandom sSecureRandom;
 
     // TODO(lambroslambrou): Refactor this class to only initialize a PRNG when ThirdPartyAuth is
     // actually used.
     static {
         sSecureRandom = new SecureRandom();
-        try {
-            SecureRandomInitializer.initialize(sSecureRandom);
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to initialize PRNG: " + e);
-        }
     }
 
     /** This is used to launch the third party login page in the browser. */
diff --git a/remoting/protocol/webrtc_frame_scheduler.h b/remoting/protocol/webrtc_frame_scheduler.h
index 4cd9fa00..72eb25b 100644
--- a/remoting/protocol/webrtc_frame_scheduler.h
+++ b/remoting/protocol/webrtc_frame_scheduler.h
@@ -41,8 +41,15 @@
   // |encoded_frame| may be nullptr. If |frame_stats| is not null then sets
   // send_pending_delay, rtt_estimate and bandwidth_estimate_kbps fields.
   virtual void OnFrameEncoded(
-      const WebrtcVideoEncoder::EncodedFrame* encoded_frame,
-      HostFrameStats* frame_stats) = 0;
+      const WebrtcVideoEncoder::EncodedFrame* encoded_frame) = 0;
+
+  // Writes the following bandwidth-related statistics to |frame_stats_out|:
+  // * bandwidth_estimate_kbps
+  // * rtt_estimate
+  // * send_pending_delay - an estimate of the delay (due to WebRTC's pacing
+  //   buffer) before the recently-encoded frame will be sent.
+  // This should be called just after OnFrameEncoded().
+  virtual void GetSchedulerStats(HostFrameStats& frame_stats_out) const = 0;
 };
 
 }  // namespace protocol
diff --git a/remoting/protocol/webrtc_frame_scheduler_simple.cc b/remoting/protocol/webrtc_frame_scheduler_simple.cc
index e951c8a..7653497 100644
--- a/remoting/protocol/webrtc_frame_scheduler_simple.cc
+++ b/remoting/protocol/webrtc_frame_scheduler_simple.cc
@@ -211,19 +211,16 @@
 }
 
 void WebrtcFrameSchedulerSimple::OnFrameEncoded(
-    const WebrtcVideoEncoder::EncodedFrame* encoded_frame,
-    HostFrameStats* frame_stats) {
+    const WebrtcVideoEncoder::EncodedFrame* encoded_frame) {
   DCHECK(thread_checker_.CalledOnValidThread());
   DCHECK(frame_pending_);
   frame_pending_ = false;
 
   base::TimeTicks now = tick_clock_->NowTicks();
 
-  if (frame_stats) {
-    // Calculate |send_pending_delay| before refilling |pacing_bucket_|.
-    frame_stats->send_pending_delay =
-        std::max(base::TimeDelta(), pacing_bucket_.GetEmptyTime() - now);
-  }
+  // Calculate |send_pending_delay_| before refilling |pacing_bucket_|.
+  send_pending_delay_ =
+      std::max(base::TimeDelta(), pacing_bucket_.GetEmptyTime() - now);
 
   // TODO(zijiehe): |encoded_frame|->data.empty() is unreasonable, we should try
   // to get rid of it in WebrtcVideoEncoder layer.
@@ -240,15 +237,17 @@
 
   ScheduleNextFrame();
 
-  if (frame_stats) {
-    frame_stats->rtt_estimate = rtt_estimate_;
-    frame_stats->bandwidth_estimate_kbps =
-        bandwidth_estimator_->GetBitrateKbps();
-  }
-
   bandwidth_estimator_->OnSendingFrame(*encoded_frame);
 }
 
+void WebrtcFrameSchedulerSimple::GetSchedulerStats(
+    HostFrameStats& frame_stats_out) const {
+  frame_stats_out.send_pending_delay = send_pending_delay_;
+  frame_stats_out.rtt_estimate = rtt_estimate_;
+  frame_stats_out.bandwidth_estimate_kbps =
+      bandwidth_estimator_->GetBitrateKbps();
+}
+
 void WebrtcFrameSchedulerSimple::SetTickClockForTest(
     const base::TickClock* tick_clock) {
   tick_clock_ = tick_clock;
diff --git a/remoting/protocol/webrtc_frame_scheduler_simple.h b/remoting/protocol/webrtc_frame_scheduler_simple.h
index 8cddc48c..5c7debf 100644
--- a/remoting/protocol/webrtc_frame_scheduler_simple.h
+++ b/remoting/protocol/webrtc_frame_scheduler_simple.h
@@ -43,8 +43,9 @@
   void Pause(bool pause) override;
   bool OnFrameCaptured(const webrtc::DesktopFrame* frame,
                        WebrtcVideoEncoder::FrameParams* params_out) override;
-  void OnFrameEncoded(const WebrtcVideoEncoder::EncodedFrame* encoded_frame,
-                      HostFrameStats* frame_stats) override;
+  void OnFrameEncoded(
+      const WebrtcVideoEncoder::EncodedFrame* encoded_frame) override;
+  void GetSchedulerStats(HostFrameStats& frame_stats_out) const override;
 
   // Allows unit-tests to provide a mock clock.
   void SetTickClockForTest(const base::TickClock* tick_clock);
@@ -78,7 +79,11 @@
   // Set to true when a frame is being captured or encoded.
   bool frame_pending_ = false;
 
-  base::TimeDelta rtt_estimate_;
+  base::TimeDelta rtt_estimate_{base::TimeDelta::Max()};
+
+  // An estimate, set by OnFrameEncoded(), of the delay before WebRTC will send
+  // the encoded frame.
+  base::TimeDelta send_pending_delay_{base::TimeDelta::Max()};
 
   // Set to true when encoding unchanged frames for top-off.
   bool top_off_is_active_ = false;
diff --git a/remoting/protocol/webrtc_frame_scheduler_unittest.cc b/remoting/protocol/webrtc_frame_scheduler_unittest.cc
index 1736a51..bcd972c6 100644
--- a/remoting/protocol/webrtc_frame_scheduler_unittest.cc
+++ b/remoting/protocol/webrtc_frame_scheduler_unittest.cc
@@ -52,7 +52,8 @@
       WebrtcVideoEncoder::EncodedFrame encoded;
       encoded.key_frame = out_params.key_frame;
       encoded.data = 'X';
-      scheduler_->OnFrameEncoded(&encoded, &frame_stats_);
+      scheduler_->OnFrameEncoded(&encoded);
+      scheduler_->GetSchedulerStats(frame_stats_);
     }
   }
 
diff --git a/remoting/protocol/webrtc_video_stream.cc b/remoting/protocol/webrtc_video_stream.cc
index 8143703..b8bb292 100644
--- a/remoting/protocol/webrtc_video_stream.cc
+++ b/remoting/protocol/webrtc_video_stream.cc
@@ -294,8 +294,7 @@
     current_frame_stats_->frame_quality = (63 - frame->quantizer) * 100 / 63;
   }
 
-  HostFrameStats stats;
-  scheduler_->OnFrameEncoded(frame.get(), &stats);
+  scheduler_->OnFrameEncoded(frame.get());
 
   if (encode_result != WebrtcVideoEncoder::EncodeResult::SUCCEEDED) {
     LOG(ERROR) << "Video encoder returns error "
@@ -328,6 +327,11 @@
 
   // Send FrameStats message.
   if (video_stats_dispatcher_.is_connected()) {
+    HostFrameStats stats;
+
+    // Get bandwidth, RTT and send_pending_delay into |stats|.
+    scheduler_->GetSchedulerStats(stats);
+
     stats.frame_size = frame ? frame->data.size() : 0;
 
     if (!current_frame_stats_->input_event_timestamps.is_null()) {
diff --git a/services/device/geolocation/network_location_request.cc b/services/device/geolocation/network_location_request.cc
index dab92db7..454abdc 100644
--- a/services/device/geolocation/network_location_request.cc
+++ b/services/device/geolocation/network_location_request.cc
@@ -67,6 +67,11 @@
                            code);
 }
 
+void RecordUmaNetError(int net_error) {
+  base::UmaHistogramSparse("Geolocation.NetworkLocationRequest.NetError",
+                           -net_error);
+}
+
 void RecordUmaAccessPoints(int count) {
   const int min = 1;
   const int max = 20;
@@ -310,6 +315,7 @@
     FormatPositionError(server_url, net::ErrorToShortString(net_error),
                         position);
     RecordUmaEvent(NETWORK_LOCATION_REQUEST_EVENT_RESPONSE_EMPTY);
+    RecordUmaNetError(net_error);
     return;
   }
 
diff --git a/services/device/public/cpp/device_feature_list.cc b/services/device/public/cpp/device_feature_list.cc
index 28284fc..05d1ca3 100644
--- a/services/device/public/cpp/device_feature_list.cc
+++ b/services/device/public/cpp/device_feature_list.cc
@@ -5,7 +5,6 @@
 #include "base/android/jni_string.h"
 #include "base/feature_list.h"
 #include "base/notreached.h"
-#include "base/stl_util.h"
 #include "services/device/device_service_jni_headers/DeviceFeatureList_jni.h"
 #include "services/device/public/cpp/device_features.h"
 
@@ -19,15 +18,15 @@
 // Array of features exposed through the Java ContentFeatureList API. Entries in
 // this array may either refer to features defined in the header of this file or
 // in other locations in the code base (e.g. content_features.h).
-const base::Feature* kFeaturesExposedToJava[] = {
+const base::Feature* const kFeaturesExposedToJava[] = {
     &kGenericSensorExtraClasses,
 };
 
 // TODO(crbug.com/1060097): Removethis once a generalized FeatureList exists.
 const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
-  for (size_t i = 0; i < base::size(kFeaturesExposedToJava); ++i) {
-    if (kFeaturesExposedToJava[i]->name == feature_name)
-      return kFeaturesExposedToJava[i];
+  for (const base::Feature* feature : kFeaturesExposedToJava) {
+    if (feature->name == feature_name)
+      return feature;
   }
   NOTREACHED() << "Queried feature cannot be found in DeviceFeatureList: "
                << feature_name;
diff --git a/services/device/serial/BUILD.gn b/services/device/serial/BUILD.gn
index 2b093df..1a98d092 100644
--- a/services/device/serial/BUILD.gn
+++ b/services/device/serial/BUILD.gn
@@ -26,8 +26,6 @@
       "bluetooth_serial_device_enumerator.h",
       "bluetooth_serial_port_impl.cc",
       "bluetooth_serial_port_impl.h",
-      "buffer.cc",
-      "buffer.h",
       "serial_device_enumerator.cc",
       "serial_device_enumerator.h",
       "serial_io_handler.cc",
diff --git a/services/device/serial/bluetooth_serial_port_impl.cc b/services/device/serial/bluetooth_serial_port_impl.cc
index 1617b7b..5cdb3fc 100644
--- a/services/device/serial/bluetooth_serial_port_impl.cc
+++ b/services/device/serial/bluetooth_serial_port_impl.cc
@@ -9,7 +9,6 @@
 #include "net/base/io_buffer.h"
 #include "services/device/public/cpp/bluetooth/bluetooth_utils.h"
 #include "services/device/public/cpp/serial/serial_switches.h"
-#include "services/device/serial/buffer.h"
 
 namespace device {
 
diff --git a/services/device/serial/bluetooth_serial_port_impl_unittest.cc b/services/device/serial/bluetooth_serial_port_impl_unittest.cc
index fe9fc110..5d474083 100644
--- a/services/device/serial/bluetooth_serial_port_impl_unittest.cc
+++ b/services/device/serial/bluetooth_serial_port_impl_unittest.cc
@@ -23,7 +23,6 @@
 #include "services/device/public/cpp/serial/serial_switches.h"
 #include "services/device/public/cpp/test/fake_serial_port_client.h"
 #include "services/device/public/mojom/serial.mojom.h"
-#include "services/device/serial/buffer.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/services/device/serial/buffer.cc b/services/device/serial/buffer.cc
deleted file mode 100644
index 5413ac7d..0000000
--- a/services/device/serial/buffer.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/device/serial/buffer.h"
-
-#include <utility>
-
-#include "base/numerics/safe_conversions.h"
-#include "net/base/io_buffer.h"
-
-namespace device {
-
-ReadOnlyBuffer::~ReadOnlyBuffer() = default;
-
-WritableBuffer::~WritableBuffer() = default;
-
-SendBuffer::SendBuffer(const uint8_t* buffer,
-                       uint32_t size,
-                       SendCompleteCallback callback)
-    : data_(buffer), size_(size), callback_(std::move(callback)) {}
-
-SendBuffer::~SendBuffer() = default;
-
-const uint8_t* SendBuffer::GetData() {
-  return data_;
-}
-
-uint32_t SendBuffer::GetSize() {
-  return size_;
-}
-
-void SendBuffer::Done(uint32_t bytes_read) {
-  std::move(callback_).Run(bytes_read, device::mojom::SerialSendError::NONE);
-}
-
-void SendBuffer::DoneWithError(uint32_t bytes_read, int32_t error) {
-  std::move(callback_).Run(bytes_read,
-                           static_cast<device::mojom::SerialSendError>(error));
-}
-
-ReceiveBuffer::ReceiveBuffer(char* buffer,
-                             uint32_t size,
-                             ReceiveCompleteCallback callback)
-    : buffer_(buffer), size_(size), callback_(std::move(callback)) {}
-
-ReceiveBuffer::~ReceiveBuffer() = default;
-
-char* ReceiveBuffer::GetData() {
-  return buffer_;
-}
-
-uint32_t ReceiveBuffer::GetSize() {
-  return size_;
-}
-
-void ReceiveBuffer::Done(uint32_t bytes_written) {
-  std::move(callback_).Run(bytes_written,
-                           device::mojom::SerialReceiveError::NONE);
-}
-
-void ReceiveBuffer::DoneWithError(uint32_t bytes_written, int32_t error) {
-  std::move(callback_).Run(
-      bytes_written, static_cast<device::mojom::SerialReceiveError>(error));
-}
-
-}  // namespace device
diff --git a/services/device/serial/buffer.h b/services/device/serial/buffer.h
deleted file mode 100644
index 3360529..0000000
--- a/services/device/serial/buffer.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_DEVICE_SERIAL_BUFFER_H_
-#define SERVICES_DEVICE_SERIAL_BUFFER_H_
-
-#include <stdint.h>
-
-#include <vector>
-
-#include "base/callback.h"
-#include "net/base/io_buffer.h"
-#include "services/device/public/mojom/serial.mojom.h"
-
-namespace device {
-
-// A fixed-size read-only buffer. The data-reader should call Done() when it is
-// finished reading bytes from the buffer. Alternatively, the reader can report
-// an error by calling DoneWithError() with the number of bytes read and the
-// error it wishes to report.
-class ReadOnlyBuffer {
- public:
-  virtual ~ReadOnlyBuffer();
-  virtual const uint8_t* GetData() = 0;
-  virtual uint32_t GetSize() = 0;
-  virtual void Done(uint32_t bytes_read) = 0;
-  virtual void DoneWithError(uint32_t bytes_read, int32_t error) = 0;
-};
-
-// A fixed-size writable buffer. The data-writer should call Done() when it is
-// finished writing bytes to the buffer. Alternatively, the writer can report
-// an error by calling DoneWithError() with the number of bytes written and the
-// error it wishes to report.
-class WritableBuffer {
- public:
-  virtual ~WritableBuffer();
-  virtual char* GetData() = 0;
-  virtual uint32_t GetSize() = 0;
-  virtual void Done(uint32_t bytes_written) = 0;
-  virtual void DoneWithError(uint32_t bytes_written, int32_t error) = 0;
-};
-
-// A useful basic implementation of a ReadOnlyBuffer in which the data is
-// initialized via a character vector.
-class SendBuffer : public device::ReadOnlyBuffer {
- public:
-  using SendCompleteCallback =
-      base::OnceCallback<void(uint32_t, device::mojom::SerialSendError)>;
-  SendBuffer(const uint8_t* buffer,
-             uint32_t size,
-             SendCompleteCallback callback);
-  ~SendBuffer() override;
-
-  const uint8_t* GetData() override;
-  uint32_t GetSize() override;
-  void Done(uint32_t bytes_read) override;
-  void DoneWithError(uint32_t bytes_read, int32_t error) override;
-
- private:
-  const uint8_t* data_;
-  uint32_t size_;
-  SendCompleteCallback callback_;
-};
-
-// A useful basic implementation of a WritableBuffer in which the data is
-// stored in a net::IOBuffer.
-class ReceiveBuffer : public device::WritableBuffer {
- public:
-  using ReceiveCompleteCallback =
-      base::OnceCallback<void(uint32_t, device::mojom::SerialReceiveError)>;
-  ReceiveBuffer(char* buffer, uint32_t size, ReceiveCompleteCallback callback);
-  ~ReceiveBuffer() override;
-
-  char* GetData() override;
-  uint32_t GetSize() override;
-  void Done(uint32_t bytes_written) override;
-  void DoneWithError(uint32_t bytes_written, int32_t error) override;
-
- private:
-  char* buffer_;
-  const uint32_t size_;
-  ReceiveCompleteCallback callback_;
-};
-
-}  // namespace device
-
-#endif  // SERVICES_DEVICE_SERIAL_BUFFER_H_
diff --git a/services/device/serial/serial_io_handler.cc b/services/device/serial/serial_io_handler.cc
index ae4cb095..b26b3d9 100644
--- a/services/device/serial/serial_io_handler.cc
+++ b/services/device/serial/serial_io_handler.cc
@@ -186,19 +186,23 @@
   // port closed by destructor.
 }
 
-void SerialIoHandler::Read(std::unique_ptr<WritableBuffer> buffer) {
+void SerialIoHandler::Read(base::span<uint8_t> buffer,
+                           ReadCompleteCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!IsReadPending());
-  pending_read_buffer_ = std::move(buffer);
+  pending_read_buffer_ = buffer;
+  pending_read_callback_ = std::move(callback);
   read_canceled_ = false;
   AddRef();
   ReadImpl();
 }
 
-void SerialIoHandler::Write(std::unique_ptr<ReadOnlyBuffer> buffer) {
+void SerialIoHandler::Write(base::span<const uint8_t> buffer,
+                            WriteCompleteCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!IsWritePending());
-  pending_write_buffer_ = std::move(buffer);
+  pending_write_buffer_ = buffer;
+  pending_write_callback_ = std::move(callback);
   write_canceled_ = false;
   AddRef();
   WriteImpl();
@@ -208,13 +212,8 @@
                                     mojom::SerialReceiveError error) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsReadPending());
-  std::unique_ptr<WritableBuffer> pending_read_buffer =
-      std::move(pending_read_buffer_);
-  if (error == mojom::SerialReceiveError::NONE) {
-    pending_read_buffer->Done(bytes_read);
-  } else {
-    pending_read_buffer->DoneWithError(bytes_read, static_cast<int32_t>(error));
-  }
+  pending_read_buffer_ = base::span<uint8_t>();
+  std::move(pending_read_callback_).Run(bytes_read, error);
   Release();
 }
 
@@ -222,25 +221,19 @@
                                      mojom::SerialSendError error) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsWritePending());
-  std::unique_ptr<ReadOnlyBuffer> pending_write_buffer =
-      std::move(pending_write_buffer_);
-  if (error == mojom::SerialSendError::NONE) {
-    pending_write_buffer->Done(bytes_written);
-  } else {
-    pending_write_buffer->DoneWithError(bytes_written,
-                                        static_cast<int32_t>(error));
-  }
+  pending_write_buffer_ = base::span<const uint8_t>();
+  std::move(pending_write_callback_).Run(bytes_written, error);
   Release();
 }
 
 bool SerialIoHandler::IsReadPending() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return pending_read_buffer_ != NULL;
+  return !pending_read_callback_.is_null();
 }
 
 bool SerialIoHandler::IsWritePending() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return pending_write_buffer_ != NULL;
+  return !pending_write_callback_.is_null();
 }
 
 void SerialIoHandler::CancelRead(mojom::SerialReceiveError reason) {
diff --git a/services/device/serial/serial_io_handler.h b/services/device/serial/serial_io_handler.h
index 8eefe2b..bbc0426a 100644
--- a/services/device/serial/serial_io_handler.h
+++ b/services/device/serial/serial_io_handler.h
@@ -20,7 +20,6 @@
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "services/device/public/mojom/serial.mojom.h"
-#include "services/device/serial/buffer.h"
 
 namespace device {
 
@@ -35,7 +34,11 @@
       const base::FilePath& port,
       scoped_refptr<base::SingleThreadTaskRunner> ui_thread_task_runner);
 
-  typedef base::OnceCallback<void(bool success)> OpenCompleteCallback;
+  using OpenCompleteCallback = base::OnceCallback<void(bool success)>;
+  using ReadCompleteCallback =
+      base::OnceCallback<void(uint32_t bytes_read, mojom::SerialReceiveError)>;
+  using WriteCompleteCallback =
+      base::OnceCallback<void(uint32_t bytes_written, mojom::SerialSendError)>;
 
   // Initiates an asynchronous Open of the device.
   virtual void Open(const mojom::SerialConnectionOptions& options,
@@ -58,15 +61,15 @@
                            const std::string& error_message);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
-  // Performs an async Read operation. Behavior is undefined if this is called
-  // while a Read is already pending. Otherwise, the Done or DoneWithError
-  // method on |buffer| will eventually be called with a result.
-  void Read(std::unique_ptr<WritableBuffer> buffer);
+  // Performs an async read operation. Behavior is undefined if this is called
+  // while a read is already pending. Otherwise, |callback| will eventually be
+  // called with a result. |buffer| must remain valid until |callback| is run.
+  void Read(base::span<uint8_t> buffer, ReadCompleteCallback callback);
 
-  // Performs an async Write operation. Behavior is undefined if this is called
-  // while a Write is already pending. Otherwise, the Done or DoneWithError
-  // method on |buffer| will eventually be called with a result.
-  void Write(std::unique_ptr<ReadOnlyBuffer> buffer);
+  // Performs an async write operation. Behavior is undefined if this is called
+  // while a write is already pending. Otherwise, |callback| will eventually be
+  // called with a result. |buffer| must remain valid until |callback| is run.
+  void Write(base::span<const uint8_t> buffer, WriteCompleteCallback callback);
 
   // Indicates whether or not a read is currently pending.
   bool IsReadPending() const;
@@ -165,12 +168,8 @@
 
   const base::File& file() const { return file_; }
 
-  char* pending_read_buffer() const {
-    return pending_read_buffer_ ? pending_read_buffer_->GetData() : NULL;
-  }
-
-  uint32_t pending_read_buffer_len() const {
-    return pending_read_buffer_ ? pending_read_buffer_->GetSize() : 0;
+  base::span<uint8_t> pending_read_buffer() const {
+    return pending_read_buffer_;
   }
 
   mojom::SerialReceiveError read_cancel_reason() const {
@@ -179,12 +178,8 @@
 
   bool read_canceled() const { return read_canceled_; }
 
-  const uint8_t* pending_write_buffer() const {
-    return pending_write_buffer_ ? pending_write_buffer_->GetData() : NULL;
-  }
-
-  uint32_t pending_write_buffer_len() const {
-    return pending_write_buffer_ ? pending_write_buffer_->GetSize() : 0;
+  base::span<const uint8_t> pending_write_buffer() const {
+    return pending_write_buffer_;
   }
 
   mojom::SerialSendError write_cancel_reason() const {
@@ -224,11 +219,13 @@
   // Currently applied connection options.
   mojom::SerialConnectionOptions options_;
 
-  std::unique_ptr<WritableBuffer> pending_read_buffer_;
+  base::span<uint8_t> pending_read_buffer_;
+  ReadCompleteCallback pending_read_callback_;
   mojom::SerialReceiveError read_cancel_reason_;
   bool read_canceled_;
 
-  std::unique_ptr<ReadOnlyBuffer> pending_write_buffer_;
+  base::span<const uint8_t> pending_write_buffer_;
+  WriteCompleteCallback pending_write_callback_;
   mojom::SerialSendError write_cancel_reason_;
   bool write_canceled_;
 
diff --git a/services/device/serial/serial_io_handler_posix.cc b/services/device/serial/serial_io_handler_posix.cc
index 61c5222a..8236b026 100644
--- a/services/device/serial/serial_io_handler_posix.cc
+++ b/services/device/serial/serial_io_handler_posix.cc
@@ -127,7 +127,7 @@
 
 void SerialIoHandlerPosix::ReadImpl() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(pending_read_buffer());
+  DCHECK(IsReadPending());
 
   if (!file().IsValid()) {
     QueueReadCompleted(0, mojom::SerialReceiveError::DISCONNECTED);
@@ -143,7 +143,7 @@
 
 void SerialIoHandlerPosix::WriteImpl() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(pending_write_buffer());
+  DCHECK(IsWritePending());
 
   if (!file().IsValid()) {
     QueueWriteCompleted(0, mojom::SerialSendError::DISCONNECTED);
@@ -319,10 +319,10 @@
 
 void SerialIoHandlerPosix::AttemptRead(bool within_read) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (pending_read_buffer()) {
-    int bytes_read =
-        HANDLE_EINTR(read(file().GetPlatformFile(), pending_read_buffer(),
-                          pending_read_buffer_len()));
+  if (IsReadPending()) {
+    int bytes_read = HANDLE_EINTR(read(file().GetPlatformFile(),
+                                       pending_read_buffer().data(),
+                                       pending_read_buffer().size()));
     if (bytes_read < 0) {
       if (errno == EAGAIN) {
         // The fd does not have data to read yet so continue waiting.
@@ -343,8 +343,8 @@
       bool break_detected = false;
       bool parity_error_detected = false;
       int new_bytes_read =
-          CheckReceiveError(pending_read_buffer(), pending_read_buffer_len(),
-                            bytes_read, break_detected, parity_error_detected);
+          CheckReceiveError(pending_read_buffer(), bytes_read, break_detected,
+                            parity_error_detected);
 
       if (break_detected) {
         RunReadCompleted(within_read, new_bytes_read,
@@ -380,10 +380,10 @@
 
 void SerialIoHandlerPosix::OnFileCanWriteWithoutBlocking() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (pending_write_buffer()) {
-    int bytes_written =
-        HANDLE_EINTR(write(file().GetPlatformFile(), pending_write_buffer(),
-                           pending_write_buffer_len()));
+  if (IsWritePending()) {
+    int bytes_written = HANDLE_EINTR(write(file().GetPlatformFile(),
+                                           pending_write_buffer().data(),
+                                           pending_write_buffer().size()));
     if (bytes_written < 0) {
       if (errno == ENXIO) {
         WriteCompleted(0, mojom::SerialSendError::DISCONNECTED);
@@ -593,8 +593,7 @@
 //
 // break/parity error sequences are removed from the byte stream
 // '\377' '\377' sequence is replaced with '\377'
-int SerialIoHandlerPosix::CheckReceiveError(char* buffer,
-                                            int buffer_len,
+int SerialIoHandlerPosix::CheckReceiveError(base::span<uint8_t> buffer,
                                             int bytes_read,
                                             bool& break_detected,
                                             bool& parity_error_detected) {
@@ -602,7 +601,7 @@
   DCHECK_LE(new_bytes_read, 2);
 
   for (int i = 0; i < bytes_read; ++i) {
-    char ch = buffer[i];
+    uint8_t ch = buffer[i];
     if (new_bytes_read == 0) {
       chars_stashed_[0] = ch;
     } else if (new_bytes_read == 1) {
@@ -613,16 +612,16 @@
     ++new_bytes_read;
     switch (error_detect_state_) {
       case ErrorDetectState::NO_ERROR:
-        if (ch == '\377') {
+        if (ch == 0377) {
           error_detect_state_ = ErrorDetectState::MARK_377_SEEN;
         }
         break;
       case ErrorDetectState::MARK_377_SEEN:
         DCHECK_GE(new_bytes_read, 2);
-        if (ch == '\0') {
+        if (ch == 0) {
           error_detect_state_ = ErrorDetectState::MARK_0_SEEN;
         } else {
-          if (ch == '\377') {
+          if (ch == 0377) {
             // receive two bytes '\377' '\377', since ISTRIP is not set and
             // PARMRK is set, a valid byte '\377' is passed to the program as
             // two bytes, '\377' '\377'. Replace these two bytes with one byte
@@ -635,7 +634,7 @@
         break;
       case ErrorDetectState::MARK_0_SEEN:
         DCHECK_GE(new_bytes_read, 3);
-        if (ch == '\0') {
+        if (ch == 0) {
           break_detected = true;
           new_bytes_read -= 3;
           error_detect_state_ = ErrorDetectState::NO_ERROR;
@@ -644,7 +643,7 @@
             parity_error_detected = true;
             new_bytes_read -= 3;
             error_detect_state_ = ErrorDetectState::NO_ERROR;
-          } else if (ch == '\377') {
+          } else if (ch == 0377) {
             error_detect_state_ = ErrorDetectState::MARK_377_SEEN;
           } else {
             error_detect_state_ = ErrorDetectState::NO_ERROR;
@@ -660,10 +659,10 @@
   // Stash up to 2 characters that are potentially part of a break/parity error
   // sequence. The buffer may also not be large enough to store all the bytes.
   // tmp[] stores the characters that need to be stashed for this read.
-  char tmp[2];
+  uint8_t tmp[2];
   num_chars_stashed_ = 0;
   if (error_detect_state_ == ErrorDetectState::MARK_0_SEEN ||
-      new_bytes_read - buffer_len == 2) {
+      new_bytes_read - buffer.size() == 2) {
     // need to stash the last two characters
     if (new_bytes_read == 2) {
       memcpy(tmp, chars_stashed_, new_bytes_read);
@@ -677,7 +676,7 @@
     }
     num_chars_stashed_ = 2;
   } else if (error_detect_state_ == ErrorDetectState::MARK_377_SEEN ||
-             new_bytes_read - buffer_len == 1) {
+             new_bytes_read - buffer.size() == 1) {
     // need to stash the last character
     if (new_bytes_read <= 2) {
       tmp[0] = chars_stashed_[new_bytes_read - 1];
@@ -690,9 +689,9 @@
   new_bytes_read -= num_chars_stashed_;
   if (new_bytes_read > 2) {
     // right shift two bytes to store bytes from chars_stashed_[]
-    memmove(buffer + 2, buffer, new_bytes_read - 2);
+    memmove(&buffer[2], &buffer[0], new_bytes_read - 2);
   }
-  memcpy(buffer, chars_stashed_, std::min(new_bytes_read, 2));
+  memcpy(&buffer[0], chars_stashed_, std::min(new_bytes_read, 2));
   memcpy(chars_stashed_, tmp, num_chars_stashed_);
   return new_bytes_read;
 }
diff --git a/services/device/serial/serial_io_handler_posix.h b/services/device/serial/serial_io_handler_posix.h
index 51311d6..cbf39314 100644
--- a/services/device/serial/serial_io_handler_posix.h
+++ b/services/device/serial/serial_io_handler_posix.h
@@ -37,8 +37,7 @@
   bool SetControlSignals(
       const mojom::SerialHostControlSignals& control_signals) override;
   mojom::SerialConnectionInfoPtr GetPortInfo() const override;
-  int CheckReceiveError(char* buffer,
-                        int buffer_len,
+  int CheckReceiveError(base::span<uint8_t> buffer,
                         int bytes_read,
                         bool& break_detected,
                         bool& parity_error_detected);
@@ -71,7 +70,7 @@
 
   ErrorDetectState error_detect_state_;
   bool parity_check_enabled_;
-  char chars_stashed_[2];
+  uint8_t chars_stashed_[2];
   int num_chars_stashed_;
 
   DISALLOW_COPY_AND_ASSIGN(SerialIoHandlerPosix);
diff --git a/services/device/serial/serial_io_handler_posix_unittest.cc b/services/device/serial/serial_io_handler_posix_unittest.cc
index dba5ebd..94f111d 100644
--- a/services/device/serial/serial_io_handler_posix_unittest.cc
+++ b/services/device/serial/serial_io_handler_posix_unittest.cc
@@ -42,7 +42,8 @@
     bool break_detected = false;
     bool parity_error_detected = false;
     int new_bytes_read = serial_io_handler_posix_->CheckReceiveError(
-        buffer, buffer_len, bytes_read, break_detected, parity_error_detected);
+        base::make_span(reinterpret_cast<uint8_t*>(buffer), buffer_len),
+        bytes_read, break_detected, parity_error_detected);
 
     EXPECT_EQ(error_detect_state_expected,
               serial_io_handler_posix_->error_detect_state_);
@@ -50,7 +51,7 @@
               serial_io_handler_posix_->num_chars_stashed_);
     for (int i = 0; i < num_chars_stashed_expected; ++i) {
       EXPECT_EQ(chars_stashed_expected[i],
-                serial_io_handler_posix_->chars_stashed_[i]);
+                static_cast<char>(serial_io_handler_posix_->chars_stashed_[i]));
     }
     EXPECT_EQ(new_bytes_read_expected, new_bytes_read);
     for (int i = 0; i < new_bytes_read_expected; ++i) {
diff --git a/services/device/serial/serial_io_handler_win.cc b/services/device/serial/serial_io_handler_win.cc
index 65e9047..4e22f82 100644
--- a/services/device/serial/serial_io_handler_win.cc
+++ b/services/device/serial/serial_io_handler_win.cc
@@ -183,7 +183,7 @@
 
 void SerialIoHandlerWin::ReadImpl() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(pending_read_buffer());
+  DCHECK(IsReadPending());
 
   if (!file().IsValid()) {
     QueueReadCompleted(0, mojom::SerialReceiveError::DISCONNECTED);
@@ -194,8 +194,8 @@
   if (!IsReadPending())
     return;
 
-  if (!ReadFile(file().GetPlatformFile(), pending_read_buffer(),
-                pending_read_buffer_len(), nullptr,
+  if (!ReadFile(file().GetPlatformFile(), pending_read_buffer().data(),
+                pending_read_buffer().size(), nullptr,
                 &read_context_->overlapped) &&
       GetLastError() != ERROR_IO_PENDING) {
     OnIOCompleted(read_context_.get(), 0, GetLastError());
@@ -204,15 +204,15 @@
 
 void SerialIoHandlerWin::WriteImpl() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(pending_write_buffer());
+  DCHECK(IsWritePending());
 
   if (!file().IsValid()) {
     QueueWriteCompleted(0, mojom::SerialSendError::DISCONNECTED);
     return;
   }
 
-  if (!WriteFile(file().GetPlatformFile(), pending_write_buffer(),
-                 pending_write_buffer_len(), nullptr,
+  if (!WriteFile(file().GetPlatformFile(), pending_write_buffer().data(),
+                 pending_write_buffer().size(), nullptr,
                  &write_context_->overlapped) &&
       GetLastError() != ERROR_IO_PENDING) {
     OnIOCompleted(write_context_.get(), 0, GetLastError());
@@ -307,7 +307,7 @@
       ReadCompleted(0, mojom::SerialReceiveError::SYSTEM_ERROR);
     }
   } else if (context == write_context_.get()) {
-    DCHECK(pending_write_buffer());
+    DCHECK(IsWritePending());
     if (write_canceled()) {
       WriteCompleted(0, write_cancel_reason());
     } else if (error == ERROR_SUCCESS || error == ERROR_OPERATION_ABORTED) {
diff --git a/services/device/serial/serial_port_impl.cc b/services/device/serial/serial_port_impl.cc
index 89c9b3d..5522186a 100644
--- a/services/device/serial/serial_port_impl.cc
+++ b/services/device/serial/serial_port_impl.cc
@@ -10,7 +10,6 @@
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/single_thread_task_runner.h"
-#include "services/device/serial/buffer.h"
 #include "services/device/serial/serial_io_handler.h"
 
 namespace device {
@@ -217,10 +216,10 @@
                                        MOJO_WRITE_DATA_FLAG_NONE);
   }
   if (result == MOJO_RESULT_OK) {
-    io_handler_->Write(std::make_unique<SendBuffer>(
-        static_cast<const uint8_t*>(buffer), num_bytes,
+    io_handler_->Write(
+        base::make_span(reinterpret_cast<const uint8_t*>(buffer), num_bytes),
         base::BindOnce(&SerialPortImpl::OnWriteToPortCompleted,
-                       weak_factory_.GetWeakPtr(), num_bytes)));
+                       weak_factory_.GetWeakPtr(), num_bytes));
     return;
   }
   if (result == MOJO_RESULT_SHOULD_WAIT) {
@@ -273,10 +272,10 @@
                                          MOJO_WRITE_DATA_FLAG_NONE);
   }
   if (result == MOJO_RESULT_OK) {
-    io_handler_->Read(std::make_unique<ReceiveBuffer>(
-        static_cast<char*>(buffer), num_bytes,
+    io_handler_->Read(
+        base::make_span(reinterpret_cast<uint8_t*>(buffer), num_bytes),
         base::BindOnce(&SerialPortImpl::WriteToOutStream,
-                       weak_factory_.GetWeakPtr())));
+                       weak_factory_.GetWeakPtr()));
     return;
   }
   if (result == MOJO_RESULT_SHOULD_WAIT) {
diff --git a/services/network/public/cpp/server/http_server_unittest.cc b/services/network/public/cpp/server/http_server_unittest.cc
index 96b04b7..080f32f 100644
--- a/services/network/public/cpp/server/http_server_unittest.cc
+++ b/services/network/public/cpp/server/http_server_unittest.cc
@@ -11,6 +11,7 @@
 
 #include "base/auto_reset.h"
 #include "base/bind.h"
+#include "base/format_macros.h"
 #include "base/location.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 05687c3..95e19f3 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -22416,5 +22416,2031 @@
         "swarming": {}
       }
     ]
+  },
+  "linux-xenial-rel": {
+    "gtest_tests": [
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "absl_hardening_tests",
+        "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "accessibility_unittests",
+        "test_id_prefix": "ninja://ui/accessibility:accessibility_unittests/"
+      },
+      {
+        "args": [
+          "angle_unittests"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_unittests",
+        "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/",
+        "use_isolated_scripts_api": true
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "app_shell_unittests",
+        "test_id_prefix": "ninja://extensions/shell:app_shell_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "aura_unittests",
+        "test_id_prefix": "ninja://ui/aura:aura_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "base_unittests",
+        "test_id_prefix": "ninja://base:base_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "base_util_unittests",
+        "test_id_prefix": "ninja://base/util:base_util_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_common_unittests",
+        "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_fuzzer_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_fuzzer_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_heap_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_platform_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "webkit_unit_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "blink_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "boringssl_crypto_tests",
+        "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "boringssl_ssl_tests",
+        "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 10
+        },
+        "test": "browser_tests",
+        "test_id_prefix": "ninja://chrome/test:browser_tests/"
+      },
+      {
+        "args": [
+          "--gtest_filter=-*UsingRealWebcam*"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "capture_unittests",
+        "test_id_prefix": "ninja://media/capture:capture_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "cast_unittests",
+        "test_id_prefix": "ninja://media/cast:cast_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "cc_unittests",
+        "test_id_prefix": "ninja://cc:cc_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "chrome_app_unittests",
+        "test_id_prefix": "ninja://chrome/test:chrome_app_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "chromedriver_unittests",
+        "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "color_unittests",
+        "test_id_prefix": "ninja://ui/color:color_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "components_browsertests",
+        "test_id_prefix": "ninja://components:components_browsertests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "components_unittests",
+        "test_id_prefix": "ninja://components:components_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "compositor_unittests",
+        "test_id_prefix": "ninja://ui/compositor:compositor_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 6
+        },
+        "test": "content_browsertests",
+        "test_id_prefix": "ninja://content/test:content_browsertests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "content_unittests",
+        "test_id_prefix": "ninja://content/test:content_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "crashpad_tests",
+        "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "cronet_tests",
+        "test_id_prefix": "ninja://components/cronet:cronet_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "cronet_unittests",
+        "test_id_prefix": "ninja://components/cronet:cronet_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "crypto_unittests",
+        "test_id_prefix": "ninja://crypto:crypto_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "dbus_unittests",
+        "test_id_prefix": "ninja://dbus:dbus_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "device_unittests",
+        "test_id_prefix": "ninja://device:device_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "display_unittests",
+        "test_id_prefix": "ninja://ui/display:display_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "events_unittests",
+        "test_id_prefix": "ninja://ui/events:events_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "extensions_browsertests",
+        "test_id_prefix": "ninja://extensions:extensions_browsertests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "extensions_unittests",
+        "test_id_prefix": "ninja://extensions:extensions_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "filesystem_service_unittests",
+        "test_id_prefix": "ninja://components/services/filesystem:filesystem_service_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gcm_unit_tests",
+        "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gfx_unittests",
+        "test_id_prefix": "ninja://ui/gfx:gfx_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gin_unittests",
+        "test_id_prefix": "ninja://gin:gin_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "google_apis_unittests",
+        "test_id_prefix": "ninja://google_apis:google_apis_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gpu_unittests",
+        "test_id_prefix": "ninja://gpu:gpu_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gtk_unittests",
+        "test_id_prefix": "ninja://ui/gtk:gtk_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gwp_asan_unittests",
+        "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "headless_browsertests",
+        "test_id_prefix": "ninja://headless:headless_browsertests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "headless_unittests",
+        "test_id_prefix": "ninja://headless:headless_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "interactive_ui_tests",
+        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ipc_tests",
+        "test_id_prefix": "ninja://ipc:ipc_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "jingle_unittests",
+        "test_id_prefix": "ninja://jingle:jingle_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "latency_unittests",
+        "test_id_prefix": "ninja://ui/latency:latency_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "libjingle_xmpp_unittests",
+        "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "liburlpattern_unittests",
+        "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "media_blink_unittests",
+        "test_id_prefix": "ninja://media/blink:media_blink_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "media_unittests",
+        "test_id_prefix": "ninja://media:media_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "message_center_unittests",
+        "test_id_prefix": "ninja://ui/message_center:message_center_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "midi_unittests",
+        "test_id_prefix": "ninja://media/midi:midi_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "mojo_core_unittests",
+        "test_id_prefix": "ninja://mojo/core:mojo_core_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "mojo_unittests",
+        "test_id_prefix": "ninja://mojo:mojo_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "nacl_helper_nonsfi_unittests",
+        "test_id_prefix": "ninja://components/nacl/loader:nacl_helper_nonsfi_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "nacl_loader_unittests",
+        "test_id_prefix": "ninja://components/nacl/loader:nacl_loader_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "native_theme_unittests",
+        "test_id_prefix": "ninja://ui/native_theme:native_theme_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "net_unittests",
+        "test_id_prefix": "ninja://net:net_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "openscreen_unittests",
+        "test_id_prefix": "ninja://chrome/browser/media/router:openscreen_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "pdf_unittests",
+        "test_id_prefix": "ninja://pdf:pdf_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "perfetto_unittests",
+        "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ppapi_unittests",
+        "test_id_prefix": "ninja://ppapi:ppapi_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "printing_unittests",
+        "test_id_prefix": "ninja://printing:printing_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "remoting_unittests",
+        "test_id_prefix": "ninja://remoting:remoting_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "sandbox_linux_unittests",
+        "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "service_manager_unittests",
+        "test_id_prefix": "ninja://services/service_manager/tests:service_manager_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "services_unittests",
+        "test_id_prefix": "ninja://services:services_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "shell_dialogs_unittests",
+        "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "skia_unittests",
+        "test_id_prefix": "ninja://skia:skia_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "snapshot_unittests",
+        "test_id_prefix": "ninja://ui/snapshot:snapshot_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "sql_unittests",
+        "test_id_prefix": "ninja://sql:sql_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "storage_unittests",
+        "test_id_prefix": "ninja://storage:storage_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "sync_integration_tests",
+        "test_id_prefix": "ninja://chrome/test:sync_integration_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "traffic_annotation_auditor_unittests",
+        "test_id_prefix": "ninja://tools/traffic_annotation/auditor:traffic_annotation_auditor_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ui_base_unittests",
+        "test_id_prefix": "ninja://ui/base:ui_base_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "ui_touch_selection_unittests",
+        "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "unit_tests",
+        "test_id_prefix": "ninja://chrome/test:unit_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "url_unittests",
+        "test_id_prefix": "ninja://url:url_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "views_unittests",
+        "test_id_prefix": "ninja://ui/views:views_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "viz_unittests",
+        "test_id_prefix": "ninja://components/viz:viz_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "vr_common_unittests",
+        "test_id_prefix": "ninja://chrome/browser/vr:vr_common_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "vr_pixeltests",
+        "test_id_prefix": "ninja://chrome/browser/vr:vr_pixeltests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "weblayer_browsertests",
+        "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "weblayer_unittests",
+        "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "wm_unittests",
+        "test_id_prefix": "ninja://ui/wm:wm_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "wtf_unittests",
+        "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "x11_unittests",
+        "test_id_prefix": "ninja://ui/platform_window/x11:x11_unittests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "xr_browser_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "xr_browser_tests",
+        "test_id_prefix": "ninja://chrome/test:xr_browser_tests/"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "zlib_unittests",
+        "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/"
+      }
+    ],
+    "isolated_scripts": [
+      {
+        "isolate_name": "blink_python_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "blink_python_tests",
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://:blink_python_tests/"
+      },
+      {
+        "args": [
+          "--num-retries=3",
+          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw"
+        ],
+        "isolate_name": "blink_web_tests",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "blink_web_tests",
+        "resultdb": {
+          "enable": true
+        },
+        "results_handler": "layout tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 12
+        },
+        "test_id_prefix": "ninja://:blink_web_tests/"
+      },
+      {
+        "args": [
+          "--test-type=integration"
+        ],
+        "isolate_name": "chromedriver_py_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "chromedriver_py_tests",
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_py_tests/"
+      },
+      {
+        "isolate_name": "chromedriver_replay_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "chromedriver_replay_unittests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_replay_unittests/"
+      },
+      {
+        "isolate_name": "content_shell_crash_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "content_shell_crash_test",
+        "resultdb": {
+          "enable": true,
+          "result_format": "single"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://content/shell:content_shell_crash_test/"
+      },
+      {
+        "isolate_name": "flatbuffers_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "flatbuffers_unittests",
+        "resultdb": {
+          "enable": true,
+          "result_format": "single"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://third_party/flatbuffers:flatbuffers_unittests/"
+      },
+      {
+        "isolate_name": "grit_python_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "grit_python_unittests",
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://tools/grit:grit_python_unittests/"
+      },
+      {
+        "isolate_name": "metrics_python_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "metrics_python_tests",
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://tools/metrics:metrics_python_tests/"
+      },
+      {
+        "isolate_name": "mojo_python_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "mojo_python_unittests",
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://mojo/public/tools:mojo_python_unittests/"
+      },
+      {
+        "args": [
+          "--num-retries=3",
+          "--additional-driver-flag=--disable-features=UseSkiaRenderer",
+          "--skipped=always",
+          "--fuzzy-diff",
+          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter"
+        ],
+        "isolate_name": "blink_web_tests",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "non_skia_renderer_swiftshader_blink_web_tests",
+        "resultdb": {
+          "enable": true
+        },
+        "results_handler": "layout tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://:blink_web_tests/"
+      },
+      {
+        "args": [
+          "--additional-driver-flag",
+          "--disable-site-isolation-trials",
+          "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials",
+          "--num-retries=3",
+          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw"
+        ],
+        "isolate_name": "blink_web_tests",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "not_site_per_process_blink_web_tests",
+        "resultdb": {
+          "enable": true
+        },
+        "results_handler": "layout tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 10
+        },
+        "test_id_prefix": "ninja://:blink_web_tests/"
+      },
+      {
+        "isolate_name": "telemetry_gpu_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "telemetry_gpu_unittests",
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_unittests/"
+      },
+      {
+        "args": [
+          "--extra-browser-args=--enable-crashpad",
+          "--xvfb",
+          "--jobs=1"
+        ],
+        "isolate_name": "telemetry_perf_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "telemetry_perf_unittests",
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 12
+        },
+        "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/"
+      },
+      {
+        "args": [
+          "--jobs=1",
+          "--extra-browser-args=--disable-gpu"
+        ],
+        "isolate_name": "telemetry_unittests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "telemetry_unittests",
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 8
+        },
+        "test_id_prefix": "ninja://chrome/test:telemetry_unittests/"
+      },
+      {
+        "args": [
+          "--gtest-benchmark-name=views_perftests"
+        ],
+        "isolate_name": "views_perftests",
+        "merge": {
+          "args": [
+            "--smoke-test-mode"
+          ],
+          "script": "//tools/perf/process_perf_results.py"
+        },
+        "name": "views_perftests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://ui/views:views_perftests/"
+      },
+      {
+        "args": [
+          "--num-retries=3",
+          "--additional-driver-flag=--enable-gpu-rasterization",
+          "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan",
+          "--additional-driver-flag=--enable-oop-rasterization",
+          "--additional-driver-flag=--use-vulkan=swiftshader",
+          "--additional-driver-flag=--disable-vulkan-fallback-to-gl-for-testing",
+          "--fuzzy-diff",
+          "--skipped=always",
+          "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter",
+          "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer",
+          "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/enable-gpu-rasterization",
+          "--additional-expectations=../../third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader"
+        ],
+        "isolate_name": "blink_web_tests",
+        "merge": {
+          "args": [
+            "--verbose"
+          ],
+          "script": "//third_party/blink/tools/merge_web_test_results.py"
+        },
+        "name": "vulkan_swiftshader_blink_web_tests",
+        "resultdb": {
+          "enable": true
+        },
+        "results_handler": "layout tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://:blink_web_tests/"
+      }
+    ],
+    "scripts": [
+      {
+        "name": "check_static_initializers",
+        "script": "check_static_initializers.py",
+        "swarming": {}
+      },
+      {
+        "name": "checkdeps",
+        "script": "checkdeps.py",
+        "swarming": {}
+      },
+      {
+        "name": "checkperms",
+        "script": "checkperms.py",
+        "swarming": {}
+      },
+      {
+        "name": "headless_python_unittests",
+        "script": "headless_python_unittests.py",
+        "swarming": {}
+      },
+      {
+        "name": "webkit_lint",
+        "script": "blink_lint_expectations.py",
+        "swarming": {}
+      }
+    ]
   }
 }
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 9e303ad..b2491c7e 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -467,6 +467,11 @@
           '--additional-driver-flag=--enable-blink-features=EditingNG',
         ],
       },
+      'linux-xenial-rel': {
+        "args": [
+          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw",
+        ],
+      },
       'mac10.12-blink-rel-dummy': {
         'swarming': {
           'shards': 20,
@@ -2203,6 +2208,11 @@
           'shards': 20,
         },
       },
+      'linux-xenial-rel': {
+        "args": [
+          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw",
+        ],
+      },
     },
   },
   'notification_helper_unittests': {
@@ -2709,6 +2719,12 @@
           '--jobs=1',
         ],
       },
+      'linux-xenial-rel': {
+        'args': [
+          '--xvfb',
+          '--jobs=1',
+        ],
+      },
     },
     'remove_from': [
       'android-marshmallow-x86-rel-non-cq', # crbug.com/1084352
@@ -2947,6 +2963,7 @@
   'webdriver_tests_suite': {
     'remove_from': [
       'Linux Tests',  # https://crbug.com/929689, https://crbug.com/936557
+      'linux-xenial-rel',
     ],
   },
   'webgl2_conformance_gl_passthrough_tests': {
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 03c84b1..5496b9f 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -5074,6 +5074,16 @@
           'scripts': 'chromium_linux_scripts',
         },
       },
+      'linux-xenial-rel': {
+        'mixins': [
+          'linux-xenial',
+        ],
+        'test_suites': {
+          'gtest_tests': 'chromium_linux_gtests',
+          'isolated_scripts': 'chromium_linux_rel_isolated_scripts',
+          'scripts': 'chromium_linux_scripts',
+        },
+      },
     },
   },
   {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 928169c..c9f788f 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -4422,6 +4422,21 @@
             ]
         }
     ],
+    "NotificationsViaHelperApp": [
+        {
+            "platforms": [
+                "mac"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "NotificationsViaHelperApp"
+                    ]
+                }
+            ]
+        }
+    ],
     "NtpRepeatableQueriesDesktop": [
         {
             "platforms": [
@@ -4636,7 +4651,6 @@
                         "OmniboxShortBookmarkSuggestionsByTotalInputLength",
                         "OmniboxTrendingZeroPrefixSuggestionsOnNTP",
                         "OmniboxUIExperimentMaxAutocompleteMatches",
-                        "QueryInOmnibox",
                         "SearchSuggestChips"
                     ]
                 }
diff --git a/third_party/blink/public/mojom/conversions/conversions.mojom b/third_party/blink/public/mojom/conversions/conversions.mojom
index 4a9864e..989454f1 100644
--- a/third_party/blink/public/mojom/conversions/conversions.mojom
+++ b/third_party/blink/public/mojom/conversions/conversions.mojom
@@ -14,6 +14,10 @@
   // Conversion data specified in conversion redirect. 0 is used as a
   // default if none is provided.
   uint64 conversion_data = 0;
+
+  // Event source trigger data specified in conversion redirect. 0 is used as a
+  // default if none is provided.
+  uint64 event_source_trigger_data = 0;
 };
 
 // Mojo struct to represent blink::Impression native struct.
diff --git a/third_party/blink/renderer/core/animation/animation.h b/third_party/blink/renderer/core/animation/animation.h
index 234ddbf..28279f1 100644
--- a/third_party/blink/renderer/core/animation/animation.h
+++ b/third_party/blink/renderer/core/animation/animation.h
@@ -282,7 +282,7 @@
 
   void Trace(Visitor*) const override;
 
-  bool CompositorPendingForTesting() const { return compositor_pending_; }
+  bool CompositorPending() const { return compositor_pending_; }
 
   // Methods for handling removal and persistence of animations.
   bool IsReplaceable();
diff --git a/third_party/blink/renderer/core/animation/animation_test.cc b/third_party/blink/renderer/core/animation/animation_test.cc
index cc3046b..df9ab24 100644
--- a/third_party/blink/renderer/core/animation/animation_test.cc
+++ b/third_party/blink/renderer/core/animation/animation_test.cc
@@ -1308,7 +1308,7 @@
   // At this point, the animation exists on both the compositor and blink side,
   // but no start time has arrived on either side. The compositor is currently
   // synced, no update is pending.
-  EXPECT_FALSE(animation->CompositorPendingForTesting());
+  EXPECT_FALSE(animation->CompositorPending());
 
   // However, if we pause the animation then the compositor should still be
   // marked pending. This is required because otherwise the compositor will go
@@ -1316,7 +1316,7 @@
   // on the next compositor frame).
   animation->pause();
 
-  EXPECT_TRUE(animation->CompositorPendingForTesting());
+  EXPECT_TRUE(animation->CompositorPending());
 }
 
 TEST_F(AnimationAnimationTestCompositing, PreCommitWithUnresolvedStartTimes) {
@@ -1325,7 +1325,7 @@
   // At this point, the animation exists on both the compositor and blink side,
   // but no start time has arrived on either side. The compositor is currently
   // synced, no update is pending.
-  EXPECT_FALSE(animation->CompositorPendingForTesting());
+  EXPECT_FALSE(animation->CompositorPending());
 
   // At this point, a call to PreCommit should bail out and tell us to wait for
   // next commit because there are no resolved start times.
@@ -1432,7 +1432,7 @@
   // At this point, the animation exists on both the compositor and blink side,
   // but no start time has arrived on either side. The compositor is currently
   // synced, no update is pending.
-  EXPECT_FALSE(animation->CompositorPendingForTesting());
+  EXPECT_FALSE(animation->CompositorPending());
 
   // Now change the keyframes; this should mark the animation as compositor
   // pending as we need to sync the compositor side.
@@ -1453,7 +1453,7 @@
 
   To<KeyframeEffect>(animation->effect())->SetKeyframes(keyframes);
 
-  EXPECT_TRUE(animation->CompositorPendingForTesting());
+  EXPECT_TRUE(animation->CompositorPending());
 }
 
 // crbug.com/1057076
diff --git a/third_party/blink/renderer/core/animation/element_animations.cc b/third_party/blink/renderer/core/animation/element_animations.cc
index 7c0619a6..450887c3 100644
--- a/third_party/blink/renderer/core/animation/element_animations.cc
+++ b/third_party/blink/renderer/core/animation/element_animations.cc
@@ -71,6 +71,15 @@
     if (!effect.IsCurrent())
       continue;
     UpdateAnimationFlagsForEffect(effect, style);
+
+    // This animation animates background-color and some input of the animation
+    // is changed compared with the previous frame, so trigger a repaint.
+    if (RuntimeEnabledFeatures::CompositeBGColorAnimationEnabled() &&
+        animation.CalculateAnimationPlayState() != Animation::kIdle &&
+        effect.Affects(PropertyHandle(GetCSSPropertyBackgroundColor())) &&
+        animation.CompositorPending()) {
+      style.SetCompositablePaintAnimationChanged(true);
+    }
   }
 
   for (const auto& entry : worklet_animations_) {
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index b856cc6..540b32130 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -382,12 +382,6 @@
 }
 
 WebMediaPlayer::SurfaceLayerMode GetVideoSurfaceLayerMode() {
-#if defined(OS_ANDROID)
-  if (base::FeatureList::IsEnabled(media::kDisableSurfaceLayerForVideo) &&
-      !::features::IsUsingVizForWebView())
-    return WebMediaPlayer::SurfaceLayerMode::kNever;
-#endif  // OS_ANDROID
-
   return WebMediaPlayer::SurfaceLayerMode::kAlways;
 }
 
diff --git a/third_party/blink/renderer/core/input/gesture_manager.cc b/third_party/blink/renderer/core/input/gesture_manager.cc
index ba6175ac..c964647 100644
--- a/third_party/blink/renderer/core/input/gesture_manager.cc
+++ b/third_party/blink/renderer/core/input/gesture_manager.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/core/input/gesture_manager.h"
 
-#include "build/build_config.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/public/public_buildflags.h"
 #include "third_party/blink/renderer/core/dom/document.h"
@@ -22,6 +21,7 @@
 #include "third_party/blink/renderer/core/input/input_device_capabilities.h"
 #include "third_party/blink/renderer/core/page/chrome_client.h"
 #include "third_party/blink/renderer/core/page/page.h"
+#include "third_party/blink/renderer/core/page/scrolling/text_fragment_handler.h"
 #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
 #include "third_party/blink/renderer/core/scroll/scroll_animator_base.h"
 
@@ -334,6 +334,13 @@
     ShowUnhandledTapUIIfNeeded(dom_tree_changed, style_changed, tapped_node,
                                tapped_element, tapped_position_in_viewport);
   }
+  if (RuntimeEnabledFeatures::TextFragmentTapOpensContextMenuEnabled() &&
+      TextFragmentHandler::IsOverTextFragment(current_hit_test)) {
+    if (event_result == WebInputEventResult::kNotHandled) {
+      return SendContextMenuEventForGesture(targeted_event);
+    }
+  }
+
   return event_result;
 }
 
diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object.h b/third_party/blink/renderer/core/layout/layout_box_model_object.h
index 7859c18..efabb1f 100644
--- a/third_party/blink/renderer/core/layout/layout_box_model_object.h
+++ b/third_party/blink/renderer/core/layout/layout_box_model_object.h
@@ -451,13 +451,13 @@
     NOT_DESTROYED();
     return PhysicalMarginToLogical(other_style).End();
   }
-  LayoutUnit MarginLineLeft() const {
+  LayoutUnit MarginLineLeft(const ComputedStyle* other_style = nullptr) const {
     NOT_DESTROYED();
-    return PhysicalMarginToLogical(nullptr).LineLeft();
+    return PhysicalMarginToLogical(other_style).LineLeft();
   }
-  LayoutUnit MarginLineRight() const {
+  LayoutUnit MarginLineRight(const ComputedStyle* other_style = nullptr) const {
     NOT_DESTROYED();
-    return PhysicalMarginToLogical(nullptr).LineRight();
+    return PhysicalMarginToLogical(other_style).LineRight();
   }
   LayoutUnit MarginOver() const {
     NOT_DESTROYED();
diff --git a/third_party/blink/renderer/core/layout/layout_grid.cc b/third_party/blink/renderer/core/layout/layout_grid.cc
index eccf1f3..ead4acb4 100644
--- a/third_party/blink/renderer/core/layout/layout_grid.cc
+++ b/third_party/blink/renderer/core/layout/layout_grid.cc
@@ -2237,7 +2237,7 @@
       is_flowaware_row_axis ? child.LogicalLeft() : child.LogicalTop();
   LayoutUnit grid_border = is_row_axis ? BorderLogicalLeft() : BorderBefore();
   LayoutUnit child_margin =
-      is_flowaware_row_axis ? child.MarginLineLeft() : child.MarginBefore();
+      is_row_axis ? child.MarginLineLeft(Style()) : child.MarginBefore(Style());
   LayoutUnit offset = child_position - grid_border - child_margin;
   if (!is_row_axis || StyleRef().IsLeftToRightDirection())
     return offset;
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
index 0de5bfe..a2fa221 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
@@ -860,6 +860,7 @@
   mojom::blink::ConversionPtr conversion = mojom::blink::Conversion::New();
   conversion->reporting_origin = SecurityOrigin::Create(url);
   conversion->conversion_data = 0UL;
+  conversion->event_source_trigger_data = 0UL;
 
   const char kConversionDataParam[] = "conversion-data";
   URLSearchParams* search_params = URLSearchParams::Create(url.Query());
@@ -871,6 +872,17 @@
     // Default invalid params to 0.
     conversion->conversion_data = is_valid_integer ? data : 0UL;
   }
+  // Defaulting to 0 means that it is not possible to selectively convert only
+  // event sources or navigation sources.
+  const char kEventSourceTriggerDataParam[] = "event-source-trigger-data";
+  if (search_params->has(kEventSourceTriggerDataParam)) {
+    bool is_valid_integer = false;
+    uint64_t data = search_params->get(kEventSourceTriggerDataParam)
+                        .ToUInt64Strict(&is_valid_integer);
+
+    // Default invalid params to 0.
+    conversion->event_source_trigger_data = is_valid_integer ? data : 0UL;
+  }
 
   mojo::AssociatedRemote<mojom::blink::ConversionHost> conversion_host;
   GetFrame()->GetRemoteNavigationAssociatedInterfaces()->GetInterface(
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.cc b/third_party/blink/renderer/core/page/context_menu_controller.cc
index 7fa13fc..4cc6423 100644
--- a/third_party/blink/renderer/core/page/context_menu_controller.cc
+++ b/third_party/blink/renderer/core/page/context_menu_controller.cc
@@ -403,7 +403,8 @@
          !data.link_url.is_empty() ||
          data.media_type == mojom::blink::ContextMenuDataMediaType::kImage ||
          data.media_type == mojom::blink::ContextMenuDataMediaType::kVideo ||
-         data.is_editable || !data.selected_text.empty();
+         data.is_editable || data.opened_from_highlight ||
+         !data.selected_text.empty();
 }
 
 bool ContextMenuController::ShowContextMenu(LocalFrame* frame,
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc
index 186e55bc..7587b04 100644
--- a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc
+++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_test.cc
@@ -8,8 +8,12 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/input/web_menu_source_type.h"
 #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
+#include "third_party/blink/renderer/bindings/core/v8/string_or_array_buffer_or_array_buffer_view.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_font_face_descriptors.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_mouse_event_init.h"
+#include "third_party/blink/renderer/core/css/font_face_set_document.h"
 #include "third_party/blink/renderer/core/dom/element.h"
+#include "third_party/blink/renderer/core/dom/range.h"
 #include "third_party/blink/renderer/core/editing/ephemeral_range.h"
 #include "third_party/blink/renderer/core/editing/frame_selection.h"
 #include "third_party/blink/renderer/core/editing/markers/document_marker_controller.h"
@@ -94,6 +98,23 @@
     event.SetFrameScale(1);
     GetDocument().GetFrame()->GetEventHandler().HandleGestureEvent(event);
   }
+
+  void LoadAhem() {
+    scoped_refptr<SharedBuffer> shared_buffer =
+        test::ReadFromFile(test::CoreTestDataPath("Ahem.ttf"));
+    StringOrArrayBufferOrArrayBufferView buffer =
+        StringOrArrayBufferOrArrayBufferView::FromArrayBuffer(
+            DOMArrayBuffer::Create(shared_buffer));
+    FontFace* ahem =
+        FontFace::Create(GetDocument().GetFrame()->DomWindow(), "Ahem", buffer,
+                         FontFaceDescriptors::Create());
+
+    ScriptState* script_state =
+        ToScriptStateForMainWorld(GetDocument().GetFrame());
+    DummyExceptionStateForTesting exception_state;
+    FontFaceSetDocument::From(GetDocument())
+        ->addForBinding(script_state, ahem, exception_state);
+  }
 };
 
 // Basic test case, ensure we scroll the matching text into view.
@@ -2360,6 +2381,76 @@
   EXPECT_FALSE(selection.SelectedText().IsEmpty());
 }
 
+// Test that on Android, a user can display a context menu by tapping on
+// a text fragment, when the TextFragmentTapOpensContextMenu
+// RuntimeEnabledFeature is enabled.
+TEST_F(TextFragmentAnchorTest, ShouldOpenContextMenuOnTap) {
+  base::test::ScopedFeatureList feature_list_;
+  feature_list_.InitAndEnableFeature(
+      shared_highlighting::kSharedHighlightingV2);
+  LoadAhem();
+  SimRequest request(
+      "https://example.com/"
+      "test.html#:~:text=this%20is%20a%20test%20page",
+      "text/html");
+  LoadURL(
+      "https://example.com/"
+      "test.html#:~:text=this%20is%20a%20test%20page");
+  request.Complete(R"HTML(
+    <!DOCTYPE html>
+    <style>p { font: 10px/1 Ahem; }</style>
+    <p id="first">This is a test page</p>
+    <p id="two">Second test page two</p>
+  )HTML");
+  RunAsyncMatchingTasks();
+  ContextMenuAllowedScope context_menu_allowed_scope;
+
+  Compositor().BeginFrame();
+
+  EXPECT_FALSE(GetDocument()
+                   .GetPage()
+                   ->GetContextMenuController()
+                   .ContextMenuNodeForFrame(GetDocument().GetFrame()));
+
+  Range* range = Range::Create(GetDocument());
+  range->setStart(GetDocument().getElementById("first"), 0,
+                  IGNORE_EXCEPTION_FOR_TESTING);
+  range->setEnd(GetDocument().getElementById("first"), 1,
+                IGNORE_EXCEPTION_FOR_TESTING);
+  ASSERT_EQ("This is a test page", range->GetText());
+
+  IntPoint tap_point = range->BoundingBox().Center();
+  SimulateTap(tap_point.X(), tap_point.Y());
+
+  if (RuntimeEnabledFeatures::TextFragmentTapOpensContextMenuEnabled()) {
+    EXPECT_TRUE(GetDocument()
+                    .GetPage()
+                    ->GetContextMenuController()
+                    .ContextMenuNodeForFrame(GetDocument().GetFrame()));
+  } else {
+    EXPECT_FALSE(GetDocument()
+                     .GetPage()
+                     ->GetContextMenuController()
+                     .ContextMenuNodeForFrame(GetDocument().GetFrame()));
+  }
+
+  GetDocument().GetPage()->GetContextMenuController().ClearContextMenu();
+
+  range->setStart(GetDocument().getElementById("two"), 0,
+                  IGNORE_EXCEPTION_FOR_TESTING);
+  range->setEndAfter(GetDocument().getElementById("two"),
+                     IGNORE_EXCEPTION_FOR_TESTING);
+  ASSERT_EQ("Second test page two", range->GetText());
+
+  tap_point = range->BoundingBox().Center();
+  SimulateTap(tap_point.X(), tap_point.Y());
+
+  EXPECT_FALSE(GetDocument()
+                   .GetPage()
+                   ->GetContextMenuController()
+                   .ContextMenuNodeForFrame(GetDocument().GetFrame()));
+}
+
 }  // namespace
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_handler.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_handler.cc
index 4d7f900..4bfbeb5 100644
--- a/third_party/blink/renderer/core/page/scrolling/text_fragment_handler.cc
+++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_handler.cc
@@ -52,6 +52,10 @@
 
 // static
 bool TextFragmentHandler::IsOverTextFragment(HitTestResult result) {
+  if (!result.InnerNode()) {
+    return false;
+  }
+
   DocumentMarkerController& marker_controller =
       result.InnerNodeFrame()->GetDocument()->Markers();
   PositionWithAffinity pos_with_affinity = result.GetPosition();
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc
index 5f105993..294fd1d 100644
--- a/third_party/blink/renderer/core/style/computed_style.cc
+++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -955,8 +955,10 @@
     diff.SetCompositingReasonsChanged();
   }
 
-  if (HasCurrentBackgroundColorAnimation() !=
-      other.HasCurrentBackgroundColorAnimation()) {
+  if (RuntimeEnabledFeatures::CompositeBGColorAnimationEnabled() &&
+      (HasCurrentBackgroundColorAnimation() !=
+           other.HasCurrentBackgroundColorAnimation() ||
+       CompositablePaintAnimationChanged())) {
     diff.SetCompositablePaintEffectChanged();
   }
 }
diff --git a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
index 00c5ece..f87b481 100644
--- a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
+++ b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
@@ -645,6 +645,13 @@
       default_value: "false",
     },
     {
+      name: "CompositablePaintAnimationChanged",
+      field_template: "primitive",
+      type_name: "bool",
+      field_group: "*",
+      default_value: "false",
+    },
+    {
       name: "IsRunningOpacityAnimationOnCompositor",
       field_template: "primitive",
       type_name: "bool",
diff --git a/third_party/blink/renderer/modules/csspaint/background_color_paint_worklet_test.cc b/third_party/blink/renderer/modules/csspaint/background_color_paint_worklet_test.cc
index 42e54cc..5091d6e5 100644
--- a/third_party/blink/renderer/modules/csspaint/background_color_paint_worklet_test.cc
+++ b/third_party/blink/renderer/modules/csspaint/background_color_paint_worklet_test.cc
@@ -12,8 +12,10 @@
 #include "third_party/blink/renderer/core/animation/keyframe_effect_model.h"
 #include "third_party/blink/renderer/core/animation/string_keyframe.h"
 #include "third_party/blink/renderer/core/animation/timing.h"
+#include "third_party/blink/renderer/core/css/resolver/style_resolver.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/frame/local_frame_view.h"
+#include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/core/testing/page_test_base.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/graphics/color.h"
@@ -243,6 +245,146 @@
       element, &animated_colors, &offsets, &progress));
 }
 
+// Test that style->CompositablePaintAnimationChanged() should be true in the
+// case where we initially have one background-color animation, and then changed
+// to have two background-color animation on the element.
+TEST_F(BackgroundColorPaintWorkletTest,
+       TriggerRepaintCompositedToNonComposited) {
+  ScopedCompositeBGColorAnimationForTest composite_bgcolor_animation(true);
+  SetBodyInnerHTML(R"HTML(
+    <div id ="target" style="width: 100px; height: 100px">
+    </div>
+  )HTML");
+
+  Timing timing;
+  timing.iteration_duration = AnimationTimeDelta::FromSecondsD(30);
+
+  CSSPropertyID property_id = CSSPropertyID::kBackgroundColor;
+  Persistent<StringKeyframe> start_keyframe =
+      MakeGarbageCollected<StringKeyframe>();
+  start_keyframe->SetCSSPropertyValue(
+      property_id, "red", SecureContextMode::kInsecureContext, nullptr);
+  Persistent<StringKeyframe> end_keyframe =
+      MakeGarbageCollected<StringKeyframe>();
+  end_keyframe->SetCSSPropertyValue(
+      property_id, "green", SecureContextMode::kInsecureContext, nullptr);
+
+  StringKeyframeVector keyframes;
+  keyframes.push_back(start_keyframe);
+  keyframes.push_back(end_keyframe);
+  auto* model1 = MakeGarbageCollected<StringKeyframeEffectModel>(keyframes);
+
+  Element* element = GetElementById("target");
+  ComputedStyle* style = GetDocument().GetStyleResolver().ResolveStyle(
+      element, StyleRecalcContext());
+  EXPECT_FALSE(style->HasCurrentBackgroundColorAnimation());
+
+  NonThrowableExceptionState exception_state;
+  DocumentTimeline* timeline =
+      MakeGarbageCollected<DocumentTimeline>(&GetDocument());
+  Animation* animation1 = Animation::Create(
+      MakeGarbageCollected<KeyframeEffect>(element, model1, timing), timeline,
+      exception_state);
+  animation1->play();
+  ASSERT_TRUE(element->GetElementAnimations());
+  EXPECT_EQ(element->GetElementAnimations()->Animations().size(), 1u);
+  element->GetElementAnimations()->UpdateAnimationFlags(*style);
+  // Previously no background-color animation, now it has. This should trigger
+  // a repaint, see ComputedStyle::UpdatePropertySpecificDifferences().
+  EXPECT_TRUE(style->HasCurrentBackgroundColorAnimation());
+  style->ResetHasCurrentBackgroundColorAnimation();
+  style->ResetCompositablePaintAnimationChanged();
+
+  start_keyframe->SetCSSPropertyValue(
+      property_id, "blue", SecureContextMode::kInsecureContext, nullptr);
+  end_keyframe->SetCSSPropertyValue(
+      property_id, "yellow", SecureContextMode::kInsecureContext, nullptr);
+  keyframes.clear();
+  keyframes.push_back(start_keyframe);
+  keyframes.push_back(end_keyframe);
+  auto* model2 = MakeGarbageCollected<StringKeyframeEffectModel>(keyframes);
+  Animation* animation2 = Animation::Create(
+      MakeGarbageCollected<KeyframeEffect>(element, model2, timing), timeline,
+      exception_state);
+  animation1->play();
+  animation2->play();
+
+  ASSERT_TRUE(element->GetElementAnimations());
+  EXPECT_EQ(element->GetElementAnimations()->Animations().size(), 2u);
+  element->GetElementAnimations()->UpdateAnimationFlags(*style);
+  EXPECT_TRUE(style->HasCurrentBackgroundColorAnimation());
+  // CompositablePaintAnimationChanged() being true will trigger a repaint. See
+  // ComputedStyle::UpdatePropertySpecificDifferences().
+  EXPECT_TRUE(style->CompositablePaintAnimationChanged());
+}
+
+// Test that style->CompositablePaintAnimationChanged() should be true in the
+// case where we initially have one background-color animation, and then we
+// changed one of the animation's keyframes.
+TEST_F(BackgroundColorPaintWorkletTest, TriggerRepaintChangedKeyframe) {
+  ScopedCompositeBGColorAnimationForTest composite_bgcolor_animation(true);
+  SetBodyInnerHTML(R"HTML(
+    <div id ="target" style="width: 100px; height: 100px">
+    </div>
+  )HTML");
+
+  Timing timing;
+  timing.iteration_duration = AnimationTimeDelta::FromSecondsD(30);
+
+  CSSPropertyID property_id = CSSPropertyID::kBackgroundColor;
+  Persistent<StringKeyframe> start_keyframe =
+      MakeGarbageCollected<StringKeyframe>();
+  start_keyframe->SetCSSPropertyValue(
+      property_id, "red", SecureContextMode::kInsecureContext, nullptr);
+  Persistent<StringKeyframe> end_keyframe =
+      MakeGarbageCollected<StringKeyframe>();
+  end_keyframe->SetCSSPropertyValue(
+      property_id, "green", SecureContextMode::kInsecureContext, nullptr);
+
+  StringKeyframeVector keyframes;
+  keyframes.push_back(start_keyframe);
+  keyframes.push_back(end_keyframe);
+  auto* model = MakeGarbageCollected<StringKeyframeEffectModel>(keyframes);
+
+  Element* element = GetElementById("target");
+  ComputedStyle* style = GetDocument().GetStyleResolver().ResolveStyle(
+      element, StyleRecalcContext());
+  EXPECT_FALSE(style->HasCurrentBackgroundColorAnimation());
+
+  NonThrowableExceptionState exception_state;
+  DocumentTimeline* timeline =
+      MakeGarbageCollected<DocumentTimeline>(&GetDocument());
+  Animation* animation = Animation::Create(
+      MakeGarbageCollected<KeyframeEffect>(element, model, timing), timeline,
+      exception_state);
+  animation->play();
+  ASSERT_TRUE(element->GetElementAnimations());
+  EXPECT_EQ(element->GetElementAnimations()->Animations().size(), 1u);
+  element->GetElementAnimations()->UpdateAnimationFlags(*style);
+  // Previously no background-color animation, now it has. This should trigger
+  // a repaint, see ComputedStyle::UpdatePropertySpecificDifferences().
+  EXPECT_TRUE(style->HasCurrentBackgroundColorAnimation());
+  style->ResetHasCurrentBackgroundColorAnimation();
+  style->ResetCompositablePaintAnimationChanged();
+
+  start_keyframe->SetCSSPropertyValue(
+      property_id, "red", SecureContextMode::kInsecureContext, nullptr);
+  end_keyframe->SetCSSPropertyValue(
+      property_id, "yellow", SecureContextMode::kInsecureContext, nullptr);
+  keyframes.clear();
+  keyframes.push_back(start_keyframe);
+  keyframes.push_back(end_keyframe);
+  animation->play();
+
+  ASSERT_TRUE(element->GetElementAnimations());
+  EXPECT_EQ(element->GetElementAnimations()->Animations().size(), 1u);
+  element->GetElementAnimations()->UpdateAnimationFlags(*style);
+  EXPECT_TRUE(style->HasCurrentBackgroundColorAnimation());
+  // CompositablePaintAnimationChanged() being true will trigger a repaint. See
+  // ComputedStyle::UpdatePropertySpecificDifferences().
+  EXPECT_TRUE(style->CompositablePaintAnimationChanged());
+}
+
 // Test that calling BackgroundColorPaintWorkletProxyClient::Paint won't crash
 // when the animated property value is empty.
 TEST_F(BackgroundColorPaintWorkletTest, ProxyClientPaintWithNoPropertyValue) {
diff --git a/third_party/blink/renderer/platform/disk_data_allocator.cc b/third_party/blink/renderer/platform/disk_data_allocator.cc
index ae2a1da0..abcd7fa6 100644
--- a/third_party/blink/renderer/platform/disk_data_allocator.cc
+++ b/third_party/blink/renderer/platform/disk_data_allocator.cc
@@ -200,7 +200,7 @@
 
 // static
 DiskDataAllocator& DiskDataAllocator::Instance() {
-  DEFINE_STATIC_LOCAL(DiskDataAllocator, instance, ());
+  DEFINE_THREAD_SAFE_STATIC_LOCAL(DiskDataAllocator, instance, ());
   return instance;
 }
 
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 4949d9c7..ce2e1d37 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2015,6 +2015,10 @@
       status: "stable",
     },
     {
+      name: "TextFragmentTapOpensContextMenu",
+      status: {"Android": "stable"},
+    },
+    {
       name: "ThirdPartyOriginTrials",
       status: "stable",
     },
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests
index 0228aee..b03835a 100644
--- a/third_party/blink/web_tests/SlowTests
+++ b/third_party/blink/web_tests/SlowTests
@@ -164,6 +164,7 @@
 crbug.com/1074122 http/tests/serviceworker/webexposed/global-interface-listing-service-worker.html [ Slow ]
 
 # SwiftShader slow tests
+crbug.com/726075 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-shadow.html [ Slow ]
 crbug.com/726075 [ Win ] css3/filters/effect-reference-zoom-hw.html [ Slow ]
 crbug.com/726075 [ Linux ] css3/filters/effect-reference-zoom-hw.html [ Slow ]
 crbug.com/726075 [ Mac ] css3/filters/effect-reference-zoom-hw.html [ Slow ]
@@ -752,15 +753,20 @@
 crbug.com/1195814 [ Mac11.0 ] external/wpt/file-system-access/local_FileSystemBaseHandle-IndexedDB-manual.https.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/file-system-access/sandboxed_FileSystemBaseHandle-IndexedDB.https.any.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/fire-error-event-exception.html [ Slow ]
+crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/get-databases.any.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/get-databases.any.worker.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/idb-explicit-commit.any.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/idb-explicit-commit.any.worker.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/idbindex_getAll.html [ Slow ]
+crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/idbindex_getAllKeys.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/idbindex-query-exception-order.html [ Slow ]
+crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/idbindex-rename-errors.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/idbindex_tombstones.any.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/idbindex_tombstones.any.worker.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/idbobjectstore_putall.tentative.any.html [ Slow ]
+crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/idbobjectstore_putall.tentative.any.worker.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/idbtransaction_objectStoreNames.html [ Slow ]
+crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/keygenerator-explicit.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/key-generators/reading-autoincrement-indexes.any.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/key-generators/reading-autoincrement-indexes.any.serviceworker.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/key-generators/reading-autoincrement-indexes.any.sharedworker.html [ Slow ]
@@ -770,3 +776,4 @@
 crbug.com/1195814 [ Mac11.0 ] external/wpt/IndexedDB/keypath-special-identifiers.htm [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] storage/indexeddb/dispatch-events.html [ Slow ]
 crbug.com/1195814 [ Mac11.0 ] storage/indexeddb/key-generator.html [ Slow ]
+crbug.com/1195814 [ Mac11.0 ] storage/indexeddb/odd-strings.html [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 5aeaf49..429303e 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2522,17 +2522,11 @@
 crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-206.xht [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
-crbug.com/626703 [ Linux ] external/wpt/uievents/idlharness.window.html [ Crash Failure ]
-crbug.com/626703 [ Mac10.14 ] external/wpt/html/dom/idlharness.https.html?exclude=(Document|Window|HTML.\*) [ Failure Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/content-security-policy/securitypolicyviolation/source-file-data-scheme.html [ Failure Timeout ]
-crbug.com/626703 [ Mac11.0 ] external/wpt/fetch/api/idlharness.any.serviceworker.html [ Failure Timeout ]
-crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc-encoded-transform/idlharness.https.window.html [ Failure Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/websockets/Create-blocked-port.any.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/websockets/Create-protocols-repeated-case-insensitive.any.html?wss [ Failure Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/websockets/basic-auth.any.worker.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/websockets/stream/tentative/backpressure-send.any.serviceworker.html?wpt_flags=h2 [ Failure Timeout ]
-crbug.com/626703 [ Mac11.0 ] virtual/plz-dedicated-worker/external/wpt/service-workers/idlharness.https.any.worker.html [ Failure Timeout ]
-crbug.com/626703 [ Mac11.0 ] virtual/shared_array_buffer_on_desktop/external/wpt/xhr/idlharness.any.worker.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-sizing/aspect-ratio/grid-aspect-ratio-020.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/service-workers/service-worker/fetch-event.https.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Close-2999-reason.any.worker.html?wpt_flags=h2 [ Failure Timeout ]
@@ -2541,9 +2535,7 @@
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Send-binary-65K-arraybuffer.any.worker.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Send-binary-arraybufferview-uint8-offset.any.worker.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/worklets/paint-worklet-credentials.https.html [ Failure Timeout ]
-crbug.com/626703 [ Mac10.14 ] external/wpt/xhr/idlharness.any.worker.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.14 ] inspector-protocol/debugger/wasm-streaming-url.js [ Failure Timeout ]
-crbug.com/626703 [ Mac10.14 ] virtual/shared_array_buffer_on_desktop/external/wpt/xhr/idlharness.any.sharedworker.html [ Failure Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/css/css-images/image-set/image-set-parsing.html [ Failure Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/dom/xslt/transformToFragment.tentative.window.html [ Failure Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/editing/other/editing-around-select-element.tentative.html?insertText [ Failure Timeout ]
@@ -2556,25 +2548,18 @@
 crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc-encoded-transform/script-write-twice-transform.https.html [ Failure Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/webrtc-encoded-transform/sframe-transform-buffer-source.html [ Failure Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/websockets/basic-auth.any.sharedworker.html?wpt_flags=h2 [ Failure Timeout ]
-crbug.com/626703 [ Mac11.0 ] external/wpt/webusb/idlharness.https.any.worker.html [ Failure Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/webvtt/api/VTTCue/constructor.html [ Failure Timeout ]
-crbug.com/626703 [ Mac11.0 ] virtual/plz-dedicated-worker/external/wpt/service-workers/idlharness.https.any.sharedworker.html [ Failure Timeout ]
-crbug.com/626703 [ Mac11.0 ] virtual/plz-dedicated-worker/external/wpt/xhr/idlharness.any.sharedworker.html [ Failure Timeout ]
 crbug.com/626703 [ Mac11.0 ] virtual/synchronous_html_parser/external/wpt/dom/xslt/transformToFragment.tentative.window.html [ Failure Timeout ]
-crbug.com/626703 [ Mac10.13 ] external/wpt/css/css-paint-api/idlharness.html [ Failure ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/websockets/Close-1000-reason.any.worker.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/websockets/Close-1000-verify-code.any.worker.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/websockets/Close-1005-verify-code.any.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/websockets/Close-1005.any.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/websockets/Close-Reason-124Bytes.any.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/websockets/Send-data.any.worker.html?wpt_flags=h2 [ Timeout ]
-crbug.com/626703 [ Mac10.14 ] external/wpt/html/dom/idlharness.https.html?include=(Document|Window) [ Failure ]
-crbug.com/626703 [ Mac10.14 ] external/wpt/mst-content-hint/idlharness.window.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Send-binary-arraybufferview-float32.any.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Send-binary-arraybufferview-uint16-offset-length.any.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Send-binary-arraybufferview-uint8-offset.any.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/binaryType-wrong-value.any.worker.html?wpt_flags=h2 [ Timeout ]
-crbug.com/626703 [ Mac10.14 ] virtual/layout_ng_svg_text/external/wpt/svg/idlharness.window.html [ Failure ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/websockets/Close-Reason-124Bytes.any.worker.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/websockets/stream/tentative/backpressure-send.any.worker.html?wpt_flags=h2 [ Failure Crash ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/websockets/Close-1005.any.worker.html?wpt_flags=h2 [ Timeout ]
@@ -2587,10 +2572,6 @@
 crbug.com/626703 [ Mac11.0 ] external/wpt/websockets/Close-undefined.any.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/websockets/stream/tentative/backpressure-send.any.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/websockets/stream/tentative/backpressure-receive.any.html?wpt_flags=h2 [ Pass Failure ]
-crbug.com/626703 [ Mac10.14 ] external/wpt/animation-worklet/idlharness.any.worker.html [ Failure Timeout ]
-crbug.com/626703 [ Mac10.14 ] external/wpt/badging/idlharness.https.any.worker.html [ Timeout Failure ]
-crbug.com/626703 [ Mac10.14 ] external/wpt/dom/idlharness.window.html?exclude=Node [ Timeout Failure ]
-crbug.com/626703 [ Mac10.14 ] external/wpt/media-source/idlharness.window.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Close-1005-verify-code.any.worker.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Close-2999-reason.any.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Send-0byte-data.any.worker.html?wpt_flags=h2 [ Timeout ]
@@ -2602,49 +2583,23 @@
 crbug.com/626703 [ Mac11.0 ] external/wpt/websockets/Create-valid-url-protocol.any.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/worklets/audio-worklet-credentials.https.html [ Failure Crash ]
 crbug.com/626703 [ Win10 ] external/wpt/worklets/audio-worklet-credentials.https.html [ Failure Crash ]
-crbug.com/626703 [ Mac10.15 ] virtual/scroll-unification-synchronous_html_parser/external/wpt/dom/idlharness.any.sharedworker.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] virtual/scroll-unification-synchronous_html_parser/external/wpt/dom/idlharness.any.sharedworker.html [ Failure Crash ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/ua-client-hints/idlharness.https.any.worker.html [ Failure Timeout ]
-crbug.com/626703 [ Win ] external/wpt/ua-client-hints/idlharness.https.any.worker.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol.https.html [ Failure Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol.https.html [ Failure Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/fetch/api/idlharness.any.serviceworker.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] external/wpt/fetch/api/idlharness.any.serviceworker.html [ Failure Crash ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/payment-handler/idlharness.https.any.sharedworker.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] external/wpt/payment-handler/idlharness.https.any.sharedworker.html [ Failure Crash ]
-crbug.com/626703 [ Mac10.15 ] virtual/plz-dedicated-worker/external/wpt/service-workers/idlharness.https.any.sharedworker.html [ Failure Timeout ]
-crbug.com/626703 [ Win10 ] virtual/plz-dedicated-worker/external/wpt/service-workers/idlharness.https.any.sharedworker.html [ Failure Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/badging/idlharness.https.any.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] external/wpt/badging/idlharness.https.any.html [ Failure Crash ]
-crbug.com/626703 [ Mac10.15 ] virtual/plz-service-worker/external/wpt/service-workers/idlharness.https.any.worker.html [ Failure Timeout ]
-crbug.com/626703 [ Win10 ] virtual/plz-service-worker/external/wpt/service-workers/idlharness.https.any.worker.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/websockets/stream/tentative/constructor.any.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 [ Win ] external/wpt/websockets/stream/tentative/constructor.any.html?wpt_flags=h2 [ Failure Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/media-source/idlharness.window.html [ Failure Timeout ]
-crbug.com/626703 [ Win ] external/wpt/media-source/idlharness.window.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/websockets/Create-url-with-space.any.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/websockets/Create-url-with-space.any.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 [ Win ] external/wpt/websockets/stream/tentative/backpressure-send.any.html?wpt_flags=h2 [ Failure Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/storage/idlharness.https.any.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] external/wpt/storage/idlharness.https.any.html [ Failure Crash ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/svg/idlharness.window.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] external/wpt/svg/idlharness.window.html [ Failure Crash ]
-crbug.com/626703 [ Mac10.15 ] virtual/layout_ng_svg_text/external/wpt/svg/idlharness.window.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] virtual/layout_ng_svg_text/external/wpt/svg/idlharness.window.html [ Failure Crash ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/websockets/Create-protocols-repeated-case-insensitive.any.worker.html?wss [ Failure Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/websockets/Create-protocols-repeated-case-insensitive.any.worker.html?wss [ Failure Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/websockets/basic-auth.any.sharedworker.html?wpt_flags=h2 [ Failure Crash Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/websockets/basic-auth.any.sharedworker.html?wpt_flags=h2 [ Failure Crash Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/touch-events/idlharness.window.html [ Failure Timeout ]
-crbug.com/626703 [ Win10 ] external/wpt/touch-events/idlharness.window.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/websockets/stream/tentative/abort.any.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/websockets/stream/tentative/abort.any.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/webrtc-encoded-transform/script-metadata-transform.https.html [ Failure Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/webrtc-encoded-transform/script-metadata-transform.https.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/fetch/api/basic/request-upload.any.serviceworker.html [ Failure Crash Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/fetch/api/basic/request-upload.any.serviceworker.html [ Failure Crash Timeout ]
-crbug.com/626703 [ Mac10.15 ] virtual/threaded/external/wpt/animation-worklet/idlharness.any.worker.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] virtual/threaded/external/wpt/animation-worklet/idlharness.any.worker.html [ Failure Crash ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/editing/other/editing-around-select-element.tentative.html?insertText [ Failure Crash Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/editing/other/editing-around-select-element.tentative.html?insertText [ Failure Crash Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/fetch/api/basic/request-upload.any.html [ Failure Crash ]
@@ -2655,41 +2610,16 @@
 crbug.com/626703 [ Win ] external/wpt/custom-elements/form-associated/ElementInternals-setFormValue.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/html/browsers/sandboxing/window-open-blank-from-different-initiator.html [ Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/html/browsers/sandboxing/window-open-blank-from-different-initiator.html [ Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/origin-policy/idlharness.any.worker.html [ Failure Timeout ]
-crbug.com/626703 [ Win10 ] external/wpt/origin-policy/idlharness.any.worker.html [ Failure Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/storage/idlharness.https.any.worker.html [ Failure Timeout ]
-crbug.com/626703 [ Win10 ] external/wpt/storage/idlharness.https.any.worker.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/websockets/Close-reason-unpaired-surrogates.any.worker.html?wpt_flags=h2 [ Timeout ]
-crbug.com/626703 [ Mac10.15 ] virtual/threaded/external/wpt/animation-worklet/idlharness.any.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] virtual/threaded/external/wpt/animation-worklet/idlharness.any.html [ Failure Crash ]
-crbug.com/626703 [ Mac10.13 ] external/wpt/websockets/Send-binary-blob.any.worker.html?wpt_flags=h2 [ Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/ua-client-hints/idlharness.https.any.html [ Failure Crash Timeout ]
-crbug.com/626703 [ Win10 ] external/wpt/ua-client-hints/idlharness.https.any.html [ Failure Crash Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/fetch/api/basic/request-upload.any.sharedworker.html [ Failure Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/fetch/api/basic/request-upload.any.sharedworker.html [ Failure Timeout ]
-crbug.com/626703 [ Mac10.15 ] virtual/plz-service-worker/external/wpt/service-workers/idlharness.https.any.serviceworker.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] virtual/plz-service-worker/external/wpt/service-workers/idlharness.https.any.serviceworker.html [ Failure Crash ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/input-device-capabilities/idlharness.window.html [ Failure Timeout ]
-crbug.com/626703 [ Win10 ] external/wpt/input-device-capabilities/idlharness.window.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/websockets/Create-valid-url-protocol.any.html?wpt_flags=h2 [ Timeout ]
-crbug.com/626703 [ Mac10.15 ] virtual/scroll-unification-synchronous_html_parser/external/wpt/dom/idlharness.any.serviceworker.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] virtual/scroll-unification-synchronous_html_parser/external/wpt/dom/idlharness.any.serviceworker.html [ Failure Crash ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/mediacapture-image/MediaStreamTrack-getConstraints.https.html [ Failure Crash Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/mediacapture-image/MediaStreamTrack-getConstraints.https.html [ Failure Crash Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/webrtc-identity/idlharness.https.window.html [ Failure Crash Timeout ]
-crbug.com/626703 [ Win10 ] external/wpt/webrtc-identity/idlharness.https.window.html [ Failure Crash Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/fetch/api/idlharness.any.worker.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] external/wpt/fetch/api/idlharness.any.worker.html [ Failure Crash ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/periodic-background-sync/idlharness.https.any.html [ Failure Crash ]
-crbug.com/626703 [ Win ] external/wpt/periodic-background-sync/idlharness.https.any.html [ Failure Crash ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/webvtt/api/VTTCue/constructor.html [ Failure Crash ]
 crbug.com/626703 [ Win10 ] external/wpt/webvtt/api/VTTCue/constructor.html [ Failure Crash ]
-crbug.com/626703 [ Mac10.15 ] virtual/plz-dedicated-worker/external/wpt/fetch/api/idlharness.any.serviceworker.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] virtual/plz-dedicated-worker/external/wpt/fetch/api/idlharness.any.serviceworker.html [ Failure Crash ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/worklets/layout-worklet-credentials.https.html [ Failure Crash Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/worklets/layout-worklet-credentials.https.html [ Failure Crash Timeout ]
-crbug.com/626703 [ Mac ] virtual/threaded-prefer-compositing/external/wpt/css/cssom-view/idlharness.html [ Pass Failure Crash ]
-crbug.com/626703 [ Win10 ] virtual/threaded-prefer-compositing/external/wpt/css/cssom-view/idlharness.html [ Failure Crash ]
 crbug.com/626703 [ Mac ] external/wpt/websockets/Close-4999-reason.any.html?wpt_flags=h2 [ Pass Timeout ]
 crbug.com/626703 [ Mac ] external/wpt/websockets/Send-binary-arraybufferview-float64.any.worker.html?wpt_flags=h2 [ Pass Timeout ]
 crbug.com/626703 [ Win ] external/wpt/websockets/Send-binary-arraybufferview-float64.any.worker.html?wpt_flags=h2 [ Timeout ]
@@ -2697,13 +2627,9 @@
 crbug.com/626703 [ Win ] external/wpt/websockets/Send-binary-arraybufferview-int8.any.worker.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/dom/xslt/transformToFragment.tentative.window.html [ Failure Crash ]
 crbug.com/626703 [ Win10 ] external/wpt/dom/xslt/transformToFragment.tentative.window.html [ Failure Crash ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/badging/idlharness.https.any.worker.html [ Failure Crash ]
-crbug.com/626703 [ Win10 ] external/wpt/badging/idlharness.https.any.worker.html [ Failure Crash ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Close-1000-verify-code.any.html?wpt_flags=h2 [ Timeout ]
-crbug.com/626703 [ Mac10.15 ] virtual/restrict-gamepad/external/wpt/gamepad/idlharness.https.window.html [ Failure Crash ]
 crbug.com/626703 external/wpt/webrtc-encoded-transform/script-transform.https.html [ Pass Failure Crash Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/shadow-dom/accesskey.tentative.html [ Failure Timeout ]
-crbug.com/626703 [ Mac10.15 ] virtual/synchronous_html_parser/external/wpt/dom/idlharness.any.serviceworker.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Create-valid-url-binaryType-blob.any.worker.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/websockets/stream/tentative/backpressure-send.any.sharedworker.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Close-readyState-Closing.any.worker.html?wpt_flags=h2 [ Timeout ]
@@ -2715,9 +2641,7 @@
 crbug.com/626703 [ Mac10.15 ] external/wpt/websockets/stream/tentative/constructor.any.worker.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/html/cross-origin-embedder-policy/shared-workers.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/websockets/Send-binary-arraybufferview-int16-offset.any.worker.html?wpt_flags=h2 [ Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/dom/idlharness.window.html?exclude=Node [ Failure Crash ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/url/url-constructor.any.worker.html [ Failure Crash ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/webxr/idlharness.https.window.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/websockets/Create-valid-url-array-protocols.any.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/webrtc-encoded-transform/sframe-keys.https.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/websockets/Send-0byte-data.any.html?wpt_flags=h2 [ Timeout ]
@@ -2728,15 +2652,12 @@
 crbug.com/626703 [ Mac10.13 ] external/wpt/websockets/Close-1000.any.worker.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Send-binary-blob.any.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/html/cross-origin-embedder-policy/cross-origin-isolated-permission.https.html [ Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/uievents/idlharness.window.html [ Failure Crash ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Send-unpaired-surrogates.any.worker.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Create-valid-url-protocol-string.any.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.12 ] external/wpt/websockets/Send-unicode-data.any.worker.html?wpt_flags=h2 [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] virtual/plz-dedicated-worker/external/wpt/service-workers/service-worker/xhr-content-length.https.window.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/websockets/Create-url-with-space.any.worker.html?wpt_flags=h2 [ Failure Crash ]
 crbug.com/626703 [ Mac10.12 ] external/wpt/websockets/Send-unpaired-surrogates.any.html?wpt_flags=h2 [ Timeout ]
-crbug.com/626703 [ Mac10.15 ] virtual/scroll-unification-synchronous_html_parser/external/wpt/dom/idlharness.any.worker.html [ Failure Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/dom/idlharness.any.worker.html [ Failure Crash ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/css/css-sizing/aspect-ratio/grid-aspect-ratio-018.html [ Failure ]
 crbug.com/626703 [ Mac10.15 ] virtual/plz-dedicated-worker/external/wpt/service-workers/service-worker/no-dynamic-import-in-module.any.serviceworker-module.html [ Failure Crash ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/websockets/Send-data.any.html?wpt_flags=h2 [ Timeout ]
@@ -3348,7 +3269,6 @@
 crbug.com/626703 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-safe-001.html [ Failure ]
 crbug.com/626703 external/wpt/editing/other/typing-around-link-element-at-non-collapsed-selection.tentative.html?target=ContentEditable [ Failure Timeout ]
 crbug.com/626703 external/wpt/editing/other/typing-around-link-element-at-collapsed-selection.tentative.html?target=ContentEditable&parent=b&child=i [ Failure Timeout ]
-crbug.com/626703 [ Mac10.13 ] external/wpt/FileAPI/idlharness.worker.html [ Timeout ]
 crbug.com/626703 external/wpt/html/interaction/focus/document-level-focus-apis/document-has-system-focus.html [ Timeout ]
 crbug.com/626703 [ Mac11.0 ] virtual/threaded/external/wpt/animation-worklet/worklet-animation-set-keyframes.https.html [ Failure ]
 crbug.com/626703 external/wpt/mediacapture-record/MediaRecorder-peerconnection-no-sink.https.html [ Timeout ]
@@ -3654,36 +3574,16 @@
 crbug.com/626703 [ Linux ] external/wpt/css/css-color/color-function-parsing.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/animations/font-stretch-interpolation.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/css/css-text/text-justify/distribute-alias.tentative.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/css/css-typed-om/idlharness.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/css/cssom-view/idlharness.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/css/cssom/idlharness.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/custom-elements/form-associated/ElementInternals-setFormValue.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/dom/idlharness.any.serviceworker.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/dom/idlharness.window.html?exclude=Node [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/gamepad/idlharness.https.window.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/html/cross-origin-embedder-policy/multi-globals/workers-coep-report.https.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/html/dom/idlharness.https.html?exclude=(Document|Window|HTML.\*) [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/html/dom/idlharness.https.html?include=(Document|Window) [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/html/dom/idlharness.https.html?include=HTML.* [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/html/dom/idlharness.worker.html [ Failure ]
 crbug.com/1167095 [ Linux ] external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/html/semantics/forms/form-submission-0/text-plain.window.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/input-device-capabilities/idlharness.window.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/media-source/idlharness.window.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/mst-content-hint/idlharness.window.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/periodic-background-sync/idlharness.https.any.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/periodic-background-sync/idlharness.https.any.worker.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/resource-timing/cross-origin-start-end-time-with-redirects.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/service-workers/service-worker/fetch-event.https.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/svg/idlharness.window.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/touch-events/idlharness.window.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/ua-client-hints/idlharness.https.any.worker.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/url/a-element-xhtml.xhtml [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/url/a-element.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/url/url-constructor.any.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/url/url-constructor.any.worker.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/wasm/jsapi/idlharness.any.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/wasm/jsapi/idlharness.any.worker.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/websockets/Create-protocols-repeated-case-insensitive.any.worker.html?wpt_flags=h2 [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/websockets/Create-url-with-space.any.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/websockets/stream/tentative/abort.any.sharedworker.html?wpt_flags=h2 [ Failure ]
@@ -3691,35 +3591,138 @@
 crbug.com/626703 [ Linux ] external/wpt/websockets/stream/tentative/backpressure-receive.any.sharedworker.html?wpt_flags=h2 [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/websockets/stream/tentative/constructor.any.html?wpt_flags=h2 [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/websockets/stream/tentative/constructor.any.sharedworker.html?wpt_flags=h2 [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/webxr/idlharness.https.window.html [ Failure ]
 crbug.com/626703 [ Linux ] virtual/composite-bgcolor-animation/external/wpt/css/css-backgrounds/parsing/background-image-computed.sub.html [ Failure ]
-crbug.com/626703 [ Linux ] virtual/layout_ng_svg_text/external/wpt/svg/idlharness.window.html [ Failure ]
 crbug.com/626703 [ Linux ] virtual/plz-dedicated-worker/external/wpt/resource-timing/cross-origin-start-end-time-with-redirects.html [ Failure ]
 crbug.com/626703 [ Linux ] virtual/plz-dedicated-worker/external/wpt/service-workers/service-worker/fetch-event.https.html [ Failure ]
 crbug.com/626703 [ Linux ] virtual/plz-service-worker/external/wpt/service-workers/service-worker/fetch-event.https.html [ Failure ]
-crbug.com/626703 [ Linux ] virtual/restrict-gamepad/external/wpt/gamepad/idlharness.https.window.html [ Failure ]
-crbug.com/626703 [ Linux ] virtual/scroll-unification-synchronous_html_parser/external/wpt/dom/idlharness.window.html?exclude=Node [ Failure ]
-crbug.com/626703 [ Linux ] virtual/synchronous_html_parser/external/wpt/dom/idlharness.window.html?exclude=Node [ Failure ]
 crbug.com/626703 [ Linux ] virtual/system-color-compute/external/wpt/css/css-color/color-function-parsing.html [ Failure ]
-crbug.com/626703 [ Linux ] virtual/threaded-prefer-compositing/external/wpt/css/cssom-view/idlharness.html [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/css/css-color/color-function-parsing.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/css/cssom/idlharness.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/periodic-background-sync/idlharness.https.any.worker.html [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/resource-timing/cross-origin-start-end-time-with-redirects.html [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/websockets/Create-blocked-port.any.worker.html?wpt_flags=h2 [ Failure ]
 crbug.com/626703 [ Mac ] virtual/plz-dedicated-worker/external/wpt/html/cross-origin-embedder-policy/multi-globals/workers-coep-report.https.html [ Pass Failure ]
 crbug.com/626703 [ Win ] virtual/plz-dedicated-worker/external/wpt/html/cross-origin-embedder-policy/multi-globals/workers-coep-report.https.html [ Pass Failure ]
 crbug.com/626703 [ Win ] external/wpt/css/css-fonts/animations/font-stretch-interpolation.html [ Failure ]
-crbug.com/626703 [ Win ] external/wpt/dom/idlharness.any.serviceworker.html [ Failure ]
 crbug.com/1167095 [ Win ] external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.html [ Failure ]
 crbug.com/626703 [ Win ] external/wpt/resource-timing/cross-origin-start-end-time-with-redirects.html [ Failure ]
-crbug.com/626703 [ Win ] external/wpt/wasm/jsapi/idlharness.any.html [ Failure ]
-crbug.com/626703 [ Win ] external/wpt/wasm/jsapi/idlharness.any.worker.html [ Failure ]
 crbug.com/626703 [ Win ] external/wpt/websockets/Create-protocols-repeated-case-insensitive.any.worker.html?wpt_flags=h2 [ Failure ]
 crbug.com/626703 [ Win ] external/wpt/websockets/Create-url-with-space.any.html [ Failure ]
 crbug.com/626703 [ Win ] external/wpt/websockets/stream/tentative/backpressure-receive.any.sharedworker.html?wpt_flags=h2 [ Failure ]
 crbug.com/626703 [ Win ] virtual/plz-dedicated-worker/external/wpt/resource-timing/cross-origin-start-end-time-with-redirects.html [ Failure ]
 
+# crbug.com/1203344 idlharness failures:
+crbug.com/1203344 [ Mac10.15 ] external/wpt/dom/idlharness.window.html?exclude=Node [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/webxr/idlharness.https.window.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/uievents/idlharness.window.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] virtual/scroll-unification-synchronous_html_parser/external/wpt/dom/idlharness.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/dom/idlharness.any.worker.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.13 ] external/wpt/FileAPI/idlharness.worker.html [ Timeout ]
+crbug.com/1203344 [ Mac11.0 ] external/wpt/webusb/idlharness.https.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.14 ] external/wpt/xhr/idlharness.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Linux ] external/wpt/uievents/idlharness.window.html [ Crash Failure ]
+crbug.com/1203344 [ Mac10.14 ] external/wpt/html/dom/idlharness.https.html?exclude=(Document|Window|HTML.\*) [ Failure Timeout ]
+crbug.com/1203344 [ Mac11.0 ] external/wpt/fetch/api/idlharness.any.serviceworker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac11.0 ] external/wpt/webrtc-encoded-transform/idlharness.https.window.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac11.0 ] virtual/plz-dedicated-worker/external/wpt/service-workers/idlharness.https.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac11.0 ] virtual/shared_array_buffer_on_desktop/external/wpt/xhr/idlharness.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.14 ] virtual/shared_array_buffer_on_desktop/external/wpt/xhr/idlharness.any.sharedworker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac11.0 ] virtual/plz-dedicated-worker/external/wpt/service-workers/idlharness.https.any.sharedworker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac11.0 ] virtual/plz-dedicated-worker/external/wpt/xhr/idlharness.any.sharedworker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.13 ] external/wpt/css/css-paint-api/idlharness.html [ Failure ]
+crbug.com/1203344 [ Mac10.14 ] external/wpt/html/dom/idlharness.https.html?include=(Document|Window) [ Failure ]
+crbug.com/1203344 [ Mac10.14 ] external/wpt/mst-content-hint/idlharness.window.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.14 ] virtual/layout_ng_svg_text/external/wpt/svg/idlharness.window.html [ Failure ]
+crbug.com/1203344 [ Mac10.14 ] external/wpt/animation-worklet/idlharness.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.14 ] external/wpt/badging/idlharness.https.any.worker.html [ Timeout Failure ]
+crbug.com/1203344 [ Mac10.14 ] external/wpt/dom/idlharness.window.html?exclude=Node [ Timeout Failure ]
+crbug.com/1203344 [ Mac10.14 ] external/wpt/media-source/idlharness.window.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.15 ] virtual/scroll-unification-synchronous_html_parser/external/wpt/dom/idlharness.any.sharedworker.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] virtual/scroll-unification-synchronous_html_parser/external/wpt/dom/idlharness.any.sharedworker.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/ua-client-hints/idlharness.https.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Win ] external/wpt/ua-client-hints/idlharness.https.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/fetch/api/idlharness.any.serviceworker.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] external/wpt/fetch/api/idlharness.any.serviceworker.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/payment-handler/idlharness.https.any.sharedworker.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] external/wpt/payment-handler/idlharness.https.any.sharedworker.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] virtual/plz-dedicated-worker/external/wpt/service-workers/idlharness.https.any.sharedworker.html [ Failure Timeout ]
+crbug.com/1203344 [ Win10 ] virtual/plz-dedicated-worker/external/wpt/service-workers/idlharness.https.any.sharedworker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/badging/idlharness.https.any.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] external/wpt/badging/idlharness.https.any.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] virtual/plz-service-worker/external/wpt/service-workers/idlharness.https.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Win10 ] virtual/plz-service-worker/external/wpt/service-workers/idlharness.https.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/media-source/idlharness.window.html [ Failure Timeout ]
+crbug.com/1203344 [ Win ] external/wpt/media-source/idlharness.window.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/storage/idlharness.https.any.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] external/wpt/storage/idlharness.https.any.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/svg/idlharness.window.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] external/wpt/svg/idlharness.window.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] virtual/layout_ng_svg_text/external/wpt/svg/idlharness.window.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] virtual/layout_ng_svg_text/external/wpt/svg/idlharness.window.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/touch-events/idlharness.window.html [ Failure Timeout ]
+crbug.com/1203344 [ Win10 ] external/wpt/touch-events/idlharness.window.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.15 ] virtual/threaded/external/wpt/animation-worklet/idlharness.any.worker.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] virtual/threaded/external/wpt/animation-worklet/idlharness.any.worker.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/origin-policy/idlharness.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Win10 ] external/wpt/origin-policy/idlharness.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/storage/idlharness.https.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Win10 ] external/wpt/storage/idlharness.https.any.worker.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.15 ] virtual/threaded/external/wpt/animation-worklet/idlharness.any.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] virtual/threaded/external/wpt/animation-worklet/idlharness.any.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.13 ] external/wpt/websockets/Send-binary-blob.any.worker.html?wpt_flags=h2 [ Timeout ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/ua-client-hints/idlharness.https.any.html [ Failure Crash Timeout ]
+crbug.com/1203344 [ Win10 ] external/wpt/ua-client-hints/idlharness.https.any.html [ Failure Crash Timeout ]
+crbug.com/1203344 [ Mac10.15 ] virtual/plz-service-worker/external/wpt/service-workers/idlharness.https.any.serviceworker.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] virtual/plz-service-worker/external/wpt/service-workers/idlharness.https.any.serviceworker.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/input-device-capabilities/idlharness.window.html [ Failure Timeout ]
+crbug.com/1203344 [ Win10 ] external/wpt/input-device-capabilities/idlharness.window.html [ Failure Timeout ]
+crbug.com/1203344 [ Mac10.15 ] virtual/scroll-unification-synchronous_html_parser/external/wpt/dom/idlharness.any.serviceworker.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] virtual/scroll-unification-synchronous_html_parser/external/wpt/dom/idlharness.any.serviceworker.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/webrtc-identity/idlharness.https.window.html [ Failure Crash Timeout ]
+crbug.com/1203344 [ Win10 ] external/wpt/webrtc-identity/idlharness.https.window.html [ Failure Crash Timeout ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/fetch/api/idlharness.any.worker.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] external/wpt/fetch/api/idlharness.any.worker.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/periodic-background-sync/idlharness.https.any.html [ Failure Crash ]
+crbug.com/1203344 [ Win ] external/wpt/periodic-background-sync/idlharness.https.any.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] virtual/plz-dedicated-worker/external/wpt/fetch/api/idlharness.any.serviceworker.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] virtual/plz-dedicated-worker/external/wpt/fetch/api/idlharness.any.serviceworker.html [ Failure Crash ]
+crbug.com/1203344 [ Mac ] virtual/threaded-prefer-compositing/external/wpt/css/cssom-view/idlharness.html [ Pass Failure Crash ]
+crbug.com/1203344 [ Win10 ] virtual/threaded-prefer-compositing/external/wpt/css/cssom-view/idlharness.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] external/wpt/badging/idlharness.https.any.worker.html [ Failure Crash ]
+crbug.com/1203344 [ Win10 ] external/wpt/badging/idlharness.https.any.worker.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] virtual/restrict-gamepad/external/wpt/gamepad/idlharness.https.window.html [ Failure Crash ]
+crbug.com/1203344 [ Mac10.15 ] virtual/synchronous_html_parser/external/wpt/dom/idlharness.any.serviceworker.html [ Failure Timeout ]
+crbug.com/1203344 [ Linux ] external/wpt/css/css-typed-om/idlharness.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/css/cssom-view/idlharness.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/css/cssom/idlharness.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/dom/idlharness.any.serviceworker.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/dom/idlharness.window.html?exclude=Node [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/gamepad/idlharness.https.window.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/html/dom/idlharness.https.html?exclude=(Document|Window|HTML.\*) [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/html/dom/idlharness.https.html?include=(Document|Window) [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/html/dom/idlharness.https.html?include=HTML.* [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/html/dom/idlharness.worker.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/input-device-capabilities/idlharness.window.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/media-source/idlharness.window.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/mst-content-hint/idlharness.window.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/periodic-background-sync/idlharness.https.any.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/periodic-background-sync/idlharness.https.any.worker.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/svg/idlharness.window.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/touch-events/idlharness.window.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/ua-client-hints/idlharness.https.any.worker.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/wasm/jsapi/idlharness.any.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/wasm/jsapi/idlharness.any.worker.html [ Failure ]
+crbug.com/1203344 [ Linux ] external/wpt/webxr/idlharness.https.window.html [ Failure ]
+crbug.com/1203344 [ Linux ] virtual/layout_ng_svg_text/external/wpt/svg/idlharness.window.html [ Failure ]
+crbug.com/1203344 [ Linux ] virtual/restrict-gamepad/external/wpt/gamepad/idlharness.https.window.html [ Failure ]
+crbug.com/1203344 [ Linux ] virtual/scroll-unification-synchronous_html_parser/external/wpt/dom/idlharness.window.html?exclude=Node [ Failure ]
+crbug.com/1203344 [ Linux ] virtual/synchronous_html_parser/external/wpt/dom/idlharness.window.html?exclude=Node [ Failure ]
+crbug.com/1203344 [ Linux ] virtual/threaded-prefer-compositing/external/wpt/css/cssom-view/idlharness.html [ Failure ]
+crbug.com/1203344 [ Mac ] external/wpt/css/cssom/idlharness.html [ Failure ]
+crbug.com/1203344 [ Mac ] external/wpt/periodic-background-sync/idlharness.https.any.worker.html [ Failure ]
+crbug.com/1203344 [ Win ] external/wpt/dom/idlharness.any.serviceworker.html [ Failure ]
+crbug.com/1203344 [ Win ] external/wpt/wasm/jsapi/idlharness.any.html [ Failure ]
+crbug.com/1203344 [ Win ] external/wpt/wasm/jsapi/idlharness.any.worker.html [ Failure ]
+
+
 ### See crbug.com/891427 comment near the top of this file:
 crbug.com/626703 external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/legend-block-margins-2.html [ Failure ]
 crbug.com/767352 external/wpt/css/css-backgrounds/border-image-width-008.html [ Failure ]
@@ -6897,7 +6900,6 @@
 crbug.com/1149734 http/tests/devtools/sources/debugger-ui/inline-scope-variables.js [ Pass Failure Timeout ]
 
 #Sheriff 2020-11-24
-crbug.com/1152496 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-shadow.html [ Pass Timeout ]
 crbug.com/1087242 http/tests/inspector-protocol/service-worker/network-extrainfo-main-request.js [ Pass Failure Timeout Crash ]
 crbug.com/1149771 [ Linux ] virtual/android/fullscreen/video-scrolled-iframe.html [ Pass Timeout ]
 crbug.com/1152532 http/tests/devtools/service-workers/user-agent-override.js [ Pass Timeout ]
@@ -7314,3 +7316,6 @@
 
 # Sheriff 2021-04-26
 crbug.com/1202722 [ Linux ] virtual/scroll-unification/fast/events/mouseenter-mouseleave-on-drag.html [ Pass Timeout ]
+
+# Sheriff 2021-04-27
+crbug.com/1203309 [ Linux ] http/tests/devtools/tracing/trace-event-self-time.js [ Pass Failure ]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-008.html b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-008.html
index 6edecba..653dee6 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-008.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-008.html
@@ -69,16 +69,16 @@
 <body onload="document.fonts.ready.then(() => { checkLayout('.grid'); })">
 <div class="grid">
   <div data-offset-x="25"  data-offset-y="5"   data-expected-width="10" data-expected-height="60" class="firstRowFirstColumn verticalLR">X XX X</div>
-  <div data-offset-x="210" data-offset-y="65"  data-expected-width="30" data-expected-height="70" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
+  <div data-offset-x="200" data-offset-y="65"  data-expected-width="30" data-expected-height="70" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
   <div data-offset-x="20"  data-offset-y="165" data-expected-width="60" data-expected-height="10" class="secondRowFirstColumn RTL">X XX X</div>
   <div data-offset-x="125" data-offset-y="165" data-expected-width="40" data-expected-height="60" class="secondRowSecondColumn verticalLR RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
 </div>
 
 <div class="grid RTL">
   <div data-offset-x="175" data-offset-y="5"   data-expected-width="10" data-expected-height="60" class="firstRowFirstColumn verticalLR">X XX X</div>
-  <div data-offset-x="110" data-offset-y="65"  data-expected-width="30" data-expected-height="70" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
+  <div data-offset-x="100" data-offset-y="65"  data-expected-width="30" data-expected-height="70" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
   <div data-offset-x="180" data-offset-y="165" data-expected-width="60" data-expected-height="10" class="secondRowFirstColumn LTR">X XX X</div>
-  <div data-offset-x="35"  data-offset-y="165" data-expected-width="40" data-expected-height="60" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
+  <div data-offset-x="25"  data-offset-y="165" data-expected-width="40" data-expected-height="60" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
 </div>
 
 <br><br>
@@ -91,9 +91,9 @@
 </div>
 
 <div class="grid verticalRL">
-  <div data-offset-x="135" data-offset-y="75"  data-expected-width="60" data-expected-height="10" class="firstRowFirstColumn horizontal">X XX X</div>
-  <div data-offset-x="170" data-offset-y="155" data-expected-width="70" data-expected-height="30" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div>
+  <div data-offset-x="125" data-offset-y="75"  data-expected-width="60" data-expected-height="10" class="firstRowFirstColumn horizontal">X XX X</div>
+  <div data-offset-x="160" data-offset-y="155" data-expected-width="70" data-expected-height="30" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div>
   <div data-offset-x="25"  data-offset-y="15"  data-expected-width="60" data-expected-height="10" class="secondRowFirstColumn horizontal RTL">X XX X</div>
-  <div data-offset-x="35"  data-offset-y="115" data-expected-width="40" data-expected-height="60" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
+  <div data-offset-x="25"  data-offset-y="115" data-expected-width="40" data-expected-height="60" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
 </div>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011-expected.txt
deleted file mode 100644
index edc37248..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011-expected.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-This is a testharness.js-based test.
-FAIL .grid 1 assert_equals: 
-<div class="grid">
-  <div data-offset-x="13" data-offset-y="2" data-expected-width="26" data-expected-height="70" class="firstRowFirstColumn verticalLR">X XX X</div>
-  <div data-offset-x="190" data-offset-y="64" data-expected-width="46" data-expected-height="80" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="8" data-offset-y="162" data-expected-width="76" data-expected-height="20" class="secondRowFirstColumn RTL">X XX X</div>
-  <div data-offset-x="113" data-offset-y="162" data-expected-width="56" data-expected-height="70" class="secondRowSecondColumn verticalLR RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetLeft expected 190 but got 194
-FAIL .grid 2 assert_equals: 
-<div class="grid RTL">
-  <div data-offset-x="163" data-offset-y="2" data-expected-width="26" data-expected-height="70" class="firstRowFirstColumn verticalLR">X XX X</div>
-  <div data-offset-x="90" data-offset-y="64" data-expected-width="46" data-expected-height="80" class="firstRowSecondColumn verticalRL">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="170" data-offset-y="162" data-expected-width="76" data-expected-height="20" class="secondRowFirstColumn LTR">X XX X</div>
-  <div data-offset-x="13" data-offset-y="162" data-expected-width="56" data-expected-height="70" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetLeft expected 90 but got 94
-PASS .grid 3
-FAIL .grid 4 assert_equals: 
-<div class="grid verticalRL">
-  <div data-offset-x="113" data-offset-y="74" data-expected-width="76" data-expected-height="20" class="firstRowFirstColumn horizontal">X XX X</div>
-  <div data-offset-x="150" data-offset-y="153" data-expected-width="86" data-expected-height="40" class="firstRowSecondColumn horizontal">XX X<br>X XXX X<br>XX XXX</div>
-  <div data-offset-x="14" data-offset-y="12" data-expected-width="76" data-expected-height="20" class="secondRowFirstColumn horizontal RTL">X XX X</div>
-  <div data-offset-x="13" data-offset-y="112" data-expected-width="56" data-expected-height="70" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
-</div>
-offsetLeft expected 113 but got 117
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011-expected.txt
index 34a027a..962bbca 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-grid/alignment/grid-self-alignment-non-static-positioned-items-011-expected.txt
@@ -6,7 +6,7 @@
   <div data-offset-x="8" data-offset-y="162" data-expected-width="76" data-expected-height="20" class="secondRowFirstColumn RTL">X XX X</div>
   <div data-offset-x="113" data-offset-y="162" data-expected-width="56" data-expected-height="70" class="secondRowSecondColumn verticalLR RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
 </div>
-offsetLeft expected 190 but got 210
+offsetLeft expected 190 but got 206
 FAIL .grid 2 assert_equals: 
 <div class="grid RTL">
   <div data-offset-x="163" data-offset-y="2" data-expected-width="26" data-expected-height="70" class="firstRowFirstColumn verticalLR">X XX X</div>
@@ -14,7 +14,7 @@
   <div data-offset-x="170" data-offset-y="162" data-expected-width="76" data-expected-height="20" class="secondRowFirstColumn LTR">X XX X</div>
   <div data-offset-x="13" data-offset-y="162" data-expected-width="56" data-expected-height="70" class="secondRowSecondColumn verticalRL RTL">XX X<br>X XXX<br>X<br>XX XXX</div>
 </div>
-offsetLeft expected 90 but got 110
+offsetLeft expected 90 but got 106
 PASS .grid 3
 FAIL .grid 4 assert_equals: 
 <div class="grid verticalRL">
@@ -23,6 +23,6 @@
   <div data-offset-x="14" data-offset-y="12" data-expected-width="76" data-expected-height="20" class="secondRowFirstColumn horizontal RTL">X XX X</div>
   <div data-offset-x="13" data-offset-y="112" data-expected-width="56" data-expected-height="70" class="secondRowSecondColumn verticalLR">XX X<br>X XXX<br>X<br>XX XXX</div>
 </div>
-offsetLeft expected 113 but got 101
+offsetLeft expected 113 but got 97
 Harness: the test ran to completion.
 
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 96adfd2..9b17f1c 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -522,6 +522,7 @@
       'linux-gcc-rel': 'release_bot_x86_minimal_symbols_no_clang_cxx11',
       'linux-ozone-rel': 'ozone_linux_release_bot',
       'linux-trusty-rel': 'gpu_tests_release_bot',
+      'linux-xenial-rel': 'gpu_tests_release_bot',
     },
 
     'chromium.mac': {
@@ -1019,6 +1020,7 @@
       'linux-perfetto-rel': 'perfetto_release_trybot',
       'linux-rel': 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_code_coverage',
       'linux-rel-dual-coverage': 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_code_coverage',
+      'linux-rel-orchestrator': 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange',
       'linux-rel-reclient': 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_code_coverage_reclient',
       'linux-rel-rts': 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_code_coverage',
       'linux-trusty-rel': 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange',
@@ -1027,6 +1029,7 @@
       'linux-wpt-identity-fyi-rel': 'release_trybot',
       'linux-wpt-input-fyi-rel': 'release_trybot',
       'linux-webkit-msan-rel': 'msan_release_bot',
+      'linux-xenial-rel': 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_code_coverage',
       'linux_chromium_archive_rel_ng': 'release_bot',
       'linux_chromium_asan_rel_ng': 'asan_lsan_release_trybot',
       # TODO(crbug.com/1200574): Remove after migration.
@@ -2799,7 +2802,7 @@
     },
 
     'amd64-lacros': {
-      'gn_args': 'use_ozone=true ozone_platform_wayland=true ozone_platform_x11=false target_os="chromeos" use_evdev_gestures=false use_vaapi=true use_gtk=false use_glib=false enable_linux_installer=false rtc_use_pipewire=false use_gio=false use_v8_context_snapshot=false use_custom_libcxx=false use_pulseaudio=false use_pangocairo=false chromeos_is_browser_only=true use_system_libsync=false cros_host_sysroot="//build/linux/debian_sid_amd64-sysroot" cros_v8_snapshot_sysroot="//build/linux/debian_sid_amd64-sysroot" use_custom_libcxx_for_host=true'
+      'gn_args': 'use_ozone=true ozone_platform_wayland=true ozone_platform_x11=false target_os="chromeos" use_evdev_gestures=false use_vaapi=false use_gtk=false use_glib=false enable_linux_installer=false rtc_use_pipewire=false use_gio=false use_v8_context_snapshot=false use_custom_libcxx=false use_pulseaudio=false use_pangocairo=false chromeos_is_browser_only=true use_system_libsync=false cros_host_sysroot="//build/linux/debian_sid_amd64-sysroot" cros_v8_snapshot_sysroot="//build/linux/debian_sid_amd64-sysroot" use_custom_libcxx_for_host=true'
     },
 
     # We build Android with codecs on most bots to ensure maximum test
diff --git a/tools/mb/mb_config_expectations/chrome.json b/tools/mb/mb_config_expectations/chrome.json
index 3735f39..fc45870 100644
--- a/tools/mb/mb_config_expectations/chrome.json
+++ b/tools/mb/mb_config_expectations/chrome.json
@@ -227,7 +227,7 @@
       "use_system_libsync": false,
       "use_thin_lto": true,
       "use_v8_context_snapshot": false,
-      "use_vaapi": true
+      "use_vaapi": false
     }
   },
   "linux-chrome": {
diff --git a/tools/mb/mb_config_expectations/chromium.chromiumos.json b/tools/mb/mb_config_expectations/chromium.chromiumos.json
index 12b5a65b..5d034864 100644
--- a/tools/mb/mb_config_expectations/chromium.chromiumos.json
+++ b/tools/mb/mb_config_expectations/chromium.chromiumos.json
@@ -64,7 +64,7 @@
       "use_pulseaudio": false,
       "use_system_libsync": false,
       "use_v8_context_snapshot": false,
-      "use_vaapi": true
+      "use_vaapi": false
     }
   },
   "chromeos-amd64-generic-rel": {
@@ -126,7 +126,7 @@
       "use_pulseaudio": false,
       "use_system_libsync": false,
       "use_v8_context_snapshot": false,
-      "use_vaapi": true
+      "use_vaapi": false
     }
   },
   "lacros-amd64-generic-rel": {
@@ -154,7 +154,7 @@
       "use_pulseaudio": false,
       "use_system_libsync": false,
       "use_v8_context_snapshot": false,
-      "use_vaapi": true
+      "use_vaapi": false
     }
   },
   "linux-ash-chromium-generator-rel": {
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json
index a6b66814..4442eb0c 100644
--- a/tools/mb/mb_config_expectations/chromium.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -632,7 +632,7 @@
       "use_pulseaudio": false,
       "use_system_libsync": false,
       "use_v8_context_snapshot": false,
-      "use_vaapi": true
+      "use_vaapi": false
     }
   },
   "linux-annotator-rel": {
diff --git a/tools/mb/mb_config_expectations/chromium.linux.json b/tools/mb/mb_config_expectations/chromium.linux.json
index a76d72c4..e6ab3100 100644
--- a/tools/mb/mb_config_expectations/chromium.linux.json
+++ b/tools/mb/mb_config_expectations/chromium.linux.json
@@ -194,5 +194,14 @@
       "proprietary_codecs": true,
       "use_goma": true
     }
+  },
+  "linux-xenial-rel": {
+    "gn_args": {
+      "ffmpeg_branding": "Chrome",
+      "is_component_build": false,
+      "is_debug": false,
+      "proprietary_codecs": true,
+      "use_goma": true
+    }
   }
 }
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/chromium.perf.json b/tools/mb/mb_config_expectations/chromium.perf.json
index cb886a6..9edfe140 100644
--- a/tools/mb/mb_config_expectations/chromium.perf.json
+++ b/tools/mb/mb_config_expectations/chromium.perf.json
@@ -96,7 +96,7 @@
       "use_system_libsync": false,
       "use_thin_lto": true,
       "use_v8_context_snapshot": false,
-      "use_vaapi": true
+      "use_vaapi": false
     }
   },
   "linux-builder-perf": {
diff --git a/tools/mb/mb_config_expectations/internal.chrome.fyi.json b/tools/mb/mb_config_expectations/internal.chrome.fyi.json
index dbceb49..fc5a748 100644
--- a/tools/mb/mb_config_expectations/internal.chrome.fyi.json
+++ b/tools/mb/mb_config_expectations/internal.chrome.fyi.json
@@ -24,7 +24,7 @@
       "use_pulseaudio": false,
       "use_system_libsync": false,
       "use_v8_context_snapshot": false,
-      "use_vaapi": true
+      "use_vaapi": false
     }
   },
   "linux-autofill-captured-sites-rel": {
diff --git a/tools/mb/mb_config_expectations/internal.chromeos.fyi.json b/tools/mb/mb_config_expectations/internal.chromeos.fyi.json
index 85727d0..44dcb30e 100644
--- a/tools/mb/mb_config_expectations/internal.chromeos.fyi.json
+++ b/tools/mb/mb_config_expectations/internal.chromeos.fyi.json
@@ -65,7 +65,7 @@
       "use_system_libsync": false,
       "use_thin_lto": true,
       "use_v8_context_snapshot": false,
-      "use_vaapi": true
+      "use_vaapi": false
     }
   }
 }
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/official.chrome.continuous.json b/tools/mb/mb_config_expectations/official.chrome.continuous.json
index 42baadc..5e9ade0 100644
--- a/tools/mb/mb_config_expectations/official.chrome.continuous.json
+++ b/tools/mb/mb_config_expectations/official.chrome.continuous.json
@@ -29,7 +29,7 @@
       "use_system_libsync": false,
       "use_thin_lto": true,
       "use_v8_context_snapshot": false,
-      "use_vaapi": true
+      "use_vaapi": false
     }
   }
 }
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/official.chrome.json b/tools/mb/mb_config_expectations/official.chrome.json
index d3c3c651..460d39f7 100644
--- a/tools/mb/mb_config_expectations/official.chrome.json
+++ b/tools/mb/mb_config_expectations/official.chrome.json
@@ -47,7 +47,7 @@
       "use_system_libsync": false,
       "use_thin_lto": true,
       "use_v8_context_snapshot": false,
-      "use_vaapi": true
+      "use_vaapi": false
     }
   }
 }
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/tryserver.chrome.json b/tools/mb/mb_config_expectations/tryserver.chrome.json
index b120099..13701124 100644
--- a/tools/mb/mb_config_expectations/tryserver.chrome.json
+++ b/tools/mb/mb_config_expectations/tryserver.chrome.json
@@ -149,7 +149,7 @@
       "use_system_libsync": false,
       "use_thin_lto": true,
       "use_v8_context_snapshot": false,
-      "use_vaapi": true
+      "use_vaapi": false
     }
   },
   "linux-chrome": {
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json b/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json
index 14f2061..b159d13 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json
@@ -125,7 +125,7 @@
       "use_pulseaudio": false,
       "use_system_libsync": false,
       "use_v8_context_snapshot": false,
-      "use_vaapi": true
+      "use_vaapi": false
     }
   },
   "linux-cfm-rel": {
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
index 0ddde32..249205c3 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
@@ -651,6 +651,18 @@
       "use_goma": true
     }
   },
+  "linux-rel-orchestrator": {
+    "gn_args": {
+      "dcheck_always_on": true,
+      "ffmpeg_branding": "Chrome",
+      "is_component_build": false,
+      "is_debug": false,
+      "proprietary_codecs": true,
+      "symbol_level": 0,
+      "use_dummy_lastchange": true,
+      "use_goma": true
+    }
+  },
   "linux-rel-reclient": {
     "gn_args": {
       "coverage_instrumentation_input_file": "//.code-coverage/files_to_instrument.txt",
@@ -736,6 +748,20 @@
       "use_goma": true
     }
   },
+  "linux-xenial-rel": {
+    "gn_args": {
+      "coverage_instrumentation_input_file": "//.code-coverage/files_to_instrument.txt",
+      "dcheck_always_on": true,
+      "ffmpeg_branding": "Chrome",
+      "is_component_build": false,
+      "is_debug": false,
+      "proprietary_codecs": true,
+      "symbol_level": 0,
+      "use_clang_coverage": true,
+      "use_dummy_lastchange": true,
+      "use_goma": true
+    }
+  },
   "linux_chromium_archive_rel_ng": {
     "gn_args": {
       "is_component_build": false,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.perf.json b/tools/mb/mb_config_expectations/tryserver.chromium.perf.json
index e0438090..3afb836 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.perf.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.perf.json
@@ -58,7 +58,7 @@
       "use_system_libsync": false,
       "use_thin_lto": true,
       "use_v8_context_snapshot": false,
-      "use_vaapi": true
+      "use_vaapi": false
     }
   },
   "Fuchsia Builder Perf": {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index d73c92c..bd1746a7 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -38665,6 +38665,7 @@
   <int value="2" label="kDownload"/>
   <int value="3" label="kNearbyShare"/>
   <int value="4" label="kScreenRecording"/>
+  <int value="5" label="kArcDownload"/>
 </enum>
 
 <enum name="HoldingSpacePodAction">
diff --git a/tools/metrics/histograms/histograms_xml/android/histograms.xml b/tools/metrics/histograms/histograms_xml/android/histograms.xml
index 2490d8b..abebca8 100644
--- a/tools/metrics/histograms/histograms_xml/android/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/android/histograms.xml
@@ -1704,9 +1704,13 @@
   <owner>jdonnelly@chromium.org</owner>
   <summary>
     Recorded every time AutocompleteController.java interacts with
-    autocomplete_controller_android.cc via an index reference to an item.
-    Indicates how often the match referenced by Java is different from the match
-    referenced by C++ at that position.
+    autocomplete_controller_android.cc. Indicates how often matches referenced
+    by Java are different from the matches referenced by C++ at any position.
+
+    Note: Chrome M91 and before only increased this histogram for specific Match
+    objects that the user interacted with. As of M92, this histogram is
+    increased for every case where at least one Match referenced by Java was
+    different from its corresponding C++ match at the same exact position.
   </summary>
 </histogram>
 
@@ -3376,7 +3380,7 @@
 </histogram>
 
 <histogram name="AndroidSearchEngineLogo.Events"
-    enum="AndroidSearchEngineLogoEvents" expires_after="2021-06-01">
+    enum="AndroidSearchEngineLogoEvents" expires_after="2022-06-01">
   <owner>wylieb@chromium.org</owner>
   <owner>fgorski@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/histograms_xml/chrome/histograms.xml b/tools/metrics/histograms/histograms_xml/chrome/histograms.xml
index b4cbc38..bd90406 100644
--- a/tools/metrics/histograms/histograms_xml/chrome/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/chrome/histograms.xml
@@ -126,7 +126,7 @@
 </histogram>
 
 <histogram name="Chrome.Tabs.AnimationSmoothness.HoverCard.FadeIn" units="%"
-    expires_after="2021-08-29">
+    expires_after="2022-08-29">
   <owner>yichenz@chromium.org</owner>
   <owner>chromeos-wmp@google.com</owner>
   <summary>
@@ -135,7 +135,7 @@
 </histogram>
 
 <histogram name="Chrome.Tabs.AnimationSmoothness.HoverCard.FadeOut" units="%"
-    expires_after="2021-06-04">
+    expires_after="2022-06-04">
   <owner>yichenz@chromium.org</owner>
   <owner>chromeos-wmp@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/histograms_xml/geolocation/histograms.xml b/tools/metrics/histograms/histograms_xml/geolocation/histograms.xml
index c1b90dd..d63afe3 100644
--- a/tools/metrics/histograms/histograms_xml/geolocation/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/geolocation/histograms.xml
@@ -113,6 +113,13 @@
   </summary>
 </histogram>
 
+<histogram name="Geolocation.NetworkLocationRequest.NetError"
+    enum="NetErrorCodes" expires_after="2022-04-22">
+  <owner>JamesHollyer@chromium.org</owner>
+  <owner>device-dev@chromium.org</owner>
+  <summary>Network errors in NetworkLocationRequest.</summary>
+</histogram>
+
 <histogram name="Geolocation.NetworkLocationRequest.ResponseCode"
     units="HTTP response code" expires_after="M85">
   <owner>mattreynolds@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/holding_space/histograms.xml b/tools/metrics/histograms/histograms_xml/holding_space/histograms.xml
index 32c468f4..52817ff 100644
--- a/tools/metrics/histograms/histograms_xml/holding_space/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/holding_space/histograms.xml
@@ -34,6 +34,7 @@
 
 <variants name="HoldingSpaceItemType">
   <variant name="All" summary="Includes all item types."/>
+  <variant name="ArcDownload" summary="Items backed by an ARC download file."/>
   <variant name="Download" summary="Items backed by a download file."/>
   <variant name="NearbyShare" summary="Items backed by a nearby shared file."/>
   <variant name="PinnedFile" summary="Items pinned explicitly by the user."/>
diff --git a/tools/metrics/histograms/histograms_xml/image/histograms.xml b/tools/metrics/histograms/histograms_xml/image/histograms.xml
index 933b7e7..d0148ff5 100644
--- a/tools/metrics/histograms/histograms_xml/image/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/image/histograms.xml
@@ -235,7 +235,7 @@
 </histogram>
 
 <histogram base="true" name="ImageFetcher.CacheSize" units="KB"
-    expires_after="2022-05-01">
+    expires_after="2022-06-01">
 <!-- Name completed by histogram_suffixes name="ImageFetcherCacheStrategy" -->
 
   <owner>fgorski@chromium.org</owner>
@@ -248,7 +248,7 @@
 </histogram>
 
 <histogram name="ImageFetcher.Events" enum="ImageFetcherEvent"
-    expires_after="2021-10-04">
+    expires_after="2022-06-01">
   <owner>fgorski@chromium.org</owner>
   <owner>wylieb@chromium.org</owner>
   <summary>
@@ -259,7 +259,7 @@
 </histogram>
 
 <histogram name="ImageFetcher.ImageLoadFromCacheTime" units="ms"
-    expires_after="2021-06-01">
+    expires_after="2022-06-01">
   <owner>fgorski@chromium.org</owner>
   <owner>wylieb@chromium.org</owner>
   <summary>
@@ -269,7 +269,7 @@
 </histogram>
 
 <histogram name="ImageFetcher.ImageLoadFromCacheTimeJava" units="ms"
-    expires_after="2021-06-01">
+    expires_after="2022-06-01">
   <owner>fgorski@chromium.org</owner>
   <owner>wylieb@chromium.org</owner>
   <summary>
@@ -279,7 +279,7 @@
 </histogram>
 
 <histogram name="ImageFetcher.ImageLoadFromNativeTimeJava" units="ms"
-    expires_after="2021-06-01">
+    expires_after="2022-06-01">
   <owner>fgorski@chromium.org</owner>
   <owner>wylieb@chromium.org</owner>
   <summary>
@@ -289,7 +289,7 @@
 </histogram>
 
 <histogram name="ImageFetcher.ImageLoadFromNetworkAfterCacheHit" units="ms"
-    expires_after="2021-06-01">
+    expires_after="2022-06-01">
   <owner>fgorski@chromium.org</owner>
   <owner>wylieb@chromium.org</owner>
   <summary>
@@ -299,7 +299,7 @@
 </histogram>
 
 <histogram name="ImageFetcher.ImageLoadFromNetworkTime" units="ms"
-    expires_after="2021-06-01">
+    expires_after="2022-06-01">
   <owner>fgorski@chromium.org</owner>
   <owner>wylieb@chromium.org</owner>
   <summary>
@@ -309,7 +309,7 @@
 </histogram>
 
 <histogram name="ImageFetcher.LoadImageMetadata" units="ms"
-    expires_after="2021-06-01">
+    expires_after="2022-06-01">
   <owner>fgorski@chromium.org</owner>
   <owner>wylieb@chromium.org</owner>
   <summary>
@@ -318,7 +318,7 @@
 </histogram>
 
 <histogram name="ImageFetcher.RequestStatusCode"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2021-06-01">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2022-06-01">
   <owner>fgorski@chromium.org</owner>
   <owner>wylieb@chromium.org</owner>
   <summary>
@@ -329,7 +329,7 @@
 </histogram>
 
 <histogram name="ImageFetcher.TimeSinceLastCacheLRUEviction" units="ms"
-    expires_after="2021-06-01">
+    expires_after="2022-06-01">
   <owner>fgorski@chromium.org</owner>
   <owner>wylieb@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/histograms_xml/oobe/histograms.xml b/tools/metrics/histograms/histograms_xml/oobe/histograms.xml
index 567f1d03..9009047e 100644
--- a/tools/metrics/histograms/histograms_xml/oobe/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/oobe/histograms.xml
@@ -111,6 +111,16 @@
   </summary>
 </histogram>
 
+<histogram name="OOBE.GaiaLoginTime" units="ms" expires_after="2021-10-01">
+  <owner>dkuzmin@google.com</owner>
+  <owner>cros-oac@google.com</owner>
+  <summary>
+    Records the amount of time spent by user to complete GAIA login during
+    first-run OOBE. Recorded after receiving authentication success signal. Not
+    recorded for SAML flow.
+  </summary>
+</histogram>
+
 <histogram name="OOBE.GaiaPasswordChangedScreen.UserActions"
     enum="GaiaPasswordChangedScreenUserAction" expires_after="2021-10-01">
   <owner>raleksandrov@google.com</owner>
diff --git a/tools/metrics/histograms/histograms_xml/others/histograms.xml b/tools/metrics/histograms/histograms_xml/others/histograms.xml
index 93aea0a..9fa7ac0 100644
--- a/tools/metrics/histograms/histograms_xml/others/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/others/histograms.xml
@@ -12564,7 +12564,7 @@
 </histogram>
 
 <histogram name="ReadingList.BookmarkBarState.On{Frequency}AddToReadingList"
-    enum="BookmarkBarState" expires_after="M92">
+    enum="BookmarkBarState" expires_after="M96">
   <owner>corising@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -12712,7 +12712,7 @@
 </histogram>
 
 <histogram name="ReadingList.{ReadStatus}.Count.{Variation}" units="count"
-    expires_after="M92">
+    expires_after="M96">
   <owner>corising@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/histograms_xml/password/histograms.xml b/tools/metrics/histograms/histograms_xml/password/histograms.xml
index 5f4a258..bb0c65a 100644
--- a/tools/metrics/histograms/histograms_xml/password/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/password/histograms.xml
@@ -1403,7 +1403,7 @@
 
 <histogram name="PasswordManager.LeakDetection.AccessTokenFetchStatus"
     enum="GoogleServiceAuthError" expires_after="2021-08-09">
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     Status of an attempted fetch of an access token. Recorded when a token fetch
@@ -1413,7 +1413,7 @@
 
 <histogram name="PasswordManager.LeakDetection.AccessTokenNetErrorCode"
     enum="NetErrorCodes" expires_after="2021-08-09">
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     Net Error Code of a failed attempt to fetch an access token. Recorded when a
@@ -1423,14 +1423,14 @@
 
 <histogram name="PasswordManager.LeakDetection.AnalyzeSingleLeakResponseResult"
     enum="PasswordAnalyzeLeakResponseResult" expires_after="2021-10-10">
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>Result of analyzing a single leak response.</summary>
 </histogram>
 
 <histogram name="PasswordManager.LeakDetection.AnalyzeSingleLeakResponseTime"
     units="ms" expires_after="2021-08-09">
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>The time it took to analyze a single leak lookup response.</summary>
 </histogram>
@@ -1438,7 +1438,7 @@
 <histogram name="PasswordManager.LeakDetection.DialogDismissalReason"
     enum="PasswordLeakDetectionDialogDismissalReason"
     expires_after="2021-10-10">
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     Reason of the dismissal of the leak detection dialog. Recorded when a leaked
@@ -1448,7 +1448,10 @@
 
 <histogram name="PasswordManager.LeakDetection.Enabled" enum="BooleanEnabled"
     expires_after="M92">
-  <owner>jdoerrie@chromium.org</owner>
+  <obsolete>
+    Removed in M92.
+  </obsolete>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     Indicates whether the password manager leak detection feature is enabled.
@@ -1457,8 +1460,8 @@
 </histogram>
 
 <histogram name="PasswordManager.LeakDetection.Error"
-    enum="PasswordLeakDetectionError" expires_after="M92">
-  <owner>jdoerrie@chromium.org</owner>
+    enum="PasswordLeakDetectionError" expires_after="M96">
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     Shows the error that happened in password leak detection on sign-in.
@@ -1467,7 +1470,7 @@
 
 <histogram name="PasswordManager.LeakDetection.HttpResponseCode"
     enum="HttpResponseCode" expires_after="2021-10-10">
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     HTTP response code of a leak lookup request. Only recoded for each network
@@ -1478,7 +1481,7 @@
 <histogram name="PasswordManager.LeakDetection.IsPasswordReused" enum="Boolean"
     expires_after="2021-10-10">
   <owner>vasilii@chromium.org</owner>
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <summary>
     When a password is determined as leaked, records if it's saved for other
     sites.
@@ -1488,7 +1491,7 @@
 <histogram name="PasswordManager.LeakDetection.IsPasswordSaved" enum="Boolean"
     expires_after="2021-10-10">
   <owner>vasilii@chromium.org</owner>
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <summary>
     When a password is determined as leaked, records if it's saved in Chrome.
   </summary>
@@ -1496,8 +1499,11 @@
 
 <histogram name="PasswordManager.LeakDetection.IsSyncing" enum="Boolean"
     expires_after="M92">
+  <obsolete>
+    Removed in M92.
+  </obsolete>
   <owner>vasilii@chromium.org</owner>
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <summary>
     When a password is determined as leaked, records if the user is syncing
     passwords without passphrase.
@@ -1506,7 +1512,7 @@
 
 <histogram name="PasswordManager.LeakDetection.LookupSingleLeakResponseResult"
     enum="PasswordLeakLookupResponseResult" expires_after="2021-10-10">
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     Whether the network fetch succeeded, failed due to network/server errors, or
@@ -1516,7 +1522,10 @@
 
 <histogram name="PasswordManager.LeakDetection.NetErrorCode"
     enum="NetErrorCodes" expires_after="M92">
-  <owner>jdoerrie@chromium.org</owner>
+  <obsolete>
+    Removed in M92.
+  </obsolete>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     Network error code of a leak lookup request. Only recoded for each network
@@ -1526,7 +1535,7 @@
 
 <histogram name="PasswordManager.LeakDetection.NotifyIsLeakedTime" units="ms"
     expires_after="2021-10-10">
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     The time it took from starting a leak check to notifying the user about a
@@ -1536,7 +1545,7 @@
 
 <histogram name="PasswordManager.LeakDetection.ObtainAccessTokenTime"
     units="ms" expires_after="2021-10-10">
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     The time it took to obtain an access token for an authenticated leak lookup
@@ -1546,7 +1555,7 @@
 
 <histogram name="PasswordManager.LeakDetection.PrepareSingleLeakRequestTime"
     units="ms" expires_after="2021-10-10">
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     The time it took to prepare the payload for a single leak lookup request.
@@ -1555,7 +1564,7 @@
 
 <histogram name="PasswordManager.LeakDetection.ReceiveSingleLeakResponseTime"
     units="ms" expires_after="2021-08-09">
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     The time it took to receive a server response after issuing a request for a
@@ -1565,7 +1574,7 @@
 
 <histogram name="PasswordManager.LeakDetection.SingleLeakResponsePrefixes"
     units="prefixes" expires_after="2021-10-10">
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     The number of matched prefixes in a single leak lookup response. Only
@@ -1575,7 +1584,7 @@
 
 <histogram name="PasswordManager.LeakDetection.SingleLeakResponseSize"
     units="bytes" expires_after="2021-10-10">
-  <owner>jdoerrie@chromium.org</owner>
+  <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
     The size of a single leak lookup response in bytes. Only recorded if there
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 6e6f291..ad29a0ba 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -9,8 +9,8 @@
             "remote_path": "perfetto_binaries/trace_processor_shell/mac/7dadfe6bd3985045d21280ebbc9ba336df6dedd9/trace_processor_shell"
         },
         "linux": {
-            "hash": "9451a663ea7eae44eee1db6d62745f05f1069833",
-            "remote_path": "perfetto_binaries/trace_processor_shell/linux/7dadfe6bd3985045d21280ebbc9ba336df6dedd9/trace_processor_shell"
+            "hash": "c73fdfb21f453613380b6fba9dc8611529df11ea",
+            "remote_path": "perfetto_binaries/trace_processor_shell/linux/dd6f2bc226b22086345c7da0ae62bbc3c3ff850a/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/base/ime/win/tsf_text_store.cc b/ui/base/ime/win/tsf_text_store.cc
index 62bc297..0ef319d 100644
--- a/ui/base/ime/win/tsf_text_store.cc
+++ b/ui/base/ime/win/tsf_text_store.cc
@@ -1111,33 +1111,34 @@
   return true;
 }
 
-bool TSFTextStore::TerminateComposition() {
-  TRACE_EVENT0("ime", "TSFTextStore::TerminateComposition");
-  bool terminate_composition_called = false;
-  if (context_ && has_composition_range_) {
-    Microsoft::WRL::ComPtr<ITfContextOwnerCompositionServices> service;
-
-    if (SUCCEEDED(context_->QueryInterface(IID_PPV_ARGS(&service)))) {
-      service->TerminateComposition(nullptr);
-      terminate_composition_called = true;
-    }
-  }
-
+void TSFTextStore::ResetCompositionState() {
   previous_composition_string_.clear();
   previous_composition_start_ = 0;
   previous_composition_selection_range_ = gfx::Range::InvalidRange();
   previous_text_spans_.clear();
 
   string_pending_insertion_.clear();
-  has_composition_range_ = false;
   composition_range_.set_start(0);
   composition_range_.set_end(0);
 
   selection_ = gfx::Range(composition_from_client_.end(),
                           composition_from_client_.end());
   composition_start_ = selection_.end();
+}
 
-  return terminate_composition_called;
+bool TSFTextStore::TerminateComposition() {
+  TRACE_EVENT0("ime", "TSFTextStore::TerminateComposition");
+  if (context_ && has_composition_range_) {
+    Microsoft::WRL::ComPtr<ITfContextOwnerCompositionServices> service;
+
+    if (SUCCEEDED(context_->QueryInterface(IID_PPV_ARGS(&service)))) {
+      service->TerminateComposition(nullptr);
+      has_composition_range_ = false;
+      return true;
+    }
+  }
+
+  return false;
 }
 
 void TSFTextStore::CalculateTextandSelectionDiffAndNotifyIfNeeded() {
@@ -1317,6 +1318,8 @@
 
   TRACE_EVENT0("ime", "TSFTextStore::CancelComposition");
 
+  ResetCompositionState();
+
   return TerminateComposition();
 }
 
@@ -1331,6 +1334,8 @@
   if (!text_input_client_)
     return false;
 
+  ResetCompositionState();
+
   return TerminateComposition();
 }
 
diff --git a/ui/base/ime/win/tsf_text_store.h b/ui/base/ime/win/tsf_text_store.h
index 9e8b9850..7a70069 100644
--- a/ui/base/ime/win/tsf_text_store.h
+++ b/ui/base/ime/win/tsf_text_store.h
@@ -260,6 +260,9 @@
   friend class TSFTextStoreTest;
   friend class TSFTextStoreTestCallback;
 
+  // Reset states tracking the composition in the text store.
+  void ResetCompositionState();
+
   // Terminate an active composition for this text store.
   bool TerminateComposition();
 
diff --git a/ui/base/ime/win/tsf_text_store_unittest.cc b/ui/base/ime/win/tsf_text_store_unittest.cc
index e282507..5b7d7530 100644
--- a/ui/base/ime/win/tsf_text_store_unittest.cc
+++ b/ui/base/ime/win/tsf_text_store_unittest.cc
@@ -375,7 +375,6 @@
     EXPECT_TRUE(text_store_->previous_text_spans_.empty());
 
     EXPECT_TRUE(text_store_->string_pending_insertion_.empty());
-    EXPECT_FALSE(text_store_->has_composition_range_);
     EXPECT_TRUE(text_store_->composition_range_.is_empty());
     EXPECT_EQ(text_store_->composition_from_client_.end(),
               text_store_->selection_.start());
diff --git a/ui/base/prediction/prediction_metrics_handler.cc b/ui/base/prediction/prediction_metrics_handler.cc
index f018624..efd2fbf 100644
--- a/ui/base/prediction/prediction_metrics_handler.cc
+++ b/ui/base/prediction/prediction_metrics_handler.cc
@@ -11,7 +11,7 @@
 
 namespace ui {
 
-PredictionMetricsHandler::PredictionMetricsHandler(const char* histogram_name)
+PredictionMetricsHandler::PredictionMetricsHandler(std::string histogram_name)
     : histogram_name_(std::move(histogram_name)) {}
 PredictionMetricsHandler::~PredictionMetricsHandler() = default;
 
diff --git a/ui/base/prediction/prediction_metrics_handler.h b/ui/base/prediction/prediction_metrics_handler.h
index 24167f5..49c8f2a 100644
--- a/ui/base/prediction/prediction_metrics_handler.h
+++ b/ui/base/prediction/prediction_metrics_handler.h
@@ -6,6 +6,7 @@
 #define UI_BASE_PREDICTION_PREDICTION_METRICS_HANDLER_H_
 
 #include <deque>
+#include <string>
 #include <unordered_map>
 
 #include "base/component_export.h"
@@ -25,7 +26,7 @@
 // few metrics.
 class COMPONENT_EXPORT(UI_BASE_PREDICTION) PredictionMetricsHandler {
  public:
-  explicit PredictionMetricsHandler(const char* histogram_name);
+  explicit PredictionMetricsHandler(std::string histogram_name);
   ~PredictionMetricsHandler();
 
   // Struct used to store predicted and real event information.
@@ -108,7 +109,7 @@
   // names (.OverPrediction, .UnderPrediction, .WrongDirection,
   // .PredictionJitter, .VisualJitter) appended to it when counting the metric
   // in a histogram.
-  const char* const histogram_name_;
+  const std::string histogram_name_;
 };
 
 }  // namespace ui
diff --git a/ui/gfx/android/android_surface_control_compat.cc b/ui/gfx/android/android_surface_control_compat.cc
index d691294..2f0533d4 100644
--- a/ui/gfx/android/android_surface_control_compat.cc
+++ b/ui/gfx/android/android_surface_control_compat.cc
@@ -24,6 +24,8 @@
 typedef struct ASurfaceTransactionStats ASurfaceTransactionStats;
 typedef void (*ASurfaceTransaction_OnComplete)(void* context,
                                                ASurfaceTransactionStats* stats);
+typedef void (*ASurfaceTransaction_OnCommit)(void* context,
+                                             ASurfaceTransactionStats* stats);
 
 // ASurface
 using pASurfaceControl_createFromWindow =
@@ -51,6 +53,9 @@
 using pASurfaceTransaction_apply = int64_t (*)(ASurfaceTransaction*);
 using pASurfaceTransaction_setOnComplete =
     void (*)(ASurfaceTransaction*, void* ctx, ASurfaceTransaction_OnComplete);
+using pASurfaceTransaction_setOnCommit = void (*)(ASurfaceTransaction*,
+                                                  void* ctx,
+                                                  ASurfaceTransaction_OnCommit);
 using pASurfaceTransaction_setVisibility = void (*)(ASurfaceTransaction*,
                                                     ASurfaceControl*,
                                                     int8_t visibility);
@@ -147,6 +152,7 @@
     LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_delete);
     LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_apply);
     LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setOnComplete);
+    LOAD_FUNCTION_MAYBE(main_dl_handle, ASurfaceTransaction_setOnCommit);
     LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_reparent);
     LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setVisibility);
     LOAD_FUNCTION(main_dl_handle, ASurfaceTransaction_setZOrder);
@@ -179,6 +185,7 @@
   pASurfaceTransaction_delete ASurfaceTransaction_deleteFn;
   pASurfaceTransaction_apply ASurfaceTransaction_applyFn;
   pASurfaceTransaction_setOnComplete ASurfaceTransaction_setOnCompleteFn;
+  pASurfaceTransaction_setOnCommit ASurfaceTransaction_setOnCommitFn;
   pASurfaceTransaction_reparent ASurfaceTransaction_reparentFn;
   pASurfaceTransaction_setVisibility ASurfaceTransaction_setVisibilityFn;
   pASurfaceTransaction_setZOrder ASurfaceTransaction_setZOrderFn;
@@ -285,6 +292,7 @@
   int id = 0;
   scoped_refptr<base::SingleThreadTaskRunner> task_runner;
   SurfaceControl::Transaction::OnCompleteCb callback;
+  SurfaceControl::Transaction::OnCommitCb latch_callback;
 };
 
 uint64_t GetTraceIdForTransaction(int transaction_id) {
@@ -294,7 +302,7 @@
 }
 
 // Note that the framework API states that this callback can be dispatched on
-// any thread (in practice it should be the binder thread).
+// any thread (in practice it should be a binder thread).
 void OnTransactionCompletedOnAnyThread(void* context,
                                        ASurfaceTransactionStats* stats) {
   auto* ack_ctx = static_cast<TransactionAckCtx*>(context);
@@ -316,6 +324,24 @@
   delete ack_ctx;
 }
 
+// Note that the framework API states that this callback can be dispatched on
+// any thread (in practice it should be a binder thread).
+void OnTransactiOnCommittedOnAnyThread(void* context,
+                                       ASurfaceTransactionStats* stats) {
+  auto* ack_ctx = static_cast<TransactionAckCtx*>(context);
+  TRACE_EVENT_INSTANT0("gpu,benchmark", "SurfaceControlTransaction committed",
+                       TRACE_EVENT_SCOPE_THREAD);
+
+  if (ack_ctx->task_runner) {
+    ack_ctx->task_runner->PostTask(
+        FROM_HERE, base::BindOnce(std::move(ack_ctx->latch_callback)));
+  } else {
+    std::move(ack_ctx->latch_callback).Run();
+  }
+
+  delete ack_ctx;
+}
+
 }  // namespace
 
 // static
@@ -355,6 +381,12 @@
              nullptr;
 }
 
+bool SurfaceControl::SupportsOnCommit() {
+  return IsSupported() &&
+         SurfaceControlMethods::Get().ASurfaceTransaction_setOnCommitFn !=
+             nullptr;
+}
+
 void SurfaceControl::ApplyTransaction(ASurfaceTransaction* transaction) {
   SurfaceControlMethods::Get().ASurfaceTransaction_applyFn(transaction);
 }
@@ -528,6 +560,18 @@
       transaction_, ack_ctx, &OnTransactionCompletedOnAnyThread);
 }
 
+void SurfaceControl::Transaction::SetOnCommitCb(
+    OnCommitCb cb,
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
+  TransactionAckCtx* ack_ctx = new TransactionAckCtx;
+  ack_ctx->latch_callback = std::move(cb);
+  ack_ctx->task_runner = std::move(task_runner);
+  ack_ctx->id = id_;
+
+  SurfaceControlMethods::Get().ASurfaceTransaction_setOnCommitFn(
+      transaction_, ack_ctx, &OnTransactiOnCommittedOnAnyThread);
+}
+
 void SurfaceControl::Transaction::Apply() {
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("gpu,benchmark",
                                     "SurfaceControlTransaction", id_);
diff --git a/ui/gfx/android/android_surface_control_compat.h b/ui/gfx/android/android_surface_control_compat.h
index 8786720..762c125 100644
--- a/ui/gfx/android/android_surface_control_compat.h
+++ b/ui/gfx/android/android_surface_control_compat.h
@@ -47,6 +47,9 @@
   // Returns true if tagging a surface with a frame rate value is supported.
   static bool SupportsSetFrameRate();
 
+  // Returns true if OnCommit callback is supported.
+  static bool SupportsOnCommit();
+
   // Applies transaction. Used to emulate webview functor interface, where we
   // pass raw ASurfaceTransaction object. For use inside Chromium use
   // Transaction class below instead.
@@ -139,6 +142,10 @@
         OnCompleteCb cb,
         scoped_refptr<base::SingleThreadTaskRunner> task_runner);
 
+    using OnCommitCb = base::OnceClosure;
+    void SetOnCommitCb(OnCommitCb cb,
+                       scoped_refptr<base::SingleThreadTaskRunner> task_runner);
+
     void Apply();
     ASurfaceTransaction* transaction() { return transaction_; }
 
diff --git a/ui/gl/gl_surface_egl_surface_control.cc b/ui/gl/gl_surface_egl_surface_control.cc
index 66a7c37..9116d5a9 100644
--- a/ui/gl/gl_surface_egl_surface_control.cc
+++ b/ui/gl/gl_surface_egl_surface_control.cc
@@ -66,7 +66,8 @@
       root_surface_(
           new gfx::SurfaceControl::Surface(window, root_surface_name_.c_str())),
       transaction_ack_timeout_manager_(task_runner),
-      gpu_task_runner_(std::move(task_runner)) {}
+      gpu_task_runner_(std::move(task_runner)),
+      using_on_commit_callback_(gfx::SurfaceControl::SupportsOnCommit()) {}
 
 GLSurfaceEGLSurfaceControl::~GLSurfaceEGLSurfaceControl() {
   Destroy();
@@ -269,6 +270,14 @@
       std::move(primary_plane_fences_));
   primary_plane_fences_.reset();
   pending_transaction_->SetOnCompleteCb(std::move(callback), gpu_task_runner_);
+
+  if (using_on_commit_callback_) {
+    gfx::SurfaceControl::Transaction::OnCommitCb callback = base::BindOnce(
+        &GLSurfaceEGLSurfaceControl::OnTransactionCommittedOnGpuThread,
+        weak_factory_.GetWeakPtr());
+    pending_transaction_->SetOnCommitCb(std::move(callback), gpu_task_runner_);
+  }
+
   pending_surfaces_count_ = 0u;
   frame_rate_update_pending_ = false;
 
@@ -452,10 +461,7 @@
                "GLSurfaceEGLSurfaceControl::OnTransactionAckOnGpuThread");
 
   DCHECK(gpu_task_runner_->BelongsToCurrentThread());
-  DCHECK(transaction_ack_pending_);
-
   transaction_ack_timeout_manager_.OnTransactionAck();
-  transaction_ack_pending_ = false;
 
   const bool has_context = context_->MakeCurrent(this);
   for (auto& surface_stat : transaction_stats.surface_stats) {
@@ -501,6 +507,23 @@
 
   CheckPendingPresentationCallbacks();
 
+  // If we don't use OnCommit, we advance transaction queue after we received
+  // OnComplete.
+  if (!using_on_commit_callback_)
+    AdvanceTransactionQueue();
+}
+
+void GLSurfaceEGLSurfaceControl::OnTransactionCommittedOnGpuThread() {
+  TRACE_EVENT0("gpu",
+               "GLSurfaceEGLSurfaceControl::OnTransactionCommittedOnGpuThread");
+  DCHECK(using_on_commit_callback_);
+  AdvanceTransactionQueue();
+}
+
+void GLSurfaceEGLSurfaceControl::AdvanceTransactionQueue() {
+  DCHECK(transaction_ack_pending_);
+  transaction_ack_pending_ = false;
+
   if (!pending_transaction_queue_.empty()) {
     transaction_ack_pending_ = true;
     pending_transaction_queue_.front().Apply();
diff --git a/ui/gl/gl_surface_egl_surface_control.h b/ui/gl/gl_surface_egl_surface_control.h
index ba24b4c..eb358e93 100644
--- a/ui/gl/gl_surface_egl_surface_control.h
+++ b/ui/gl/gl_surface_egl_surface_control.h
@@ -188,6 +188,11 @@
       base::Optional<PrimaryPlaneFences> primary_plane_fences,
       gfx::SurfaceControl::TransactionStats transaction_stats);
 
+  // Called on the |gpu_task_runner_| when a transaction is committed by the
+  // framework.
+  void OnTransactionCommittedOnGpuThread();
+
+  void AdvanceTransactionQueue();
   void CheckPendingPresentationCallbacks();
 
   gfx::Rect ApplyDisplayInverse(const gfx::Rect& input) const;
@@ -255,6 +260,9 @@
   bool preserve_children_ = false;
 
   scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner_;
+
+  const bool using_on_commit_callback_;
+
   base::WeakPtrFactory<GLSurfaceEGLSurfaceControl> weak_factory_{this};
 };
 
diff --git a/ui/views/controls/textarea/textarea_unittest.cc b/ui/views/controls/textarea/textarea_unittest.cc
index c5b43a4..b8857f5 100644
--- a/ui/views/controls/textarea/textarea_unittest.cc
+++ b/ui/views/controls/textarea/textarea_unittest.cc
@@ -8,6 +8,7 @@
 #include <string>
 #include <vector>
 
+#include "base/format_macros.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
diff --git a/ui/views/examples/tabbed_pane_example.cc b/ui/views/examples/tabbed_pane_example.cc
index a4b81e0..573b8d3c 100644
--- a/ui/views/examples/tabbed_pane_example.cc
+++ b/ui/views/examples/tabbed_pane_example.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/format_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/views/controls/button/label_button.h"
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index 8a8e584..8bb2131 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -1113,6 +1113,7 @@
   native_theme_observation_.Reset();
   if (native_theme)
     native_theme_observation_.Observe(native_theme);
+  PropagateNativeThemeChanged();
 }
 
 int Widget::GetX() const {
diff --git a/ui/webui/resources/cr_elements/mouse_hoverable_mixin.js b/ui/webui/resources/cr_elements/mouse_hoverable_mixin.js
index 06ddb2c1..e503dd0 100644
--- a/ui/webui/resources/cr_elements/mouse_hoverable_mixin.js
+++ b/ui/webui/resources/cr_elements/mouse_hoverable_mixin.js
@@ -3,52 +3,48 @@
 // found in the LICENSE file.
 
 /**
- * @fileoverview This file provides a mixin and a class to manage a `hovered`
- * style on mouse events. Relies on listening for pointer events as touch
- * devices may fire mouse events too.
+ * @fileoverview This file provides a mixin to manage a `hovered` style on mouse
+ * events. Relies on listening for pointer events as touch devices may fire
+ * mouse events too.
  */
 
-import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {dedupingMixin} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /** @type {string} */
 const HOVERED_STYLE = 'hovered';
 
 /** @interface */
-class AttachableInterface {
-  attach() {}
-}
-
-export const MouseHoverableElementMixin = (superClass) =>
-    class extends superClass {
-  attach() {
-    this.addEventListener('pointerenter', (e) => {
-      const hostElement = /** @type {!Element} */ (e.currentTarget);
-      hostElement.classList.toggle(HOVERED_STYLE, e.pointerType === 'mouse');
-    });
-
-    this.addEventListener('pointerleave', (e) => {
-      if (e.pointerType !== 'mouse') {
-        return;
-      }
-
-      const hostElement = /** @type {!Element} */ (e.currentTarget);
-      hostElement.classList.remove(HOVERED_STYLE);
-    });
-  }
-};
+export class MouseHoverableMixinInterface {}
 
 /**
- * @constructor
- * @extends {PolymerElement}
- * @implements {AttachableInterface}
+ * @polymer
+ * @mixinFunction
  */
-const MouseHoverablePolymerElement = MouseHoverableElementMixin(PolymerElement);
+export const MouseHoverableMixin = dedupingMixin(superClass => {
+  /**
+   * @polymer
+   * @mixinClass
+   * @implements {MouseHoverableMixinInterface}
+   */
+  class MouseHoverableMixin extends superClass {
+    ready() {
+      super.ready();
 
-/** @polymer */
-export class MouseHoverableElement extends MouseHoverablePolymerElement {
-  /** @override */
-  ready() {
-    super.ready();
-    this.attach();
+      this.addEventListener('pointerenter', (e) => {
+        const hostElement = /** @type {!Element} */ (e.currentTarget);
+        hostElement.classList.toggle(HOVERED_STYLE, e.pointerType === 'mouse');
+      });
+
+      this.addEventListener('pointerleave', (e) => {
+        if (e.pointerType !== 'mouse') {
+          return;
+        }
+
+        const hostElement = /** @type {!Element} */ (e.currentTarget);
+        hostElement.classList.remove(HOVERED_STYLE);
+      });
+    }
   }
-}
+
+  return MouseHoverableMixin;
+});
diff --git a/weblayer/app/jni_onload.cc b/weblayer/app/jni_onload.cc
index feb5c96..dbc319d 100644
--- a/weblayer/app/jni_onload.cc
+++ b/weblayer/app/jni_onload.cc
@@ -2,9 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/android/library_loader/library_loader_hooks.h"
-#include "components/version_info/version_info.h"
-#include "components/version_info/version_info_values.h"
 #include "content/public/app/content_jni_onload.h"
 #include "content/public/app/content_main.h"
 #include "weblayer/app/content_main_delegate_impl.h"
@@ -23,8 +20,6 @@
   if (!content::android::OnJNIOnLoadInit())
     return false;
 
-  base::android::SetVersionNumber(version_info::GetVersionNumber().c_str());
-
   weblayer::MainParams params;
   params.delegate = new weblayer::MainDelegateImpl;
 
diff --git a/weblayer/browser/content_browser_client_impl.cc b/weblayer/browser/content_browser_client_impl.cc
index 2e9274a8..ef51e002 100644
--- a/weblayer/browser/content_browser_client_impl.cc
+++ b/weblayer/browser/content_browser_client_impl.cc
@@ -335,7 +335,7 @@
     const GURL& site_for_cookies,
     const base::Optional<url::Origin>& top_frame_origin,
     const std::string& name,
-    const url::Origin& constructor_origin,
+    const storage::StorageKey& storage_key,
     content::BrowserContext* context,
     int render_process_id,
     int render_frame_id) {
diff --git a/weblayer/browser/content_browser_client_impl.h b/weblayer/browser/content_browser_client_impl.h
index 90f47f56..d0b6a97 100644
--- a/weblayer/browser/content_browser_client_impl.h
+++ b/weblayer/browser/content_browser_client_impl.h
@@ -18,6 +18,10 @@
 
 class PrefService;
 
+namespace storage {
+class StorageKey;
+}  // namespace storage
+
 namespace weblayer {
 
 class FeatureListCreator;
@@ -48,7 +52,7 @@
                          const GURL& site_for_cookies,
                          const base::Optional<url::Origin>& top_frame_origin,
                          const std::string& name,
-                         const url::Origin& constructor_origin,
+                         const storage::StorageKey& storage_key,
                          content::BrowserContext* context,
                          int render_process_id,
                          int render_frame_id) override;
diff --git a/weblayer/shell/android/BUILD.gn b/weblayer/shell/android/BUILD.gn
index 53eeeccb..7954399 100644
--- a/weblayer/shell/android/BUILD.gn
+++ b/weblayer/shell/android/BUILD.gn
@@ -263,11 +263,6 @@
 
   product_config_java_packages = [ weblayer_product_config_java_package ]
 
-  native_lib_version_rule = "//build/util:chrome_version_json"
-  _native_lib_file =
-      rebase_path("$root_gen_dir/CHROME_VERSION.json", root_build_dir)
-  native_lib_version_arg = "@FileArg($_native_lib_file:full-quoted)"
-
   shared_libraries = [ "//weblayer:libweblayer_test" ]
 }